我想知道为什么为一个变量M1提供两个内存值?

时间:2013-10-27 04:22:58

标签: memory assembly x86

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

2 个答案:

答案 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,则CXCHCL合并后,获取值0x0013,然后将其复制到{{1 }}

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

答案 1 :(得分:0)

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