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