Assembly 小endian和推进nasm
我不明白为什么代码的输出是Ole。小端点不应该影响push命令吗Assembly 小endian和推进nasm,assembly,x86,nasm,endianness,Assembly,X86,Nasm,Endianness,我不明白为什么代码的输出是Ole。小端点不应该影响push命令吗 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 d
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
谢谢。堆栈向下生长:
推之前:
****
****
**** <--- ESP
堆栈向下增长:
推之前:
****
****
**** <--- ESP
请记住,“小端数”(或大端数)适用于多字节数。“hello world”不会“向后”存储在内存中。同样,堆栈“向下增长”,即push
减少esp
——内存不会因为在堆栈上而“颠倒”
Nasm语法的一个相关(?)奇怪之处是,字符常量被假定为按照您编写它们的顺序。例如,如果您搜索环境变量,Nasm会期望:
其他汇编器可能会期望:
cmp dword ptr[esi],“EMOH”
当您将一个汇编程序的语法“转换”为另一个汇编程序的语法时,这通常是一个问题。请记住,“小尾端”(或大尾端)适用于多字节数。“hello world”不会“向后”存储在内存中。同样,堆栈“向下增长”,即push
减少esp
——内存不会因为在堆栈上而“颠倒”
Nasm语法的一个相关(?)奇怪之处是,字符常量被假定为按照您编写它们的顺序。例如,如果您搜索环境变量,Nasm会期望:
其他汇编器可能会期望:
cmp dword ptr[esi],“EMOH”
当你从一个汇编程序的语法“翻译”到另一个汇编程序的语法时,主要是一个问题。问题的最后一部分有什么意义?寄存器
ebx
、ecx
和edx
包含write(2)
系统调用的参数。@Kerrek SB。抱歉,修正了。问题的最后一部分有什么意义?寄存器ebx
、ecx
和edx
包含write(2)
系统调用的参数。@Kerrek SB。对不起,修好了。
cmp dword [esi], 'HOME'
cmp dword ptr [esi], 'EMOH'