繁体   English   中英

在程序集中调用过程时是否需要使用括号?

[英]Do I need to use brackets when calling a procedure in Assembly?

我刚刚开始学习汇编(x86 NASM),目前正在学习函数调用。 无论我在互联网上的什么地方,我都看到每个人都像这样调用函数:

call power

其中power是功能开始的标签。 但是我想看到的是如何在Assembly 中打印一些东西,有趣的是,在上面的例子中调用一个函数似乎不起作用。 我们将使用 C 中的printf函数。假设我已经在我的程序中使用了extern printfimport printf msvcrt.dll (所以我实际上可以使用printf ),还说我已经在我的数据段中定义了一个符号msg db "Hello World", 0现在我正在尝试打印此消息。 如果我这样做:

push dword msg
call printf

什么都没有发生,它不起作用。 我不知道为什么。 但是,如果我这样做:

push dword msg
call [printf]

该消息按预期打印。

这对我来说没有多大意义,因为我阅读的所有文章都只使用标签,没有括号。 当我们使用call指令执行跳转到该标签时,仅使用标签对我来说也很有意义,所以我们需要标签的地址。 但在这里,我完全不明白为什么我们要使用括号以及究竟发生了什么。 我的意思是,什么是[printf]以及[power]是什么,例如我在问题开始时提出的示例。 然而,尽管我很困惑,但这是有效的,我最初使用的方法不起作用。

你能告诉我具体是怎么回事吗? (PS:如果有任何区别,我正在使用 Olly Debugger)

这取决于程序集中的“printf”是什么。 如果它是一个函数指针(也就是某个函数的地址存储在名为“printf”的地址中),那么你需要括号 []。 如果“printf”是一个函数,也就是说,如果机器码存储在你的汇编程序调用“printf”的地址,那么你一定不要加括号(否则你可能会以分段错误告终,作为第一个“printf”的 64 位机器代码中的 32 位可能不会意外地包含可执行代码的地址)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM