子例程在写入 10 字节内存缓冲区时int_to_string
运行良好(请参阅此处),但在我将其修改为写入字符串后输出一个奇怪的结果。
只有单位的数字是正确的(1
)。
这里有什么问题?
; sum of array elements (integers)
; and write to console
section .text
global _start
_start:
mov eax, 0
mov ebx, array
mov ecx, lena
loop:
cmp ecx, 0
je print
add eax, [ebx]
add ebx, 4
sub ecx, 1
jmp loop
print:
; convert integer to string
mov esi, msg
call int_to_string
; call write syscall
mov edx, lenmsg ; length of the string
mov ecx, msg ; address of the string
mov ebx, 1 ; file descriptor, in this case stdout
mov eax, 4 ; syscall number for write
int 0x80
; call exit syscall
mov eax, 1
int 0x80
; Input:
; eax = integer value to convert
; esi = pointer to string to store the digit characters
int_to_string:
add esi, lenmsg-2
mov ebx, 10
.next_digit:
xor edx, edx ; clear edx prior to dividing edx:eax by ebx
div ebx ; eax /= 10
add dl, '0' ; convert the remainder to ASCII
dec esi ; store characters in reverse order
mov [esi], dl ;
test eax, eax
jnz .next_digit ; repeat until eax==0
ret
section .data
array dd 10, 20, 30, 40, 501
lena: equ $-array ; length of array
msg db "The sum is .", 0xA
lenmsg: equ $-msg ; length of msg
您的loop
每次都会将 ecx 递减 1,因此 ecx 应该使用元素计数进行初始化。 但是你用lena
初始化它,这是一个字节数,即太大 4 倍。 所以你在总和中增加了一大堆额外的垃圾。
一种解决方法是将mov ecx, lena
替换为mov ecx, lena / 4
。