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
答案 0 :(得分:1)
这些代码行背后的要点:
LEA BX, BUFF+2
MOV CH, 00H
MOV CL, BUFF+1
MOV DI, CX
DI
是一个16位寄存器。代码想要将BUFF+1
中存储的长度(一个字节)加载到DI
中。但是你无法将一个字节加载到DI
。因此,它将字节加载到CL
,使CH
等于00
,然后将结果(CX
)复制到DI
。
因此,如果[BUFF+1]
包含值0x13,则CX
(CH
和CL
合并后,获取值0x0013,然后将其复制到{{1 }}
DI
似乎正在加载LEA BX, BUFF+2
,其中包含缓冲区中第一个字符的地址。 BX
随后用作缓冲区的索引。
答案 1 :(得分:0)
10和13是换行和回车的十进制值。更多参考检查int 21函数.. 它们用于在不同的行中显示msg1和msg2 最好的