2015-05-03 3 views
-1

Я пытаюсь изменить строку в сборке, но не работает, не читая символ строки! , пожалуйста, помогите, он печатает только $$$$$ против любого символа. что я пытаюсь написать!Обратный ввод строки в языке ассемблера

.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  
+0

Не думаете ли вы, что было бы более целесообразно перевернуть строку, а затем распечатать ее, вместо того чтобы печатать каждый символ в обратном порядке? –

+0

@ DanielKamilKozar Возможно, OP хочет сначала распечатать, чтобы проверить его усилия. –

ответ

1

Ваш код не работает, потому что вы забыли установить BX в цикле обратного отображения. Попробуйте этот код:

mov si , cx 
mov bx, offset input 
ou: 
mov dl , [bx+si-1] 
mov ah , 2 
int 21h 
dec si 
jnz ou 

Вы можете легко изменить эту процедуру так, что она сохраняет обратную строку в буфер, на который указывает выход.

0

Вы можете использовать эту очень простую процедуру, чтобы сделать работу:

strrev: 
    mov al, [si] 
    mov [di], al 
    dec si 
    inc di 
    loop strrev 
    ret 

Он принимает число символов в строке в cx, адрес последнего символа входной строки в si и адрес буфера для новой строки в di. Вызовите его, а затем используйте Int 21/AH=09h, чтобы отобразить обратную строку. Окончание выходной строки с $ остается вызывающей.

0
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 
+0

'length' является константой, вы можете просто« mov si, length-1 + offset string1' вместо использования 4 инструкций. (Вам не нужно 'cx', ваше условие цикла может быть' cmp si, offset string1'/'jne'. –

Смежные вопросы