2017-01-03 20 views
-1

x86アセンブリの2つの文字列を比較します。そのうちの1つはファイルから読み込まれ、もう1つはキーボードから読み込まれ、両方が変数に保存されます。x86アセンブリの2つの文字列を比較します。

これら2つの変数を比較する方法はわかりません。もし誰かが私に助けてくれる事例を与えたら、私はとても興奮しています。

.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:HLA(高レベルのアセンブリ)で

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

:より古典的な方法で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(); 

の詳細'rep cmpsb'を使用してください。 – fuz

+0

比較する文字列変数はどこにありますか?私が見る唯一の文字列は "nume_fisier"です(db 20 dup型です)。 –

+0

あなたは正しいです。私は宣言で間違っていた。私はpassとfuserをuserと比較する必要があります。 – Ral

答えて

1

:比較するの

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

関連する問題