gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:27:39 24 4
gpt4 key购买 nike

我正在阅读 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-aleax 的剩余三个字节未初始化。您的代码继承了例程开始时这三个字节中的任何值。这就是你得到垃圾的原因。

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

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

关于c - 我是否必须在从 C 调用的汇编代码中初始化 CPU 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5031951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com