我有一个显示' 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 FONT
和MOV AL, BYTE PTR CS:[SI]
。谁能告诉我这些线路做什么?
修改
我还想了解DB
FONT
的工作原理以及每个DB
的评估方式。
答案 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:
的内存位置。