【问题标题】:What is EXTRN in Intel-syntax assembly?英特尔语法汇编中的 EXTRN 是什么?
【发布时间】:2021-02-06 10:23:38
【问题描述】:

x86 CPU:MSVC (2010)

EXTRN _printf:PROC 在下面的代码中是什么意思,为什么在“:”之后我们使用一些“PROC”指令而不是“near”或“far”?

CONST   SEGMENT 
$SG3830 DB     'hello, world', 0AH, 00H 
CONST   ENDS 
PUBLIC  _main 
EXTRN   _printf:PROC  <- what is this funct?!
_TEXT   SEGMENT 
_main   PROC 
        push   ebp 
        mov    ebp,    esp 
        push   OFFSET  $SG3830 
        call   _printf 
        add    esp,    4 
        xor    eax,    eax 
        pop    ebp 
        ret    0 
_main   ENDP 
_TEXT   ENDS

【问题讨论】:

  • 你读过汇编手册吗?它说了什么?如果您需要进一步的帮助,我需要知道您正在使用哪个特定的汇编程序进行编程。
  • @fuz 如果你愿意的话,刚刚编辑了问题。其实我认为任何基于 Intel 的编译器都是一样的,所以没有提及。
  • @Deno 汇编器与编译器不同。确保不要混淆他们。请注意,有许多汇编程序使用类似 Intel 的语法。其中之一是 MASM,MSVC 附带的汇编程序。还有其他流行的汇编程序,如 nasm、fasm 和 yasm。
  • 也感谢 4 提供的信息。下次问之前,我会考虑如何使汇编程序合格。直到现在还想知道为什么人们不明白.. ????

标签: assembly x86 masm cl intel-syntax


【解决方案1】:

您似乎正在阅读 Dennis Yurichev 的《初学者逆向工程》。在 32 位 FLAT 模型中,所有内容都被视为 NEAR 指针(在 4Gib 地址空间内)。 NEAR/FAR 的概念适用于 DOS 程序的分段地址模型。您正在查找的代码是来自 MSVC 编译器 (CL) 的 32 位 Windows 控制台程序的汇编代码。

EXTRN 仅表示与符号存在外部链接,该符号是最终将链接到的其他模块/库/对象中的函数/PROCedure。如果没有 EXTRN 指令,call _printf 将产生错误,因为当前程序集文件中没有定义 _printf 函数。

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2016-01-12
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多