首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >call immediate与call dword near [dword addr]

call immediate与call dword near [dword addr]
EN

Stack Overflow用户
提问于 2011-08-19 22:27:09
回答 1查看 449关注 0票数 1

所以最近我一直想从汇编中调用一些win32调用,并且我一直在使用NASM作为我的外部汇编程序。我在我的代码中以如下方式调用SendMessage

代码语言:javascript
复制
call __imp__SendMessageW@16

这被组装成相对跳转(0xE8操作码),结果是访问冲突。在调试器中,计算的跳转偏移量似乎是正确的(因为__imp__SendMessageW@16似乎确实驻留在那里),但尽管如此,它仍然不起作用。当我从C++调用函数时,检查Visual Studio生成的程序集时,我注意到它使用的不是相对直接的跳转,而是(在MASM语言中) call dword ptr [__imp__SendMessageW@16],对应于0xFF15操作码。经过一番摸索之后,我发现NASM语法将其编码为call dword near [dword __imp__SendMessageW@16],并使我的代码突然生效。

我的问题是,为什么其中一个有效,而另一个无效?有没有一些代码的重新定位导致相对直接的调用跳到了不友好的地方?我从来不是一个汇编程序员,但我的印象总是两个调用应该做同样的事情,主要的区别是一个是位置独立的,另一个不是(假设它们将IP移动到相同的位置)。考虑到这一点,代码重定位理论是有意义的,但是您如何解释调试器显示正确的地址呢?

另外:此调用中[]语法背后的逻辑是什么?偏移量仍然是一个立即数(只是在0xFF15之后立即进行了少许endian编码),除了指令提取之外,这里没有进行内存访问(我倾向于将[]视为lea上下文之外的解引用)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-19 22:30:45

代码语言:javascript
复制
call dword[__imp__SendMessageW@16]

API是您的导入部分的地址,其中包含_imp_SendMessageW@16函数的地址。使用方括号表示尊重(调用此地址存储的地址)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7123045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档