我不明白为什么代码的输出是 Ole 。不应该有少量字节序影响推送命令吗?
global _start
section .data
x: dd 3
section .text
_start:
mov eax, 4
mov ebx, 1
mov dword[x], 0x0a656c4f
push dword[x]
mov ecx, esp
mov edx, 4
int 0x80
mov eax,1
mov ebx, 0
int 0x80
如果我在 mov dword [x],0x0a656c4f 之后得到它,那么内存布局是:
0a (higher)
65
6c
4f (lower)
因为x86的字节序很少而x指向字节,其值为 4f 。 在推dword [x] 之后,堆叠的图片相同(向下反转),其中 esp 指向 0a
同样的问题与
时的代码有关 mov dword[x], 0x0a656c4f
push dword[x]
替换为:
push dword 0x0a656c4f
感谢。
答案 0 :(得分:1)
堆栈向下:
推前:
****
****
**** <--- ESP
push DWORD 0x0a656c4f
之后:
****
****
**** -+
0x0A |
0x65 ^
0x6C |
0x4F <--- ESP -+- write(2) four bytes from here
答案 1 :(得分:0)
请记住,“little endian”(或大端)适用于多字节数字。 “hello world”不会在内存中“向后”存储。同样,在push
减少esp
的意义上,堆栈“向下增长” - 内存不是“倒置”,只是因为它在堆栈上。
与Nasm语法相关的(?)奇怪的是假设字符常量按照你写的顺序排列。例如,如果您正在搜索环境变量,Nasm会期望:
cmp dword [esi], 'HOME'
Other assemblers might expect:
cmp dword [esi], 'HOME'
当你从一个汇编程序的语法“翻译”到另一个汇编程序的语法时,通常会出现问题...