おそらく明らかに間違ったことをしているのですが、興味深い問題があるようです。
私の問題は、AAAABBBBCCCC をスタックにプッシュし、標準出力で出力しようとしていることです。ただし、私の x86_64 環境では、 がpush 0x41414141
プッシュされているようです4141414100000000
。
したがって、次のコード ブロック:
global _start
section .text
_start:
push 0x43434343 ; CCCC
push 0x42424242 ; BBBB
push 0x41414141 ; AAAA
xor rax,rax ; Zero RAX
mov byte al,0x1 ; 1 for sys_write
mov rdi,rax ; 1 for stdout
mov rsi,rsp ; RSP for source
mov byte dl,0xC ; 12
syscall
xor rax,rax ; Zero RAX
mov al, 0x3C ; 60 for sys_edxit
cdq ; 0 for clean exit.
syscall
OutputsAAAABBBB
は、たった 8 バイトだと思っていたのですが、実際には私が要求した 12 バイトでした。出力ファイルにパイプしてhexeditで見ると、表示されていることに気付きました414141410000000042424242
.
push
命令が値をプッシュすると思いdword
ます。サイズqword
のスタックに?私はこれを考えるのが正しいですか?
これは、余分なバイトを考慮に入れ、長さを 20 に変更することで簡単に回避できますsys_open
。
だから私の質問は、私は何が間違っているのですか?