英特尔语法汇编中的 EXTRN 是什么?

What is EXTRN in Intel-syntax assembly?

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

您似乎正在阅读 Dennis Yurichev 的 Reverse Engineering for Beginners。在 32 位 FLAT 模型中,所有内容都被视为 NEAR 指针(在 4Gib 地址 space 内)。 NEAR/FAR 的概念适用于诸如 DOS 程序的分段地址模型之类的东西。您正在查看的代码是来自 MSVC 编译器 (CL) 的 32 位 Windows 控制台程序的汇编代码。

EXTRN 只是意味着有一个符号的外部链接,它是一个函数/PROCedure 在一些其他 module/library/object 中最终将被链接到.如果没有 EXTRN 指令,call _printf 将产生错误,因为 _printf 函数未在当前程序集文件中定义。