MDA-8086 8*8点阵显示码段解释
MDA-8086 8*8 Dot matrix display code segment explaination
我有一段代码在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 FONT
和 MOV AL, BYTE PTR CS:[SI]
。谁能告诉我这些行是做什么的?
编辑:
我还想知道 DB
在 FONT
中的工作方式以及每个 DB
的评估方式。
Now I don't get these lines
x86 CPU 的 16 位和 32 位代码总是使用两个数字来指定存储在内存中的地址:
段和偏移量。
该段描述了内存中的某个区域。
内存中某些项目的"real"地址可以通过以下方式计算:
(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
已递增。)
I also want to know how DB is working ...
DB
不是指令。
DB
告诉汇编程序将具有特定值的字节写入内存 而不是 一条指令。
所以下面的(无意义的)代码:
mov ax, 1
db 10
mov ax, 2
...表示在两条mov
指令之间应该有值为10的字节。
how DB is working in FONT
这8个字节(这里不是指定为十进制而是二进制数)存储在名为FONT:
.
的内存位置
我有一段代码在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 FONT
和 MOV AL, BYTE PTR CS:[SI]
。谁能告诉我这些行是做什么的?
编辑:
我还想知道 DB
在 FONT
中的工作方式以及每个 DB
的评估方式。
Now I don't get these lines
x86 CPU 的 16 位和 32 位代码总是使用两个数字来指定存储在内存中的地址:
段和偏移量。
该段描述了内存中的某个区域。
内存中某些项目的"real"地址可以通过以下方式计算:
(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
已递增。)
I also want to know how DB is working ...
DB
不是指令。
DB
告诉汇编程序将具有特定值的字节写入内存 而不是 一条指令。
所以下面的(无意义的)代码:
mov ax, 1
db 10
mov ax, 2
...表示在两条mov
指令之间应该有值为10的字节。
how DB is working in FONT
这8个字节(这里不是指定为十进制而是二进制数)存储在名为FONT:
.