打印数组

时间:2015-05-05 15:37:54

标签: assembly x86

我一直在尝试打印数组的元素。我已经得到了这个代码,它汇总了一个数组的所有元素并打印出结果,我试图以很多方式进行编辑而没有运气。

以下是我在互联网上找到的代码:

    section .text
    global _start   ;must be declared for linker (ld)
_start: 

      mov  eax,3      ;number bytes to be summed 
      mov  ebx,0      ;EBX will store the sum
      mov  ecx, x     ;ECX will point to the current element to be summed
top:  add  ebx, [ecx]
      add  ecx,1      ;move pointer to next element
      dec  eax        ;decrement counter
      jnz  top        ;if counter not 0, then loop again
done: 
      add   ebx, '0'
      mov  [sum], ebx ;done, store result in "sum"
display:
      mov  edx,1      ;message length
      mov  ecx, sum   ;message to write
      mov  ebx, 1     ;file descriptor (stdout)
      mov  eax, 4     ;system call number (sys_write)
      int  0x80       ;call kernel
      mov  eax, 1     ;system call number (sys_exit)
      int  0x80       ;call kernel

section .data
global x
x:    
      db  2
      db  4
      db  3
sum: 
      db  0

这是我如何编辑它没有运气(我尝试了很多其他的东西)。这打印出第一个元素' 2'并给出分段错误错误。

编辑:这是工作代码,谢谢大家,感谢ElderBug! :)

_start: 

      mov  esi,3      ;number bytes to be traversed 
      mov  edi, x     ;EDI will point to the current element to be summed
      mov  eax, 0     ;eax will hold the text to print

top:  

      mov eax, [edi] ;store current element
      add  edi,1      ;move pointer to next element

      add  eax, '0' ;do the conversion
      mov [toprint], eax


      mov  ecx, toprint ;message to write
      mov  edx,1      ;message length
      mov  ebx, 1     ;file descriptor (stdout)
      mov  eax, 4     ;system call number (sys_write)
      int  0x80       ;call kernel



      dec  esi        ;decrement counter
      jnz  top        ;if counter not 0, then loop again

      mov  eax, 1     ;system call number (sys_exit)
      int  0x80       ;call kernel



   section  .data
    global x
    x:    
          db  2
          db  4
          db  3

   toprint:

         dw 'x'

我知道" int 0x80"样式4表示写入,第一个参数存储在ebx中,第二个存储在ecx中,第三个参数存储在edx中。但无法解决这个问题。

1 个答案:

答案 0 :(得分:2)

您所说的解决方案仍然存在严重问题!

  • 由于 toprint 被定义为,因此您不应使用指令mov [toprint], eax在其中写入 dword 值。< / LI>
  • 由于数组元素定义为 byte ,因此您不应将其作为 dword 读取,并使用mov eax, [edi] ;store current element指令。
  • sys_exit使用EBX作为第二个参数。

它应该是这样的样子

top:  
 mov al, [edi]     ;store current element
 add edi, 1        ;move pointer to next element
 add al, '0'       ;do the conversion
 mov [toprint], al

请研究@David C. Rankin给出的评论。它对你的目的非常有用。