数组输入,输出

时间:2013-02-14 18:29:06

标签: assembly assemblies nasm

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

    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

1 个答案:

答案 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;

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