0

我有一些汇编代码从文件中读取 4 个字节并将它们存储在堆栈中,然后将这 4 个字节显示到标准输出,代码工作正常但是当我使用 gdb 查看代码在做什么并试图找到那些 4堆栈上的字节我找不到它们..

(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 回答