2016-04-12 9 views
0

Ich kann nicht verstehen, wie dieser Code in diesen speziellen Linien funktioniert:Überprüfen Sie, ob String palindrom

Nach DISPLAY MSG2, Woher weiß er das msg mit DISPLAY P11 drucken?

Nach DISPLAY MSG3 Woher weiß es mit diesen 4 Zeilen, um die Länge des Arrays zu drucken? L1 soll "?" sein, wie hat es schon die Länge bekommen?

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

Ich glaube, mir fehlt etwas Wissen über die MACRO und LEA darin. aber ich weiß, dass LEAMOV blabla, OFFSET blabla2 ist.

Helfed wird sehr geschätzt.

.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 

Antwort

1

Wenn Sie den function 0Ah in int 21h anrufen, geben Sie ihm einen Puffer in einem bestimmten Format. Das erste Byte (M1 hier) gibt an, wie viele Bytes der Puffer hat, der zweite die Anzahl der gelesenen Bytes (L1 hier) und danach die Bytes, die die tatsächlichen Zeichen haben werden (P11 hier).

Also nach dem Aufruf der Lesefunktion L1 wird mit der Anzahl der gelesenen Zeichen initialisiert.

+0

Bedeutung P1 wird hier nicht benötigt. Danke! –

+1

@IlanAizelmanWS P1 und M1 zeigen auf den gleichen Platz, so dass nur einer benötigt wird. –

+0

Haben Sie Ideen, wie kann ich den Code aktualisieren, um Folgendes zu tun: Wenn die Zeichenfolge Palindrom ist, möchte ich überprüfen, ob wir nicht mehr als zweimal die gleichen Zeichen haben. zum Beispiel 'aba' ist in Ordnung, aber 'aabaa' ist nicht, weil 'a' zweimal wiederholt wird (obwohl es ein Palindrom ist) –