【问题标题】:How the counter works in assembly计数器在装配中的工作原理
【发布时间】:2017-12-12 11:58:10
【问题描述】:

谁能帮我详细了解这段代码的工作原理。目前我只了解前三行...

        MOV AL,99H
        OUT 06H,AL
        MOV AL,2
NEXT1:  MOV CX,0FFFFH
NEXT2:  LOOP NEXT2
        OUT 02H,AL
        ROL AL,1
        JMP NEXT1
        END

【问题讨论】:

  • 您能告诉我们到底是什么困扰着您吗? looprol 指令?该代码似乎只是使用(可能)一组 LED 或其他东西来初始化自定义 FPGA/设备。在真实的 PC 中,端口 02h 是只读的,并且与端口 06 一起属于第一个传统 DMA 控制器。
  • 是的,它初始化了一个自定义 FPGA,但是 MOV CX,0FFFFH 是什么意思?
  • 你肯定不会被一个简单的MOV 迷惑了吧?它只是将CX 设置为0FFFFh。它用于延迟循环。
  • 对8086指令here有一个很好的总结。有时要了解指令的作用,您必须继续阅读源代码:) 尝试确定控制流程。
  • @MargaretBloom:我怀疑他们使用的是 flight86 培训板。这是一块 4.9152mhz 8086 板,内存高达 64kb。有几个8255。一个可用于端口 0x00(端口 A)、端口 0x02(端口 B)、端口 0x04(端口 C)、端口 0x06(控制端口)。将 99h 写入控制端口将使端口 A 和端口 C 输入端口和端口 B (0x02) 成为输出端口,因此在这种情况下,代码确实有意义。

标签: loops assembly x86 counter


【解决方案1】:

在我看来,这就像某种 LED 追逐器:

         ; send 0x99 (binary 10011001) to Port 6, for whaever reason
        MOV AL,99H
        OUT 06H,AL


        MOV AL,2          ; initialize running bit, 2= 00000010b

NEXT1:  MOV CX,0FFFFH
NEXT2:  LOOP NEXT2        ; this loops 65535 times (decrease 
                          ; CX until 0 is reached)

        OUT 02H,AL        ; send pattern to port 2 (whatever that does)

        ROL AL,1          ; 'rol' shifts left one bit each time ...
                          ; putting the 1 back in on the right side,
                          ; when it drops out

        JMP NEXT1         ; back to the pausing loop
        END

在端口 2 上:将出现以下内容(重复)

(pause)
00000010  
(pause)
00000100  
(pause)
00001000
(pause)
00010000  
(pause)
00100000  
(pause)
01000000
(pause)
10000000
(pause)
00000001

你给我们的小信息不能说什么:

  • port2 上显示的第一个模式
  • 暂停的长度,取决于您的 CPU 速度
  • port6 做了什么(可能是一些初始化)
  • 模式失效时端口 2 的作用

【讨论】:

  • 099H = 8255 初始化
  • 我不认为这是一个 8255,0x99 输出是“端口 B 到输出”,但是控制端口 = 0x06,端口 B 将是 0x04,而不是 0x02 ...或者完成了一些映射.不过不清楚,或许out 6,0x99会在153秒内开启NC1701的自毁序列?谁知道:)
  • 我有一种疯狂的预感,时钟频率是 4.9152mhz,所以延迟大概是 ~0.2267 秒
  • 如果我的预感是正确的,这是一个 Flight-86 板端口 0x06 是 8255 控制端口。写入 0x99 将使端口 B (0x02) 成为输出端口,端口 A (0x00) 和端口 C(0x04) 输入端口。
  • @MichaelPetch 看起来好像他们错过了最低地址引脚 A15,当他们将 8255 连接到板上时,通常不是控制端口 = base + 3,端口 A、B、C =base+ 0 - 基础+2 ?尽管这样做的原因可能是能够向它们写入 16 位值,并且仍然不会弄乱其他端口
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多