assembly 在8086 + MOVSB中连接两个给定字符串不起作用

jaxagkaj  于 2022-12-29  发布在  其他
关注(0)|答案(2)|浏览(130)

我试着写一个8086汇编程序来连接两个给定的字符串。为了做到这一点,我使用了一个“REP MOVSB”指令,但是程序运行得不好。所以我写了一个程序来静态连接两个字符串,但是看起来“REP MOVSB”对字符串一点影响都没有。下面是我为测试写的代码部分:

data    segment
    
string1 db  "Lotfi", 0
string2 db  "Ali ", 0 
    
data ends

code segment    

ASSUME  CS: code, DS: data
              
start:
    cld
    mov     ax  , data
    mov     DS  , ax
    
    mov     SI  , offset string1
    mov     DI  , offset string2
    add     DI  , 3 ; Adding the length of destination string to the DI
    
    
    mov     cx  , 5
    rep movsb ; This should concat two strings

    ; Printing the result character by character on the console
    mov     SI  , offset string2
l:  lodsb           ; Printing loop
    mov dl, al
    mov ah, 2h
    int 21h
    jmp l
    

    hlt 
    
    code ends
end start

代码的结果如下所示:

Ali             ü,Z0???... (And so)

我的密码有什么问题?

sgtfey8w

sgtfey8w1#

movsb从DS:SI移动到ES:DI。您加载了DS寄存器,但没有加载ES寄存器。
您只需添加一行:

cld
mov     ax  , data
mov     DS  , ax
mov     ES  , ax   ; here!
r3i60tvu

r3i60tvu2#

DATA SEGMENT
STR1 DB "Tanay$"
STR2 DB "Patil$"
LEN DB ?
DATA ENDS
CODE SEGMENT
START:ASSUME CS:CODE,DS:DATA
MOV AX,DATA
MOV DS,AX
LEA SI,STR1
LEA DI,STR2
MOV AL,"$"
NEXT1:CMP[SI],AL
JZ EXIT
INC LEN
INC SI
JMP NEXT1
EXIT:MOV BL,"$"
NEXT:MOV AL,[DI]
CMP AL,BL
JZ EXIT1
MOV [SI],AL
INC SI
INC DI
JMP NEXT
EXIT1:MOV[SI],BL
MOV AH,09H
LEA DX,STR1
INT 21H
MOV AH,0AH
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START

输出将显示在TASM窗口中

相关问题