繁体   English   中英

我是否必须在从 C 调用的汇编代码中初始化 CPU 寄存器?

[英]Do I have to initialize the CPU registers in assembly code that is called from C?

我正在阅读 Paul Carter 的pcasm书。 它使用 NASM,一个调用我的汇编代码的 C 驱动程序应用程序,以及一个可以轻松在汇编中执行基本 I/O 的配套库。

这是我将从 C 调用的函数的样子:

segment .text
    global  _asm_main
_asm_main:
    enter   0,0               ; setup routine
    pusha

    mov bx, 0034h   ; bx = 52 (stored in 16 bits)
    mov cl, bl      ; cl = lower 8-bits of bx
    mov eax, ecx
    call print_int

    popa
    mov     eax, 0            ; return back to C
    leave                     
    ret

print_int函数将eax的值存储打印为整数。 但这会将垃圾打印到标准输出:

4200244

如果我在使用之前用mov ecx, 0000hecx寄存器初始化为 0,我将得到预期的输出:

52

是否总是需要初始化,如果需要,是否有一种从 C 或 NASM 将所有寄存器初始化为 0(或用户定义的初始化程序)的快速方法?

我使用的是 XP32、MinGW 4.4.0 和 NASM 2.09.04。

函数print_int打印出eax的值。 在您的代码中,您只能通过以下分配链分配给eax (又名al )的四个字节中最低的一个: bl -> cl -> al eax的其余三个字节未初始化。 您的代码继承了例程开始时这三个字节中发生的任何值。 这就是你得到垃圾的原因。

您必须初始化您使用的所有寄存器和内存位置。

我的 x86 程序集有点生疏,但我很确定没有一条指令可以将所有通用寄存器设置为零。 如果您愿意,您可能会编写一个宏来为您执行此操作。

是的,这是必需的。

在组装中,没有什么是为你做的。
你必须按照你想要的方式初始化每个寄存器。

暂无
暂无

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

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