比较 x86 程序集中的两个字符串

Compare two strings in x86 assembly

我想在 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 

在 HLA(高级程序集)中:更多关于 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