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

标签 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

最佳答案

当然...

您正在使用 dd 声明 address dd "test.cpp", 0 而不是 db(如果您使用的是 Widechar,则使用 dw)。

关于linux - nasm 文件缓冲区的第二个和第三个元素始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7718134/

相关文章:

c - 如何从 shell 触发内核模块?

assembly - 为什么我的引导加载程序的堆栈段位于 0x3FF(实模式 IVT 的末尾)?

assembly - 如何从 Asm 中的 xmm 寄存器中提取单个字节?

algorithm - 在程序集中查找子字符串

assembly - 以 1ms 为增量获取时间

linux - 在 linux mint 中运行汇编程序时需要帮助

c - 如何知道进程是父进程还是子进程

linux - 在ksh或bash中解析并查找具有UID的进程信息

linux - bash 函数的正确语法作为 .bashrc 中的别名

caching - 为什么需要单独的 icache 和 dcache