【问题标题】:Array Input, Output数组输入、输出
【发布时间】:2013-02-14 18:29:06
【问题描述】:

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

    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 提前谢谢

【问题讨论】:

    标签: assembly assemblies nasm


    【解决方案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;
    

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

    【讨论】:

    • Anton Kovalenko:尊敬的先生,我尝试按照您的建议修复代码。(请参阅上面重新编辑的代码)。但输出仍然显示 4 3 2。
    • 在没有任何创造性思维的情况下复制代码从第 1 部分到第 2 部分,逐字有什么难的?你用 3 初始化 ECX,然后递减 ecx,dec ecx; jg.. 大致相当于你以前的loop。相反,您应该从xor ecx, ecx 开始,然后是inc ecx,然后是cmp ecx,4jne lp1 -- 完全是,就像在第一个循环中所做的那样。
    • 请不要以使问题和答案对未来读者毫无意义的方式重新编辑代码。如果您有新问题,请发布新问题。如果一切正常,只需将有问题的代码保留原样,这样就很清楚问题出在哪里以及如何解决了。这就是我回滚您上次编辑的原因。
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2012-12-14
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多