-4
M1  DB 10, 13, 'Enter the string : $'

请解释一下台词?

    LEA BX,  BUFF+2
    MOV CH,  00H
    MOV CL,  BUFF+1
    MOV DI,  CX

这是完整的代码

.model small
.data
    M1  DB 10, 13, 'Enter the string : $'
    M2  DB 10, 13, 'String is palindrome $'
    M3  DB 10, 13, 'String is not palindrome $'
    BUFF    DB 80
        DB 0
        DB 80 DUP (0)
.code
START:  MOV AX, @data
        MOV DS,  AX
        MOV AH,  09H            ; Display message M1
    MOV DX,  OFFSET M1
        INT 21H
    MOV AH,  0AH        ; input the string
    LEA  DX,  BUFF
    INT 21H
        LEA BX,  BUFF+2
        MOV CH,  00H
        MOV CL,  BUFF+1
        MOV DI,  CX
        DEC di
    SAR CL,  1
        MOV SI,  00H
BACK:  MOV AL,  [BX + DI]       ; Get the right most character
        MOV AH, [BX + SI]       ; Get the left most character
    CMP AL,  AH
    JNZ  LAST
    DEC DI
    INC SI
    DEC  CL
    JNZ  BACK
        MOV AH,  09H            ; Display message 2
    MOV DX,  OFFSET M2
    INT 21H
    JMP  TER
LAST:  MOV AH,  09H
    MOV DX,   OFFSET M3     ; Display message 3
        INT  21H
TER:   MOV AH,  4CH
        INT  21H
        END START
4

2 回答 2

1

这些代码行背后的要点:

LEA BX,  BUFF+2
MOV CH,  00H
MOV CL,  BUFF+1
MOV DI,  CX

DI是一个 16 位的寄存器。代码想要将存储BUFF+1DI. 但是你不能将一个字节加载到DI. 因此它将字节加载到CL中,使其CH等于00,然后将结果 ( CX) 复制到DI

因此,如果[BUFF+1]包含值 0x13,则CXCH组合CL得到值 0x0013,然后将其复制到DI.

LEA BX, BUFF+2似乎正在加载缓冲区中第BX一个字符的地址。BX随后用作缓冲区的索引。

于 2013-10-28T19:55:19.960 回答
0

10 和 13 是换行和回车的十进制值。更多参考请查看 int 21 函数。它们用于在不同行中显示 msg1 和 msg2 最好

于 2013-11-22T16:40:19.337 回答