2011-10-10 41 views
0

我有一個NASM代碼,它讀取一個文件(存儲在地址變量中的文件名)並計算CRC5。它佔用一個文件的每個字節並通過計算例程運行它。我觀察到一個奇怪的行爲:
如果我設置斷點後mov [curr], ebx每第2和第3迭代curr變量設置爲0,所有其他迭代產生正確的字符。無論我打開的文本文件如何,都會發生這種情況。nasm文件緩衝區的第二和第三個元素始終爲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 

回答

0

當然...

您正在使用DD聲明address dd "test.cpp", 0代替分貝(或DW如果您使用的widechar)。

相關問題