我想读取用户的3个数字,我把它们存储在一个数组,然后我告诉他们在NASM使用保罗·卡特功能这里是我的代码:打印整数NASM
%include "asm_io.inc"
SECTION .bss
tab resb 3
SECTION .data
msg db "Un nombre :",10
SECTION .text
global main
main:
mov esi,tab
xor ecx,ecx
get_data:
mov eax,msg
call print_string
call read_int
mov [esi+ecx],eax
inc ecx
cmp ecx,3
jne get_data
call print_nl
xor ecx,ecx
mov edi,tab
print_data:
mov eax,[edi+ecx]
call print_int
inc ecx
cmp ecx,3
jne print_data
mov eax,1 ; exit code
int 0x80 ; call exit
的问题是即不执行print_data循环并退出。
你只保留3个字节'tab'。如果你想要3个dword,你应该使用'resd 3'而不是'resb 3',并且你应该在每次迭代结束时将ecx增加4而不是1。另外,我没有介绍'asm_io.inc'中的函数是如何实现的,但'ecx'通常是一个_caller-saved_寄存器,这意味着您不应该依赖它来保持函数调用的值。你的'msg'字符串也似乎缺少一个NUL终止字节。 – Michael
我已经修改了程序,正如你所说的那样,期望'ecx'寄存器不被这些函数使用,但它仍然跳过该循环。 –
它不能跳过循环。但也许它不会打印你想看到的结果。顺便说一下,读取asm代码非常困难,没有来自编写它的人的评论。当你在代码中添加更改时,更新你问题中的代码。除此之外,你需要描述你所调用的功能实际上是做什么的。 – Blechdose