0

我有一个在 MDA-8086 的点阵显示中显示“A”的代码。就这个:

ORG 1000H
MOV AL, 10000000B       ;Activate Signal
OUT 1EH, AL             ;Writing Activate signal to  Control Register
MOV AL, 11111111B       ;Off Signal
OUT 18H, AL             ;Writing off signal to Port A
L1: MOV SI, OFFSET FONT ;Assigning source address to Memory address/                            ;offset of FONT Variable
    MOV AH, 00000001B
L2: MOV AL, BYTE PTR CS:[SI]
    OUT 1AH, AL
    MOV AL, AH
    OUT 1CH, AL
    CALL TIMER
    INC SI
    CLC
    ROL AH, 1
    JNC L2
    JMP L1
    INT 3
TIMER: MOV CX, 300
TIMER1: NOP
        NOP
        NOP
        NOP
        LOOP TIMER1
        RET
FONT: DB 11111111B
      DB 11001001B
      DB 10110100B
      DB 10110110B
      DB 10110110B
      DB 10110110B
      DB 10000000B
      DB 11111111B

现在我不明白这些线;MOV SI, OFFSET FONTMOV AL, BYTE PTR CS:[SI]。谁能告诉我这些线是做什么的?
编辑:

我还想知道如何DB工作FONT以及如何DB评估每个人。

4

1 回答 1

2

现在我不明白这些线

x86 CPU 的 16 位和 32 位代码总是使用两个数字来指定存储在内存中的内容的地址:

段和偏移量。

该段描述了内存中的某些区域。

内存中某些项目的“真实”地址可以通过以下方式计算:

(address of the first byte of the segment) + offset

CS寄存器通常是只读的。它包含包含当前执行的指令的段。

MOV SI, OFFSET FONT指令现在会将FONT:标签后面的数据的偏移量写入SI寄存器。

MOV AL, BYTE PTR CS:[SI]指令将从内存中读取一个字节到寄存器AL中。从以下地址读取字节:

(address of the first byte of the CS segment) + (value of register SI)

因为FONT:标签与指令本身(CS)在同一段中,并且包含这样计算的地址SI的偏移量是第一个字节的地址。FONT:FONT:

换句话说:指令将 的第一个字节加载FONT:到寄存器AL中。

(当第二次调用指令时,第二个字节FONT:将被加载,因为SI已经递增。)

我也想知道DB是如何工作的......

DB不是指令。

DB告诉汇编器将具有特定值的字节写入内存而不是指令。

所以下面的(无意义的)代码:

mov ax, 1
db 10
mov ax, 2

... 表示在两条mov指令之间应该有一个值为 10 的字节。

DB 如何在 FONT 中工作

这 8 个字节(这里没有指定为十进制,而是指定为二进制数)存储在名为FONT:.

于 2017-12-09T17:20:01.910 回答