2011-10-07 79 views
0

我設法構建了用於處理文件的NASM教程代碼。它將文件的內容輸出到stdout中,但是當我嘗試訪問數據緩衝區時,它只包含零。例如,在中間循環下面的代碼中,EBX始終設置爲0,當它包含文件字節時。nasm中的文件讀取緩衝區爲空

section .data 
    bufsize dw  1024 

section .bss 
    buf  resb 1024 


section .text    ; declaring our .text segment 
    global _start   ; telling where program execution should start 

_start:      ; this is where code starts getting exec'ed 

    ; get the filename in ebx 
    pop ebx    ; argc 
    pop ebx    ; argv[0] 
    pop ebx    ; the first real arg, a filename 

    ; open the file 
    mov eax, 5   ; open(
    mov ecx, 0   ; read-only mode 
    int 80h    ;); 

    ; read the file 
    mov  eax, 3   ; read(
    mov  ebx, eax  ; file_descriptor, 
    mov  ecx, buf  ; *buf, 
    mov  edx, bufsize ; *bufsize 
    int  80h    ;); 

    mov ecx, 20 
loop: 
    mov eax, 20 
    sub eax, ecx 
    mov ebx, [buf+eax*4] 
    loop loop  

    ; write to STDOUT 
    mov  eax, 4   ; write(
    mov  ebx, 1   ; STDOUT, 
    mov  ecx, buf  ; *buf 
    int  80h    ;); 

    ; exit 
    mov eax, 1   ; exit(
    mov ebx, 0   ; 0 
    int 80h    ;); 
+0

偉大的評論風格! – divinci

回答

1

例如在中間環EBX下面的代碼總是被設置爲0,當它應該包含文件的字節。

你是如何確定的? (一個調試器下運行,也許?)

你的代碼中有一個不幸的錯誤:

; read the file 
    mov  eax, 3   ; read(
    mov  ebx, eax  ; file_descriptor, 

你覆蓋EAX(其中包含由系統調用open返回的文件描述符,如果open成功)與值3,在它被移動到EBX作爲read的文件描述符參數之前。

通常情況下,一個進程將開始了文件描述符0,1和分配2 stdinstdoutstderr,且第一個文件的描述符,明確open將是3,那麼你會用它跑了!

但是如果你使用調試器運行,你可能不那麼幸運。文件描述符3可能是別的東西,而read可能會失敗(你不檢查,看看如果返回的值是一個負的錯誤代碼),或讀一些完全出乎意料......

+0

好吧,我明白了。現在讀取返回正值,但buf再次不包含字符數據。 – bvk256

+0

由於這個答案解決了這個問題http://stackoverflow.com/questions/5803301/printing-character-from-register我加載一個DWORD到ebx中並掩蓋額外的位來創建一個字節。 – bvk256

+0

此外,'bufsize'被聲明爲'dw' - 你想'dd' ...和'[bufsize]'來訪問它的值。 –