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

And*_*vić 4 c assembly initialization nasm cpu-registers

我读保罗·卡特的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
Run Code Online (Sandbox Code Playgroud)

print_int函数eax以整数形式打印值存储。但这会将垃圾输出到stdout:

4200244
Run Code Online (Sandbox Code Playgroud)

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

52
Run Code Online (Sandbox Code Playgroud)

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

我正在使用XP32,MinGW 4.4.0和NASM 2.09.04。

NPE*_*NPE 5

该函数print_int打印出的值eax。在您的代码中,您仅通过以下分配链分配给eax(aka al)四个字节中的最低字节:bl-> cl-> al。的其余三个字节eax未初始化。您的代码将继承例程开始时这三个字节中的任何值。这就是为什么你会垃圾。

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

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