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。
该函数print_int打印出的值eax。在您的代码中,您仅通过以下分配链分配给eax(aka al)四个字节中的最低字节:bl-> cl-> al。的其余三个字节eax未初始化。您的代码将继承例程开始时这三个字节中的任何值。这就是为什么你会垃圾。
您必须初始化所有使用的寄存器和存储器位置。
我的x86程序集有点生锈,但是我很确定没有一条指令会将所有通用寄存器都设置为零。如果您愿意,可以编写一个宏来为您执行此操作。
| 归档时间: |
|
| 查看次数: |
2906 次 |
| 最近记录: |