2015-09-27 2 views
0

Я хочу читать и отображать содержимое текстового файла с помощью системных вызовов nasm и Linux. Мой текстовый файл называется «new.txt». Я написал следующий код и не получаю никакого вывода на терминале.Как читать и отображать содержимое текстового файла в nasm?

section .data 
    line db "This is George,", 
     db " and his first line.", 0xa, 0 
    len equ $ - line 
    line2 db "This is line number 2.", 0xa, 0 
    len2 equ $ - line2 
filename: db 'ThisIsATestFile.txt', 0 

section .bss 
    bssbuf: resb len ;any int will do here, even 0, 
    file: resb 4  ;since pointer is allocated anyway 

global _start 
section .text 
_start: 
; open file in read-only mode 

    mov eax, 5  ;sys_open file with fd in ebx 
    mov ebx, filename  ;file to be opened 
    mov ecx, 0  ;O_RDONLY 
    int 80h 

    cmp eax, 0  ;check if fd in eax > 0 (ok) 
    jbe error  ;can not open file 

    mov ebx, eax  ;store new (!) fd of the same file 

; read from file into bss data buffer 

    mov eax, 3  ;sys_read 
    mov ecx, bssbuf  ;pointer to destination buffer 
    mov edx, len  ;length of data to be read 
    int 80h 
    js error  ;file is open but cannot be read 

    cmp eax, len  ;check number of bytes read 
    jb close  ;must close file first 

; write bss data buffer to stderr 

    mov eax, 4  ;sys_write 
    push ebx  ;save fd on stack for sys_close 
    mov ebx, 2  ;fd of stderr which is unbuffered 
    mov ecx, bssbuf  ;pointer to buffer with data 
    mov edx, len  ;length of data to be written 
    int 80h 

    pop ebx   ;restore fd in ebx from stack 

close: 
    mov eax, 6 ;sys_close file 
    int 80h 

    mov eax, 1 ;sys_exit 
    mov ebx, 0 ;ok 
    int 80h 

error: 
    mov ebx, eax ;exit code 
    mov eax, 1 ;sys_exit 
    int 80h 

ответ

0

Когда вы пишете

jb close  ;must close file first 

вы, по сути, являются прыжки закрыть, не называя его.

После того, как вы достигнете близко, вы просто выйти после закрытия файла:

close: 
    mov eax, 6 ;sys_close file 
    int 80h 

    mov eax, 1 ;sys_exit 
    mov ebx, 0 ;ok 
    int 80h 

Может быть, вы хотите либо call близко каким-то образом (а затем ret с близкого расстояния) или переходить туда, где вы были продолжай, что делаешь?

Кроме того, имейте в виду, что jbe является беззнаковое сравнение, поэтому, когда вы пишете:

cmp eax, 0  ;check if fd in eax > 0 (ok) 
jbe error  ;can not open file 

Вы на самом деле не обнаружит отрицательные числа. Вместо этого рассмотрите jle. (Вы можете обратиться к this handy resource о скачках к использованию.)

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