второй и третий элементы файлового буфера всегда 0 - PullRequest
0 голосов
/ 11 октября 2011

У меня есть код NASM, который читает файл (имя файла хранится в переменной адреса) и вычисляет CRC5. Он берет каждый байт файла и запускает его через процедуру вычисления. Я наблюдаю странное поведение:
если я устанавливаю точку останова после mov [curr], ebx для каждой переменной curr 2-й и 3-й итерации, равной 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 голосов
/ 11 октября 2011

Конечно ...

Вы используете dd декларацию для address dd "test.cpp", 0 вместо db (или dw , если вы используете widechar).

...