代码是:
.global asm0
asm0:
push ebp
mov ebp,esp
mov eax,DWORD PTR [ebp+0x8]
mov ebx,DWORD PTR [ebp+0xc]
mov eax,ebx
mov esp,ebp
pop ebp
条目是:asm0(0x2a,0x4f)
输出为:0x4f2a
为什么输入参数反了?
代码是:
.global asm0
asm0:
push ebp
mov ebp,esp
mov eax,DWORD PTR [ebp+0x8]
mov ebx,DWORD PTR [ebp+0xc]
mov eax,ebx
mov esp,ebp
pop ebp
条目是:asm0(0x2a,0x4f)
输出为:0x4f2a
为什么输入参数反了?
调用约定:
您可能指的是调用约定和推送参数的顺序。如果是这样,这里是一个答案地址。您可以在此处阅读有关一般调用约定的更多信息。
字节序:
您可能也有兴趣从 NASM 文档中阅读有关字节顺序的信息:
3.4.3 字符常量
字符常量由最多 8 个字节长的字符串组成,用于表达式上下文。它被视为一个整数。
超过一个字节的字符常量将按照小端顺序排列:如果你编码
mov eax,'abcd'那么生成的常量不是 0x61626364,而是 0x64636261,因此如果您当时将该值存储到内存中,它将读取 abcd 而不是 dcba。这也是奔腾的CPUID指令所理解的字符常量的意义。
来源: https : //www.nasm.us/doc/nasmdoc3.html
通过阅读有关字节顺序的主题,可以代表您进行更多研究以更好地理解这一点。当您第一次遇到它时会感到困惑,但是有很多像这样的图表可以帮助证明它:
图片来源:https : //agilescientific.com/blog/2017/3/31/little-endian-is-legal
最后,有一个来自 OpenSecurityTraining 的优秀视频,它很好地解释了参数/参数的字节序和顺序以及调用约定。单击此处查看。