2017-01-03 1 views
-1

x86 어셈블리의 두 문자열을 비교하고 싶습니다. 그 중 하나는 파일에서 읽히고 다른 하나는 키보드에서 읽히고 둘 다 변수에 저장됩니다.x86 어셈블리의 두 문자열 비교

이 두 변수를 비교하는 방법을 모릅니다. 누군가가 나에게 도움이 될 수있는 모범을 줄 수 있다면 나는 너무 흥분 할 것이다.

.386 
.model flat, stdcall 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

includelib msvcrt.lib 
include Macro.asm 

extern exit: proc 
extern printf:proc 
extern scanf:proc 
extern strlen:proc 
extern fscanf:proc 
extern fopen:proc 
extern fprintf:proc 
extern fclose:proc 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

public start 


.data 
format_sir db "%s", 0 
format_afisare db "%s", 0 
format_zecimal db "&d", 0 
mod_citire db "r",0 
mod_scriere db "w",0 
pointer_fisier_sursa dd 0 
pointer_fisier_destinatie dd 0 
nume_fisier db 20 dup(0) 
fpass db 20 dup(0) 
fuser db 20 dup(0) 
user db 20 dup(0) 
pass db 20 dup(0) 


.code 
start: 


    ;read file name 
    citire_fisier: 
    push offset nume_fisier 
    push offset format_sir 
    call scanf 
    add esp,8 


    ;open the file in read mode 
    deschide_fisier_citire nume_fisier, mod_citire, pointer_fisier_sursa 

    cmp pointer_fisier_sursa,0 
    jne citire_user_parola 
    jmp citire_fisier 



    citire_user_parola: 
    ;read from file 
    Push offset fuser 
    Push offset format_sir 
    Push pointer_fisier_sursa 
    Call fscanf 
    Add esp,12 

    push offset fpass 
    push offset format_sir 
    push pointer_fisier_sursa 
    call fscanf 
    add esp,12 

    ;read from keyboard 
    push offset user 
    push offset format_sir 
    call scanf 
    add esp,8 

    push offset pass 
    push offset format_sir 
    call scanf 
    add esp,8 

Macro.asm :

deschide_fisier_citire macro nume_fisier, mod_deschidere, pointer_fisier_sursa 

    push offset mod_deschidere 
    push offset nume_fisier 
    call fopen 
    mov pointer_fisier_sursa ,eax 
    add esp,8 
endm 


inchidere_fisier macro pointer_fisier_sursa 

    push pointer_fisier_sursa 
    call fclose 
    add esp,4 
endm 
+2

하는 것은 비교하기 문자열은'rep cmpsb'를 사용하십시오. – fuz

+0

비교할 문자열 변수는 어디에 있습니까? 내가 본 유일한 문자열은 "nume_fisier"입니다 (db 20 dup 형식이기 때문에). –

+0

당신 말이 맞아요. 나는 선언에서 틀렸다. 패스와 퓨저를 사용자와 비교해 볼 필요가 있습니다. – Ral

답변

1

HLA (High Level의 조립)에서 자세한 좀 더 고전적인 방법으로

cld(); 
mov(AdrsString1, esi); 
mov(AdrsString2, edi); 
mov(7, ecx);  # 7 is the length of the comparison ie size of strings 
repe.cmpsb();  

http://www.plantation-productions.com/Webster/www.artofasm.com/Linux/HTML/StringInstructions.html에 :

mov ecx,7  
cld   
mov esi, offset [stringA] 
mov edi, offset [stringB] 
repe cmpsb  
cmp ecx,0 
je strings_are_equal 
+2

이것은 비표준 구문입니다. 그것은 분명히 랜디 하이드의 HLA 언어의 일부입니다. 실제로 x86 어셈블리를 배우려는 사람에게 혼란을 줄 수 있습니다! –

+2

미묘하게 다른 언어를 배우는 것이 실제로 배우고 자하는 언어를 배우는 데 실제로 도움이 될 것이라는 점에 동의하는지 여부를 제쳐 놓고,이 질문에 대한 매우 좋은 대답을하지는 않습니다. –

+2

'cmp ecx, 0' - 여기에 오류가 있습니다. 이것은 마지막 심볼에서만 다른 경우 잘못된 결과를 산출합니다. 'repeat cmpsb' 다음에'je strings_are_equal'이 필요합니다. – RbMm