我想知道var_10 = dword ptr -10h是什么意思? 我知道这意味着我有一个指向双字变量的指针, 但-10h是什么意思(地址怎么可能减去)? 代码是:
main proc near
var_10 = dword ptr -10h
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 10h
mov eax, offset aHelloWorld ; "hello, world"
mov [esp+10h+var_10], eax
call _printf
mov eax, 0
leave
retn
main endp
答案 0 :(得分:3)
dword ptr
和-10h
的组合确实很奇怪。前者建议一个地址,后者是位移或偏移。在您发布的代码中,var_10
仅使用一次:
mov [esp+10h+var_10], eax
我想汇编程序会把它扩展为:
mov dword ptr [esp + 10h - 10h], eax
等同于:
mov dword ptr [esp], eax
所以,这种组合似乎有些意义,只是单个组件很奇怪。
这个特定函数处理堆栈的方式令人费解。特别是这些说明:
and esp, 0FFFFFFF0h
sub esp, 10h
在堆栈上分配一个16字节的块,与16字节的最接近的倍数对齐(可能牺牲一小部分堆栈空间来到达那里)。
在这个16字节的块中,我们用一个指向'hello world'字符串的指针填充顶部dword(即最接近堆栈新顶部的4个字节):
mov eax, offset aHelloWorld
mov [esp+10h+var_10], eax
16字节块中的其他12个字节保持未初始化;他们很可能充满随机垃圾。
最后,我们调用_printf
,它显然发现字符串指针是堆栈上的第一个参数。那个电话应该没问题。
在实践中,您也可以这样做:
mov eax, offset aHelloWorld
push eax
call _printf
您发布的功能似乎完全准备好充分利用128位架构。怪异。
我最好的猜测:此代码已生成;不是手写的。
答案 1 :(得分:0)
我没有意见发表评论,所以我将此作为解决方案。我相当肯定你可以直接寻址并且不需要寄存器(即ebp)来寻址。如果我错了,有人会纠正我,但我认为-10h指的是代码加载的相对段,数据段,代码段或其他段的偏移量为-10h。有人告诉我,我是否走在正确的轨道上? 您似乎缺少的代码是包含db“hello world”变量的数据段。