【发布时间】:2015-01-14 19:09:26
【问题描述】:
我正在尝试从用户那里读取 3 个数字并将它们存储在一个数组中,然后我使用 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 循环并退出。
【问题讨论】:
-
您只为
tab保留了 3 个字节。如果你想要 3 个双字,你应该使用resd 3而不是resb 3,并且你应该在每次迭代结束时将ecx增加 4 而不是 1。另外,我不知道asm_io.inc中的函数是如何实现的,但ecx通常是一个 caller-saved 寄存器,这意味着你不应该依赖它来保持它的值跨越函数调用。您的msg字符串似乎也缺少 NUL 终止符字节。 -
我已经按照你所说的修改了程序,期望这些函数没有使用
ecx寄存器,但它仍然跳过了那个循环 -
不能跳过循环。但也许它没有打印你想看到的结果。顺便说一句,如果没有编写它的人的 cmets,很难阅读 asm 代码。当您对代码添加更改时,请更新您问题中的代码。除此之外,您还需要描述您正在调用的函数实际执行的操作。