2017-01-03 7 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

Вы правы. Я был неправ в декларации. Мне нужно сравнить fpass с pass и fuser с пользователем. – Ral

ответ

1

В HLA (High Level Ассамблеи): больше 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();  

В более классическим способом:

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' - ошибка здесь. это порождает неправильный результат, если он отличается только от последнего символа. нужно просто 'je strings_are_equal' после' repeat cmpsb' – RbMm