我正在尝试从输入文件中读取字符,并将它们放在一个数组中(新行字符除外)。
这是我的代码:
mov dword [counter], 0
mov edi, [size]
loop:
mov esi, state
cmp [counter], edi ; read all chars of the file
je end_loop
pushad
mov eax, 3
mov ebx, dword [file_desc]
mov ecx, read_char
mov edx, 1
int 0x80
popad
cmp byte [read_char], '1'
je put_char
cmp byte [read_char], ' '
je put_char
jmp loop
put_char:
mov edx, [read_char]
mov [esi + counter], edx
;; print number of char read from 0 to size-1
pushad
mov ecx, dword [counter]
push ecx
push printInt
call printf
add esp, 8
popad
;; print char read
pushad
push edx
push printChar
call printf
add esp, 8
popad
;; print value stored in state[counter]
pushad
push dword [esi + counter]
push printChar
call printf
add esp, 8
popad
mov eax, [counter]
inc eax
mov [counter], eax
jmp loop
end_loop:
循环内部的打印工作正常,因为我得到了char号,我刚读过的char和[esi + counter]中的char(应该是状态[counter])。
但是,尝试在读取循环后打印它,使用以下代码:
mov dword [counter], 0
mov edi, [size]
printarray:
mov esi, state
cmp [counter], edi
je end
pushad
push dword [esi + counter]
push printChar
call printf
add esp, 8
popad
pushad
mov ecx, [counter]
inc ecx
mov [counter], ecx
popad
jmp printarray
end:
我得到的只是空白(每行都有新的字符行,来自我的printChar)。
我不明白我读到的值没有存储在数组中。
在end loop
循环之前,mov dword [counter], 0
和printarray
之间没有代码。
仅仅是我的数据和bss:
section .data
newLine: DB "", 10, 0
printInt: DB "%d", 10, 0
printString: DB "%s", 10, 0
printChar: DB "%c", 10, 0
hello: DB "hello", 10, 0
section .bss
file_name resb 80
file_desc resd 1
WorldLength resd 1
WorldWidth resd 1
generations resd 1
print_freq resd 1
state resb 60*60
read_char resb 1
counter resd 1
size resd 1
感谢您的帮助。
答案 0 :(得分:0)
嗯...
首先,在操作字节时不要使用32位寄存器。我确信即使您的代码有效,也会覆盖一些数据。
我相信你的问题存在于类似于这些
的陈述中mov [esi + counter], edx
...
push dword [esi + counter]
他们的意思是:"拿出计数器的地址并将其添加到esi",我认为这不是你想要的。
在此之上, - 逐个字符地读取文件是非常低效的 - 使用计数器变量而不是ecx是低效的 - 增加寄存器而不是内存位置也是无效的
我试图尽可能多地重写你的代码,我希望它值得一试。
mov eax, 3
mov ebx, dword [file_desc]
mov ecx, state
mov edx, [size]
int 0x80
; eax now contains the number of bytes read, so why not to use it?
mov ebx, eax
add ebx, state
mov byte [ebx], 0x0 ; this will be end-of-string, although it may not really be necessary
xor ecx, ecx ; this will be our counter now
_loop: ; loop is actually an instruction
cmp ecx, eax
je _end
inc ecx ; ecx++
mov dl, '\n'
cmp byte [state + ecx], dl ; is newline?
jne _loop ; nope? ok, try again
mov dl, ' ' ; yes?
mov byte [state + ecx], dl ; replace newline with space character
jmp _loop
_end:
; print the result
mov edx, eax ; the size - number of bytes read
mov eax, 4
mov ebx, dword [file_desc]
mov ecx, state
int 0x80
答案 1 :(得分:0)
问题解决了。 我应该用它来将char放在数组中:
put_char:
mov dl, [read_char]
mov [esi], dl
mov eax, [counter]
inc eax
mov [counter], eax
inc esi
jmp loop
我删除了打印,仅用于调试。
谢谢:)