0

我的程序将使用数组从用户那里获取数字作为输入,并将在监视器上打印数字。所以期待我的程序的输入和输出如下:

    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

4

1 回答 1

1

在第一个循环中,ecx从 0 变为 4:

 xor ecx,ecx ;;; ecx <= 0
lp:
 ...
 inc ecx ;;; ecx <= ecx + 1
 cmp ecx, 4
 jnz lp ;;;  if (ecx!=4) goto lp;

在第二个循环中,ecx从 3 变为 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;

如果您想以相同的顺序打印相同的数组,您可以重新组织第二个循环以使其与第一个循环完全相同。只需将我在此处引用的第二个循环中的内容替换为第一个循环的相应部分即可。

于 2013-02-14T18:36:27.137 回答