我一直在尝试打印数组的元素。我已经得到了这个代码,它汇总了一个数组的所有元素并打印出结果,我试图以很多方式进行编辑而没有运气。
以下是我在互联网上找到的代码:
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中。但无法解决这个问题。
答案 0 :(得分:2)
您所说的解决方案仍然存在严重问题!
mov [toprint], eax
在其中写入 dword 值。< / LI>
mov eax, [edi] ;store current element
指令。它应该是这样的样子
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给出的评论。它对你的目的非常有用。