在 Assembly x86 中打印数组
Print array in Asembly x86
我在堆栈中加载了元素,我需要将它们移动到数组中。我的代码如下所示:
%include "asm_io.inc"
segment .data
array db 100 dup(0)
length db 0
segment .text
global _asm_main
extern getchar
_asm_main:
enter 0, 0
pusha
call getchar
char_loop:
mov ebx,10
sub eax, '0'
mul ebx
mov ebx, eax
call getchar
sub eax, '0'
add eax, ebx
push eax
inc BYTE[length]
call getchar
cmp eax, 10
je fill_array
cmp eax, 13
je fill_array
cmp eax, 32
je skip_spaces
jmp char_loop
skip_spaces:
call getchar
cmp eax, 32
je skip_spaces
jmp char_loop
fill_array:
mov ecx, [length]
mov ebx, array
l1:
pop eax
mov [ebx], eax ; should be al instead of eax
inc ebx
call print_int
call print_nl
loop l1
print_array:
mov ecx, [length]
mov ebx, array
l2:
mov eax, [ebx] ; should be al instead of eax
call print_int
call print_nl
inc ebx
loop l2
_asm_end:
call print_nl
popa
mov eax, 0
leave
ret
print_int
在 asm_io.asm 中是
print_int:
enter 0,0
pusha
pushf
push eax
push dword int_format
call _printf
pop ecx
pop ecx
popf
popa
leave
ret
其中 int_format
是 int_format db "%i",0
堆栈中的长度和值是正确的,我打印了它们但是当我尝试打印数组时只有最后一个值是正确的。其他值是随机数。我尝试了不同大小的寄存器组合,但没有用。我认为该错误必须与寄存器大小或数组大小有关。
在这里回答:
正如 @xiver77 在评论中所说,我正在写入数组 4 个字节而不是 1 个字节。数组中的一个元素有 1 个字节,我试图写 4 个字节。这会造成溢出并改变数组中的其他元素。相反 mov [ebx], eax
应该是 mov [ebx], al
和 mov eax, [ebx]
打印应该是 mov al [ebx]
.
我在堆栈中加载了元素,我需要将它们移动到数组中。我的代码如下所示:
%include "asm_io.inc"
segment .data
array db 100 dup(0)
length db 0
segment .text
global _asm_main
extern getchar
_asm_main:
enter 0, 0
pusha
call getchar
char_loop:
mov ebx,10
sub eax, '0'
mul ebx
mov ebx, eax
call getchar
sub eax, '0'
add eax, ebx
push eax
inc BYTE[length]
call getchar
cmp eax, 10
je fill_array
cmp eax, 13
je fill_array
cmp eax, 32
je skip_spaces
jmp char_loop
skip_spaces:
call getchar
cmp eax, 32
je skip_spaces
jmp char_loop
fill_array:
mov ecx, [length]
mov ebx, array
l1:
pop eax
mov [ebx], eax ; should be al instead of eax
inc ebx
call print_int
call print_nl
loop l1
print_array:
mov ecx, [length]
mov ebx, array
l2:
mov eax, [ebx] ; should be al instead of eax
call print_int
call print_nl
inc ebx
loop l2
_asm_end:
call print_nl
popa
mov eax, 0
leave
ret
print_int
在 asm_io.asm 中是
print_int:
enter 0,0
pusha
pushf
push eax
push dword int_format
call _printf
pop ecx
pop ecx
popf
popa
leave
ret
其中 int_format
是 int_format db "%i",0
堆栈中的长度和值是正确的,我打印了它们但是当我尝试打印数组时只有最后一个值是正确的。其他值是随机数。我尝试了不同大小的寄存器组合,但没有用。我认为该错误必须与寄存器大小或数组大小有关。
在这里回答:
正如 @xiver77 在评论中所说,我正在写入数组 4 个字节而不是 1 个字节。数组中的一个元素有 1 个字节,我试图写 4 个字节。这会造成溢出并改变数组中的其他元素。相反 mov [ebx], eax
应该是 mov [ebx], al
和 mov eax, [ebx]
打印应该是 mov al [ebx]
.