2017-11-02 29 views
2

입력 한 문자열을 반대로하는이 어셈블리 코드가 있습니다. 최대 20 자까지 허용됩니다. 내 문제는 내가 출력을 보려면 Enter 키를 누르면 반전 된 문자열 끝에 여분의 문자가 있다는 것입니다.
왜 그런 일이 발생하고 출력에서이를 제거 할 수 있는지 이해해주십시오.
문자열을 표시하려면 함수 09H int 21h, 문자열을 입력하려면 0Ah int 21h 함수 만 사용해야합니다. 우리는 TASM을 사용하고 있습니다.
도움을 주시면 감사하겠습니다. 고맙습니다.어셈블리에서 입력 문자열 반전

.model small 
.stack 100h 
.data 
    MSG DB "Input String(max 20 chars): ", 10, 13, "$" 
    Sentence1 DB 21,?,21 dup("$") 
    str2 dw 21 dup("$") 
.code 
start: 
    mov ax, @data 
    mov ds, ax 

    ;Getting the string input 
     mov ah,09h 
     lea dx, MSG 
     int 21h 

     lea si,Sentence1 
     mov ah,0ah 
     mov dx,si 
     int 21h 

    ;Reverse String  
     mov cl,Sentence1 
     add cl,1 
     add si,2 
    loop1: 
     inc si 
     cmp byte ptr[si],"$" 
     jne loop1 

     dec si 
     lea di,str2 
    loop2: 
     mov al,byte ptr[si] 
     mov byte ptr[di],al 
     dec si 
     inc di 
     loop loop2 

     ;Printing the reverse string  
      mov ah,09h 
      lea dx,str2 
      int 21h  

     mov ah, 4ch 
     int 21h 
end start 
+0

어떤 추가 문자가 있습니까? 읽기 문자열에는 끝에 CR (ASCII 13)이 있습니다. 또한, 읽기 문자열의 끝을 찾는 루프가 필요 없습니다. 읽은 문자의 수는'[Sentence1 + 1] '을 통해 반환됩니다. – Michael

+0

문자 P가 뒤로 향하는 것처럼 마음과 같은 여분의 문자입니다. 그럼 그냥 루프 1을 제거해야합니까? – naomiyx

답변

2
str2 dw 21 dup("$") 

일반적으로 이것은 db 지시어를 사용하는 것입니다 :

여기 내 코드입니다.


mov cl,Sentence1 
add cl,1 

환입 루프는 루프 카운터로 CX 사용하지만 올바르게 설정하지 마십시오!
"Sentence1"입력 구조의 두 번째 바이트에는 CX 레지스터에 원하는 값이 들어 있습니다. 종료 문자를 검색 할 필요가 없습니다. 더욱이 '$'대신 ASCII 코드 13 (캐리지 리턴)을 찾아야합니다. SI 설정

mov cl, [si + 1] ;Number of characters in the string 
mov ch, 0   ;Make it a word because LOOP depends on CX (not just CL) 

다음이된다 :

add si, 2   ;To the start of the string 
add si, cx   ;To the position after the string 
dec si    ;To the last character of the string 

하지만 짧은 :

add si, cx 
inc si 

지금까지 사용자가 입력 텍스트를하지 않았다면, 당신이 원하는 것 반전을 완전히 우회하는 것! 그게 다음 코드에서 jcxz이 무엇입니까 :

lea si, Sentence1 
mov ah, 0Ah 
mov dx, si 
int 21h 

;Reverse String  
mov cl, [si + 1] 
mov ch, 0 
add si, cx 
inc si 
lea di, str2 

jcxz EmptyString  ;By-pass the reversal entirely! 

loop2: 
mov al, byte ptr[si] 
mov byte ptr[di], al 
dec si 
inc di 
loop loop2 

EmptyString: 
;Printing the reverse string (could be empty) 
mov ah, 09h 
lea dx, str2 
int 21h 
+0

고맙습니다! IT가 마침내 올바르게 작동합니다! 네가 말한 것을 연구 할께. 고마워! – naomiyx