为数组赋值 - 程序集

时间:2015-05-30 14:07:02

标签: arrays assembly

我正在尝试从输入文件中读取字符,并将它们放在一个数组中(新行字符除外)。

这是我的代码:

    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], 0printarray之间没有代码。

仅仅是我的数据和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

感谢您的帮助。

2 个答案:

答案 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

我删除了打印,仅用于调试。

谢谢:)