打印数组所有元素的汇编代码

Assembly code that prints all elements of an array

我一直在尝试打印数组的元素。我有这段代码可以对数组的所有元素求和并打印结果,我尝试了很多方法进行编辑,但没有成功。

这是我在网上找到的代码:

    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”并给出 Segmentation fault 错误。

编辑:这是工作代码,谢谢大家,谢谢 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" style 4 表示写入,第一个参数存储在 ebx 中,第二个参数存储在 ecx 中,第三个参数存储在 edx 中。但是想不通。

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

  • 因为 toprint 被定义为 word 你不应该写 dword 值它与指令 mov [toprint], eax.
  • 因为数组元素被定义为 byte 你不应该用指令 mov eax, [edi] ;store current element 将它们读为 dword.
  • 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 给出的评论。这对您的目的非常有用。