environment
1OS・・・Linux 264ビット CPU 3GAS コンパイラ 464ビットプロセスとして実行
s
1.globl main 2main: 3jmp run3 4 5run2: 6movl $4,%eax 7movl $1,%ebx 8pop %rcx 9movl $6,%edx 10int $0x80 11movl $1,%eax 12movl $0,%ebx 13int $0x80 14 15run3: 16 call run2 17.asciz "hello"
ebx や rcxなどなど・・・
64・32ビット長レジスタを使用していますが
私はこれらをすべて8ビット長レジスタに変えたいです。
それができないので教えてください。
x64CPUでも8ビットレジスタは使えるようです。
s
1.globl main 2main: 3jmp run3 4 5run2: 6xor %eax,%eax 7mov $4,%AL 8xor %ebx,%ebx 9mov $1,%bl 10pop %rcx 11xor %edx,%edx 12mov $6,%dl 13int $0x80 14mov $1,%AL 15mov $0,%bl 16int $0x80 17 18run3: 19 call run2 20.asciz "hello"
movlをmovにしたら正常にアセンブルでき実行ファイルを実行させると
しっかり、"hello"が表示されました。
ただ、・・・
上記のなかで
s
1pop %rcx
64ビットレジスタを使っています。表を見ると
cl 8ビットレジスタがあるようですが
使うことができません。
pop命令自体が64ビットでしか使えない?(どっかで聞いた)らしいので
rcxなどの64ビットレジスタしか使うことができないようです。
私はどうしても、clレジスタを使いたいです。
どうやったら、clレジスタに値(リターンアドレス)をpopさせることができるでしょうか?
できれば一つの命令だけですませたいです。
やってみたこと
popで直接8ビットレジスタを使えないならば・・・
s
11 popで、rdx64bitレジスタに値を一旦、避難させる。 22 mov命令で、clレジスタにさっき避難させたrdxレジスタの値を移す。
結果的にだめでした。(というより、64ビットレジスタの内容を8ビットレジスタに移せるものなのか?)
解決方法が分からないので教えてください。
回答1件
あなたの回答
tips
プレビュー