如何比较x86程序集中的两个字符串与FASM?

时间:2017-11-18 12:37:33

标签: assembly x86 fasm

我想将寄存器si中存储的用户输入与另一个字符串进行比较 顺便说一下,我正在使用FASM。这是我用户输入后的代码 如果我使用repe cmpsb命令,我知道我必须使用额外的段,但我不知道如何。 repe cmpsb命令不适用于此代码。

.input_done:
   cmp si, 0
   je no_input
   jmp short .compare_input


.compare_input:
    mov cx, 20 ;For the repe cmpsb command.
    cld
    mov di, info ;The string I want to compare.
    mov es, di
    mov di, info
    repe cmpsb
    cmp cx, 0
    je showinfo
.showinfo:
    ... ;The output string if both string are the same.

info db "info", 0

1 个答案:

答案 0 :(得分:2)

mov di, info ;The string I want to compare.
mov es, di

对于一个简单的程序,两个字符串可能都存储在同一个内存段中。只需将DS中的值放在ES

...
push ds
pop  es
mov  di, info
...
  

repe cmpsb命令不适用于此代码。

您已将计数器CX设置为固定数字20,其中至少有一个字符串(“info”)只有4个字符。难怪比较失败了。

由于您要比较相等性,因此您的第一步是查看两个字符串是否具有相同的长度。如果没有,你已经知道了答案 如果长度相同,则将其用作计数器CX

; String1 pointer in DS:SI, length in CX
; String2 pointer in ES:DI, length in DX

cmp  cx, dx
jne  NotEqual
repe cmpsb
jne  NotEqual
Equal:       ; .showinfo:
...          ; The output string if both string are the same.
; Don't fall through here!!!
NotEqual:
...