汇编变量声明含义

时间:2014-01-24 14:12:11

标签: assembly

我想知道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

2 个答案:

答案 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”变量的数据段。

相关问题