Assembly 在汇编语言中反转输入字符串
我试图在汇编中反转字符串,但它不工作,它不读取字符串的字符! 请帮助,它只针对任何字符打印$$$$。我想写什么Assembly 在汇编语言中反转输入字符串,assembly,Assembly,我试图在汇编中反转字符串,但它不工作,它不读取字符串的字符! 请帮助,它只针对任何字符打印$$$$。我想写什么 .model small .stack 100h .data input db 10 dup ('$') output db 10 dup('$') .code main proc mov ax , @data mov ds , ax mov bx , offset input mov cx , 0 l1: mov ah , 1 int 21h mov
.model small
.stack 100h
.data
input db 10 dup ('$')
output db 10 dup('$')
.code
main proc
mov ax , @data
mov ds , ax
mov bx , offset input
mov cx , 0
l1:
mov ah , 1
int 21h
mov [bx] , al
inc bx
inc cx
cmp al , 13
jne l1
mov dx , offset input
mov ah , 9
int 21h
mov si , cx
ou:
mov dl , [bx+si]
mov ah , 2
int 21h
dec bx
dec cx
cmp cx , 1
jne ou
mov ax, 4c00h
int 21h
main endp
end main
您的代码不起作用,因为您忘记在反向显示循环中设置BX。请尝试以下代码:
mov si , cx
mov bx, offset input
ou:
mov dl , [bx+si-1]
mov ah , 2
int 21h
dec si
jnz ou
您可以轻松地更改此例程,使其将反向字符串存储在输出所指向的缓冲区中。您可以使用此非常简单的例程来执行此操作:
strrev:
mov al, [si]
mov [di], al
dec si
inc di
loop strrev
ret
它接受
cx
中字符串内部的字符数、si
中输入字符串最后一个字符的地址以及di
中新字符串的缓冲区地址。调用它,然后使用Int 21/AH=09h
显示反向字符串。用$
终止输出字符串留给调用者。你不认为反转字符串然后打印比反向打印每个字符更合适吗?@DanielKamilKozar OP可能想先打印以验证他的努力。长度
是一个常量,您可以只mov si,length-1+offset string1
而不使用4条指令。(您不需要cx
,循环条件可以是cmp si,偏移量string1
/jne
)。
data segment
string1 db 'CBITA'
length equ ($-string1)
string2 db ?
data ends
code segment
assume cs:code ds:data es:data
start:
mov ax,data
mov ds,ax
lea si,string1
lea di,string2
mov cx,length
add si,cx
add si,-1
cld
strrev:
mov al, [si]
mov [di], al
dec si
inc di
dec cx
jnz strrev
hlt
code ends
end start