【问题标题】:MDA-8086 8*8 Dot matrix display code segment explainationMDA-8086 8*8点阵显示码段说明
【发布时间】:2018-05-23 15:59:06
【问题描述】:

我有一个代码在 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]。谁能告诉我这些行是做什么的?
编辑:

我还想知道DBFONT 中的工作方式以及每个DB 的评估方式。

【问题讨论】:

  • MOV SI, OFFSET FONT 将 FONT 的地址放入 SI。 MOV AL, BYTE PTR CS:[SI] 将 CS:[SI] 处的字节移动到 AL 寄存器中。
  • 你标记了这个emu8086,但这看起来不像是给emu8086的

标签: assembly x86-16 dot-matrix


【解决方案1】:

现在我不明白这些行

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: 的内存位置。

【讨论】:

  • 那么,DB写入的字节存储在代码段中?而且,我很少看到像你这样的详尽答案。所以谢谢。
  • @AhashanAlamSojib: db 在当前部分的当前位置发出一个字节。 Syntactically, it's just like any other instruction(所以你可以称之为伪指令)。请记住,汇编语言没有“变量”或任何东西,它只是一种方便地描述您想要在哪里的字节的语言。标签让你让汇编器计算偏移量和其他东西,但每一行仍然只是让汇编器将一些字节发送到输出文件中。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2017-07-19
相关资源
最近更新 更多