2017-01-03 1 views
-1

Je souhaite comparer deux chaînes en assemblage x86. L'un d'eux est lu à partir d'un fichier et l'autre est lu sur le clavier et les deux sont enregistrés dans une variable.Comparer deux chaînes en assemblage x86

Je n'ai aucune idée de comment comparer ces deux variables. Je serai tellement excité si quelqu'un me donnait un exemple ou quelque chose qui pourrait m'aider.

.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

Pour comparer chaînes, utilisez 'rep cmpsb'. – fuz

+0

Où sont les variables de chaîne que vous voulez comparer? La seule chaîne que je vois est "nume_fisier" (parce que c'est le type 'db 20 dup'). –

+0

Vous avez raison. J'avais tort dans la déclaration. J'ai besoin de comparer fpass avec pass et fuser avec l'utilisateur. – Ral

Répondre

1

HLA (Assemblée de haut niveau): plus sur http://www.plantation-productions.com/Webster/www.artofasm.com/Linux/HTML/StringInstructions.html

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

De manière plus classique:

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

Cette syntaxe n'est pas standard. Apparemment, il fait partie du langage HLA de Randy Hyde. Cela pourrait être très déroutant pour quelqu'un qui essaie d'apprendre l'assemblage x86! –

+2

Mettant de côté que je sache ou non que l'apprentissage d'une langue subtilement différente va réellement vous aider à apprendre la langue que vous voulez apprendre rapidement, cela ne constitue pas une très bonne réponse à cette question. –

+2

'cmp ecx, 0' - erreur ici. ceci produit un mauvais résultat si différent seulement dans le dernier symbole. besoin juste de 'je strings_are_equal' après' repe cmpsb' – RbMm