nasm文件缓冲区的第二个和第三个元素始终为0

时间:2011-10-10 20:14:33

标签: linux assembly x86 nasm

我有一个NASM代码,它读取一个文件(存储在地址变量中的文件名)并计算CRC5。它占用文件的每个字节并通过计算例程运行它。我正在观察一种奇怪的行为:
如果我在mov [curr], ebx每隔第二次和第三次迭代curr变量设置为0后设置断点,则所有其他迭代都会生成正确的字符。无论我打开哪个文本文件,都会发生这种情况。

SECTION .data   
table dd 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1
address dd "test.cpp", 0
crc dd 0,0,0,0,0,10
size dw 8192

section .bss
doinvert: resb 1    
buf     resb    8192
curr    resb 1


    SECTION .text       
        global main     
main:   
    mov ebx, address

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

    mov     ebx,  eax       ;   file_descriptor,
        mov     eax,  3         ; read(     
        mov     ecx,  buf       ;   *buf,
        mov     edx,  size     ;   *bufsize
        int     80h             ; );
    mov [size], eax

    mov ecx, [size]
loop_outer:
    mov eax, [size]
    sub eax, ecx
    mov ebx, [buf+eax]
    and ebx, 0ffh ; filter out extra bytes
    mov [curr], ebx
    push ecx
    mov ecx, 8
    jmp loop1
near_jump:
    jmp loop_outer

loop1:      
    mov eax, 8
    sub eax, ecx
    mov ebx, [table+eax*4]
    mov eax, [curr]
    and ebx, eax
    cmp ebx, 0
    je skip
    mov ebx, 1
skip:   
    mov eax, [crc+4*4]
    xor ebx, eax
    mov [doinvert], ebx
    mov ebx, [crc+3*4]
    mov [crc+4*4], ebx
    mov ebx,  [crc+2*4]
    mov eax, [doinvert]
    xor ebx, eax
    mov [crc+3*4], ebx
    mov ebx, [crc+1*4]
    mov [crc+2*4], ebx
    mov ebx, [crc]
    mov [crc+1*4], ebx
    mov ebx, [doinvert]
    mov [crc], ebx

    loop loop1 
    pop ecx     
    loop near_jump 

    mov ebx,0       
    mov eax,1       
    int 0x80

更奇怪的是,如果我将上面的代码减少到下面的代码,则会正确迭代。

SECTION .data   
table dd 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1
address dd "test.cpp", 0
crc dd 0,0,0,0,0,10
size dw 8192

section .bss
doinvert: resb 1    
buf     resb    8192
curr    resb 1


    SECTION .text       
        global main     
main:   
    mov ebx, address

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

    mov     ebx,  eax       ;   file_descriptor,
        mov     eax,  3         ; read(     
        mov     ecx,  buf       ;   *buf,
        mov     edx,  size     ;   *bufsize
        int     80h             ; );
    mov [size], eax

    mov ecx, [size]
loop_outer:
    mov eax, [size]
    sub eax, ecx
    mov ebx, [buf+eax]
    and ebx, 0ffh
    mov [curr], ebx

    loop loop_outer 

    mov ebx,0       
    mov eax,1       
    int 0x80

1 个答案:

答案 0 :(得分:0)

...不确定

您正在使用 dd 声明代替 db (或 dw ,如果您使用的是widechar)。