我需要对文件进行加密算法,但是我必须处理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
答案 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。