0

ファイルから 4 バイトを読み取ってスタックに格納し、それらの 4 バイトを stdout に表示するアセンブリ コードがいくつかあります。スタック上のバ​​イトが見つかりません..

(gdb) p $esp                                                                  
$1 = (void *) 0xbffff6bc                                                            
(gdb) x/4 $esp                                                                                     
0xbffff6bc: 0 1 0 -1073743777                         

ファイルの最初の 4 バイトは次のとおりです。

cat nummers.txt|od -c
0000000   3  \n   1  \n   2  \n   3  \n
0000010

コード:

%macro write 2
    mov eax,4       ; write syscall
    mov ebx,STDOUT  ; stdout
    mov edx,%2      ; number of bytes
    mov ecx,%1      ; buffer
    int 80h     ; call kernel
%endmacro

section .data   
    filename    db 'nummers.txt' ; just use lenth of string
    filename_len    equ $-filename   ; here we use a constant
    STDOUT      equ 1    ; stdout

section .bss
    buffer      resb 4
section .text
global _start   
    _start:

    ;; read first byte from file to know how many elements there are
    mov eax,5       ; syscall open
    mov ebx,filename    ; filename
    mov ecx,0       ; read-only
    int 80h     ; call kernel

    sub esp,4       ; subtract 4 bytes from stack.
    mov eax,3       ; syscall read
    mov ebx,eax     ; file descriptor
    mov ecx,esp         ; location for storing 4 bytes
    mov edx,4       ; read 4 bytes
    int 80h     ; call the kernel

    mov eax,4
    mov ebx,STDOUT
    mov ecx,esp
    mov edx,4
    int 80h
    call ret        
    ret:    
    mov eax,1
    mov ebx,1
    int 80h

助けてくれてありがとう!!

4

1 に答える 1

2

この短いアセンブラー プログラムでさえ、可能な最大のエラー カウントにほぼ到達します。ファイル名は 0 バイトで終了しません。オープンコールの結果をチェックしていません。ファイルサイズが 8 のときに 4 バイトを読み取ろうとしています。最後に、値が変更されていないことを期待して、esp を再利用しています。

于 2012-12-30T21:04:54.010 に答える