次の短いプログラムを検討してください。Segfault on movq命令ですか?
int main(){
asm("movq 0x5F5E100, %rcx;"
"startofloop: ; "
"sub 0x1, %rcx; "
"jne startofloop; ");
}
このプログラムは罰金コンパイルし、それが実行されたとき、それは最初のmovq
命令にセグメンテーションフォールト。
私は明白なものを紛失しているはずですが、ここの誰かが私にそれを指摘してくれることを願っています。
私はDebian 8でカーネル3.16.0-4-amd64を実行しています。
将来参照するために、これはコンパイラが生成したものです。
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
#APP
# 2 "asm_fail.c" 1
movq 0x5F5E100, %rcx;startofloop: ; sub 0x1, %rcx; jne startofloop;
# 0 "" 2
#NO_APP
私はアセンブリについてほとんど何も知らない。しかし、値0x5F5E100を%rcxにコピーして、それを実現せずにオペランドを入れ替えたいと思ったのでしょうか? – andre
あなたの質問にコンパイラ生成のアセンブリコード( '-S'でコンパイル)を追加してください。 – user3386109