Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 比较x86程序集中的两个字符串_String_Assembly_X86_String Comparison - Fatal编程技术网

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

String 比较x86程序集中的两个字符串,string,assembly,x86,string-comparison,String,Assembly,X86,String Comparison,我想比较x86汇编中的两个字符串。其中一个从文件读取,另一个从键盘读取,两者都保存在变量中 我不知道如何比较这两个变量。如果有人能给我举个例子或什么能帮助我的话,我会非常激动 .386 .model flat, stdcall ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; includelib msvcrt.lib include Macro.asm extern exit: proc extern printf:proc

我想比较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(高级组装)中:更多关于

以更经典的方式:

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

要比较字符串,请使用
rep cmpsb
。要比较的字符串变量在哪里?我看到的唯一字符串是“nume_fisier”(因为它是type
db 20 dup
),你说得对。我申报错了。我需要将fpass与pass和fuser与user.Ral进行比较,@pirela已经编辑了他们的答案,请查看。这是非标准语法。这显然是兰迪·海德HLA语言的一部分。对于那些真正想学习x86汇编语言的人来说,这可能会让人非常困惑!撇开我是否同意学习一门微妙不同的语言实际上有助于你快速学习你想学习的语言不谈,这并不能很好地回答这个问题。
cmp ecx,0
-这里有错误。如果仅在最后一个符号中不同,则会产生错误的结果。只需
je字符串\u在
repe cmpsb之后相等
mov ecx,7      
cld           
mov esi, offset [stringA]  
mov edi, offset [stringB]  
repe cmpsb     
cmp ecx,0
je strings_are_equal