【发布时间】:2015-04-28 11:01:27
【问题描述】:
我有这个用 x64 汇编编写的小程序:
xor rdx,rdx
push rdx ;null terminator
push 0x41414141 ;AAAA
push 0x45454545 ;EEEE
mov rsi,rsp ;pointer to the string
mov rdi,1 ;output file: stdout
mov rdx,8 ;buffer size 8
mov rax,1 ;write syscall
syscall
如您所见,我将 8 个字节压入堆栈,当我调用缓冲区大小为 8 的写入时,我希望看到 EEEEAAAA,但输出为 EEEE。但是,当我将缓冲区大小 rdx 设置为 12 时,我可以看到完整的字符串 EEEEAAAA。那些四字节块之间是什么?他们不应该是相邻的吗?
【问题讨论】:
-
检查这一点——您不能在 x64 模式下推送 32 位常量或寄存器——仅支持 16 位和 64 位操作数大小。 stackoverflow.com/questions/13351363/push-on-64bit-intel-osx