assembly 如何在汇编程序中比较字符串的两个字符?

xfb7svmp  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(151)

我试着写一个程序,输入一个字符串,然后输入要删除的单词。在一个循环中,我试着比较第一个和第二个字符串的字符,然而条件总是返回正

我正在使用仿真器emu8086

name test
.model small
.stack 100h
.data       
    wrd_ask db "word: $" 
    string_ask db "string: $"
    
    w_buffer db 255           
    wrd db 256 dup('$')
    
    s_buffer db 255    
    string db 256 dup('$')
.code

macro convert buffer
    push ax
    push dx
    lea dx, buffer
    mov ah, 0Ah
    int 21h 
    pop dx
    pop ax
endm

start: 
    mov ax, @data
    mov ds, ax
    
    mov dx, offset string_ask
    mov ah, 09h
    int 21h
    convert s_buffer
    
    mov dx, offset wrd_ask
    mov ah, 09h
    int 21h
    convert w_buffer
    
    mov si, 0
    mov di, 0  
    mov cx, 255
     
cycle:  
    inc si                
    inc di
    cmp string[si], wrd[di]
    je same

    same:
        mov dl, wrd[di]
        mov ah, 02h
        int 21h  
    
    LOOP cycle
end start
jaxagkaj

jaxagkaj1#

cmp string[si], wrd[di]

你不能像这样比较两个内存字节。指令集不允许这样做。你需要在比较另一个之前将其中一个加载到寄存器中:
第一次
在这里你需要一些介于两者之间的东西(在'not equal'的情况下你想要的任何东西)。否则,不管比较的结果如何,在 same 的代码都将被执行。
请尝试以下操作:

cycle:  
    inc  si                
    inc  di
    mov  dl, string[si]
    cmp  dl, wrd[di]
    jne  different
    mov  ah, 02h
    int  21h  
    loop cycle
same:
    ...
    mov  ax, 4C00h
    int  21h
different:
    ...
    mov  ax, 4C00h
    int  21h

使用以下句子:“堆栈溢出岩石”
用这个词:“堆栈下溢”
观察结果“stack”(第一个区别是“o”和“u”之间。

相关问题