Nasm x86-32 :将字节写入字符串



子例程在写入 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

相关内容

  • 没有找到相关文章

最新更新