如何从文件中读取10个字节的块并在汇编中显示它们?

时间:2014-12-28 19:37:48

标签: assembly masm

我需要对文件进行加密算法,但是我必须处理10个字节的块,我看到当我只是读取块并显示它时我的程序崩溃。我检查了调试器,我注意到了程序只形成前10位块,然后程序不做任何事情。 谁能帮我?我在MASM工作。 这是代码:

.386
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
includelib msvcrt.lib
extern printf: proc
extern scanf: proc
extern fscanf: proc
extern fprintf: proc
extern fopen: proc
extern fclose: proc
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data
  scanf_format db "%d",0
  printf_format db "%c",0
  error_format db "Error!", 0 
  ascii db 0 
  type_read db "r",0
  type_write db "w", 0
  nume_destination db "destinatie.txt",0
  fscanf_format db "%c",0 
  fprintf_format db "%c",0
  mesaj_start db "The path to the source file :",0
  nume_source dd 0 
  nume_source_format db "%s", 0
  pointer_source dd 0
  pointer_destination dd 0

  array db 10 dup(0)
  lungArray equ 9

  rotireCheie dd 0
  numarPasi dd 0
  pas dd 0
  sfarsitSource dd 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
.code

start:
    xor eax,eax
    ; The path to the source file
    push offset mesaj_start
    call printf
    add esp,4
    ; read the source file name
    push  offset nume_source
    push offset nume_source_format
    call scanf
    add esp,8
    ; open source file
    push offset type_read
    push offset nume_source
    call fopen
    add esp,8
    mov pointer_source,eax 
    ; test if the file exists 
    cmp pointer_source,0
    je eroare

    ; create the destination file 
    push offset type_write
    push offset nume_destination
    call fopen
    mov pointer_destination,eax 
    add esp,8

lea esi,array   
mov pas,esi

bucla3: 
       mov esi,pas
       xor edi,edi
       mov edi,esi
       add edi,9
       dec esi
     eticheta_for_0_9:
          push offset ascii
          push offset fscanf_format
          push pointer_source
          call fscanf
          add esp,12
          mov sfarsitSource,eax
          cmp sfarsitSource,0ffffffffH
          je afisare_bloc      
          xor ebx,ebx
          mov bl,ascii
          inc esi
          mov [esi],ebx
          cmp esi,edi
          jbe eticheta_for_0_9
         ;display the blocks
        mov sfarsitSource,eax 
        mov pas,esi
        inc pas     
        xor edi,edi
        xor esi,esi
        lea ESI, array
        mov ecx,10
        dec esi
       afisare_bloc:
         inc esi
         xor edx,edx
         mov dl,[esi]
         ;push [esi]
         push edx
         push offset fprintf_format
         push pointer_destination
         call fprintf
         add esp,12
         cmp esi,ecx
         jne afisare_bloc
       cmp sfarsitSource,0ffffffffH
       jne bucla3 
jmp continua

ends :
         push 0
         call exit

continua: push pointer_source
          call fclose
          add esp,4
          push pointer_destination
          call fclose
          add esp,4
          jmp ends
eroare: push offset error_format
        call printf
        jmp ends    

end start

1 个答案:

答案 0 :(得分:1)

lea esi,array   
mov pas,esi
bucla3:  

您需要将标签放在最上面。

cmp esi,edi
jbe eticheta_for_0_9  

你做了1次迭代太多了!使用jb

cmp esi,ecx
jne afisare_bloc  

您认为这是如何工作的? ESI是地址,ECX是数字10。