MDA-8086 8 * 8点阵显示代码段解释

时间:2017-12-09 16:39:57

标签: assembly dot-matrix

我有一个显示' A'在MDA-8086的点阵显示中。这是它:

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的评估方式。

1 个答案:

答案 0 :(得分: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:的内存位置。