我有一个 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/