[英]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, 0000h
将ecx寄存器初始化为 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.