如何在Assembly x86中一次读取32位?

时间:2014-12-15 16:04:05

标签: assembly fread

我必须从二进制打开的文件中一次读取4个字符,因此我可以应用带有双重定义变量的XOR。我以二进制读取方式打开文件,当我应用XOR时,它会更改每个字节。我认为我的程序实际上需要一个转弯处的每个字节,而不是4字节块。我怎么能一次读取4个?

buffer dd 0    
rmode db "rb",0    
rfilename db "input.txt"   
key dd 0Ah
.....................................................................
;open the file    
    push offset rmode
    push offset rfilename
    call fopen
    add esp ,8

    push eax
    push 1
    push 1
    push offset buffer
read_loop:
    call fread    
    test eax,eax    
    jz close_file       

    MOV ebx,key
    XOR buffer,eax
 ............................................

输入

 0123

我明白了:

:;89

但它应该是

0129

1 个答案:

答案 0 :(得分:1)

我至少可以看到几个问题。

一般来说,当你打电话时,你必须推动然后忘记"数据。您可以针对fopen来电,但不能fread

然后以某种方式你想要读取4个字节,但是push 1作为大小...你可能希望push 4作为大小而push 1作为项目数。这样你就可以保持简单的test eax,eax来打破循环(尽管这样你就不会检查错误:即eax = -1)。这个:

read_loop:       ; <- move loop here
  push eax
  push 1
  push 4         ; <- use 4 to read 4 bytes
  push offset buffer
  call fread
  add esp, 16    ; <- forget the push'es
  test eax,eax
  jz close_file

接下来,您获得ebx中的密钥,然后使用xor

执行eax
MOV ebx,key
XOR buffer,eax   ; <- shouldn't this be ebx?

由于fread会返回大小,因此使用xor执行eax肯定是错误的。

旁注:fread如果文件中只剩下1,2或3位数,则会失败。您可以通过交换push 1push 4来规避这一点,然后检查返回值以了解读取了多少字符......这样做的工作量更多了!