检查字符串是否为回文

Check if string is palindrom

我无法理解此代码在这些特定行中的工作原理:

DISPLAY MSG2 之后,它怎么知道用 DISPLAY P11 打印消息?

After 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

当你调用 function 0Ah in int 21h 时,你给它一个特定格式的缓冲区。第一个字节(这里是M1)表示缓冲区有多少字节,第二个字节是读取的字节数(这里是L1),然后是读取实际字符的字节(P11这里)。

所以在调用读取函数后L1被初始化为读取的字符数。