2016-04-12 23 views
0

であれば、私はこのコードは、これらの特定の行にどのように機能するかを理解することはできません。DISPLAY MSG2チェック文字列が回文

、どのようにそれはDISPLAY P11とMSGを印刷するには知っていますか?

の後DISPLAY MSG3アレイの長さを印刷するには、これらの4行でどのように知っていますか? L1は "?"となっていますが、どのように長さをすでに取得していますか?

MOV DL,L1 
ADD DL,30H 
MOV AH,2 
INT 21H 

私はそれでMACROLEAについてのある程度の知識が不足していると思います。私はLEAMOV blabla, OFFSET blabla2であることを知っています。

非常に高く評価されました。

.MODEL SMALL 
    .STACK 100h 
    .DATA 

     MSG1 DB 10,13,'ENTER ANY STRING :- $' 
     MSG2 DB 10,13,'ENTERED STRING IS :- $' 
     MSG3 DB 10,13,'LENGTH OF STRING IS :- $' 
     MSG4 DB 10,13,'NO, GIVEN STRING IS NOT A PALINDROME $' 
     MSG5 DB 10,13,'THE GIVEN STRING IS A PALINDROME $' 
     MSG6 DB 10,13,'REVERSE OF ENTERED STRING IS :- $' 

     P1 LABEL BYTE ;start of label byte 
     M1 DB 0FFH  ;assign maximum length of array 
     L1 DB ?  ;length of string 

     P11 DB 0FFH DUP ('$') ;init array (max 256) 
     P22 DB 0FFH DUP ('$') ;init array (max 256) 

    DISPLAY MACRO MSG ;Called like that: <Display argument> 
     MOV AH,9 
     LEA DX,MSG 
     INT 21H 
    ENDM 

    .CODE 

    START: 
      MOV AX,@DATA ;Assign data to AX 
      MOV DS,AX  ;Assign data to Data Segment   

      DISPLAY MSG1 ; Enter string 

      LEA DX,P1 ;DX points to P1's offset 
      MOV AH,0AH ; buffer filled with user input 
      INT 21H 

      DISPLAY MSG2 ;The entered string is: 

      DISPLAY P11 ;This will display the string 

      DISPLAY MSG3 ;Display length 

      ;Ap 

ply string's length to DL, 
     ; covert from ASCII to DEC, and output the length value. 
     MOV DL,L1 
     ADD DL,30H 
     MOV AH,2 
     INT 21H 

     DISPLAY MSG6 

     ;initialize P11 to SI register and P22 to DI register  
     LEA SI,P11 
     LEA DI,P22 

     ;Jump SI to the end of string 
     MOV DL,L1 
     DEC DL 
     MOV DH,0 
     ADD SI,DX     

     ;Move length of actual string to CL, and apply CH = 0 
     MOV CL,L1 
     MOV CH,0  
     ;CX = string's length. 

REVERSE:  
     ;Put P11's REVERESED string into P22 string 
     MOV AL,[SI] 
     MOV [DI],AL 
     INC DI 
     DEC SI 
     LOOP REVERSE 

     DISPLAY P22 ; Display the reversed string 

     ;Re-assign P11,P22 to SI,DI registers    
     LEA SI,P11 
     LEA DI,P22 

     ;Move length of actual string to CL, and apply CH = 0 
     MOV CL,L1 
     MOV CH,0  
     ;CX = string's length. 

CHECK: 
     MOV AL,[SI] 
     CMP [DI],AL 
     JNE NOTPALIN 
     INC DI 
     INC SI 
     LOOP CHECK 


     DISPLAY MSG5 
     JMP EXIT 
NOTPALIN: 
     DISPLAY MSG4 

EXIT: MOV AH,4CH 
     INT 21H 
CODE ENDS 
END START 

答えて

1

function 0Ah in int 21hに電話すると、特定の形式のバッファが割り当てられます。最初のバイト(ここではM1)は、バッファのバイト数を示し、2番目のバイトは読み取られたバイト数(L1)、その後は実際の文字が読み込まれるバイト数(P11ここ)です。

したがって、読み取り関数L1は、読み込まれた文字数で初期化されます。

+0

ここで意味P1は必要ありません。ありがとうございました! –

+1

@IlanAizelmanWS P1とM1は同じ場所を指すので、必要なのは1つだけです。 –

+0

あなたは以下のことを行うためにコードをどのようにアップグレードすればよいですか?文字列がpalindromなら、同じ文字が2回以上あるかどうかをチェックしたいと思います。 'a'は2回繰り返されるので(例えば、パリンドロームでも) –

関連する問題