我的程序将使用数组从用户获取数字作为输入,并将在监视器上打印数字。期望我的程序的输入和输出如下:
i/p: 1 2 3 4
o/p: 1 2 3 4
但我的程序以这种方式提供输出,不包括数字:
o/p: 4 3 2
我的计划如下:
section .data
msg db "%d"
four dd 4
msga db "%d",10,0
section .bss
arr resd 4
section .text
global main
extern printf,scanf
main:
xor ecx,ecx
lp:
mov ebx,arr
mov eax,ecx
mul dword[four]
add ebx,eax
pusha
push ebx
push msg
call scanf
add esp,8
popa
inc ecx
cmp ecx,4
jnz lp
mov ecx,3
lp1:
mov ebx,arr
mov eax,ecx
mul dword[four]
add ebx,eax
pusha
push dword[ebx]
push msga
call printf
add esp,8
popa
dec ecx
jg lp1
你会在这个节目中给我建议吗?我正在使用ubuntu 11.04 提前THanx
答案 0 :(得分:1)
在第一个循环中,ecx
从低于4的0变为
xor ecx,ecx ;;; ecx <= 0
lp:
...
inc ecx ;;; ecx <= ecx + 1
cmp ecx, 4
jnz lp ;;; if (ecx!=4) goto lp;
在第二个循环中,ecx
从3 downto 0更改,但不包括 0:
xor ecx, ecx ;;; ecx <= 0, useless here
mov ecx, 3 ;;; ecx <= 3, overwrites 0
lp1:
...
loop lp1 ;;; ecx <= ecx-1; if (ecx>0) goto lp1;
如果要以相同的顺序打印相同的数组,可以重新组织第二个循环,使其与第一个循环完全相同。只需将我引用的第二个循环中的内容替换为第一个循环的相应部分。