2015-05-30 4 views
0

Я пытаюсь прочитать символы из входного файла и поместить их в массив (кроме новых строковых символов).Назначение значений массиву - сборка

вот мой код:

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: 

печать внутри цикла работает отлично, так как я получаю номер обугленного, полукокс я только что прочитал и полукокс в [ESI + счетчик] (предполагается, состояние [счетчик]).

однако, пытаясь напечатать его после цикла чтения, с этим кодом:

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.

просто мои данные и ПБС:

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

Ну ...

Прежде всего, не следует использовать 32-разрядные регистры при работе на байт. Я уверен, что даже если ваш код работал, некоторые данные были бы перезаписаны.

Я считаю, что ваша проблема находится где-то в высказываниях, подобных этим

mov [esi + counter], edx 
... 
push dword [esi + counter] 

Они на самом деле означает: «взять адрес счетчика и добавить его в ЭРИ», который я думаю, что это не то, что вы хотите.

Onto это, - чтение файла посимвольно ужасно неэффективен - с помощью счетчика переменных вместо ECX неэффективна - увеличивающиеся регистр, а не место в памяти iself неэффективна слишком

Я пытался переписывайте свой код столько, сколько я мог, и я надеюсь, что это того стоило.

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 
+0

Почему, если байт не является новой линией, я должен прыгнуть обратно в петлю? это символы, которые я хочу прочитать. Кроме того, я знаю, что файл содержит только пробелы, те и новые строки. Я попробую это, спасибо –

+0

Кстати, размер не столько, сколько нужно читать, но сколько писать, разве это имеет значение? –

+0

Вы выписываете только те, что вы читали, поскольку вышеприведенный код заменяет новые строки пробелами. – user35443

0

Проблема решена. я должен использовать это, чтобы поместить символ в массиве:

put_char: 
mov dl, [read_char] 
mov [esi], dl 

mov eax, [counter] 
inc eax 
mov [counter], eax 
inc esi 

jmp loop 

Я снял печать, это были только для отладки.

Спасибо :)

+1

В любом случае, помните, что вы можете напрямую использовать 'inc dword [counter]'. – user35443

Смежные вопросы