TASM在特定的停止时间运行LED动画

问题描述 投票:0回答:1

我用这种汇编语言非常新,你们可以帮我吗

.model small
.stack
.code
org 100h
start:
    main proc
    mov cx,1; how many times to loop
    here:mov al,00000001b
    mov dx,378h
    out dx,al
    call delay
    mov al,00000010b
    mov dx,378h
    out dx,al
    call delay
    mov al,00000100b
    mov dx,378h
    out dx,al
    call delay
    mov al,00001000b
    mov dx,378h
    out dx,al
    call delay
    mov al,00010000b
    mov dx,378h
    out dx,al
    call delay
    mov al,00100000b
    mov dx,378h
    out dx,al
    call delay
    mov al,01000000b
    mov dx,378h
    out dx,al
     call delay
     mov al,10000000b
    mov dx,378h
    out dx,al
    call delay
    loop here
    int 20h
    main endp
    delay proc
        push cx
        mov cx,2050
        delay2:
        push cx
        mov cx,10000
        delay3:
        nop
        nop
        nop
        nop
        nop
        loop delay3
        pop cx
        loop delay2
        pop ax
        ret
    delay endp
end start

这是我的代码

assembly dos x86-16 bios tasm
1个回答
0
投票

由于您正在写入端口0x378,所以我想您有8个LED,每个LED分别连接到并行端口上的8个数据引脚和8个接地引脚。这告诉我您有一台较旧的计算机,并且可能正在运行TRUE DOS。它是否正确? (如果是这样,请特别注意不要损坏并行端口的LED电流。强烈建议使用限流电阻。)

您正在使用Small模型,该模型旨在为链接器创建.OBJ文件以创建.EXE文件。但是,然后放置ORG 100h指令,该指令旨在为链接器创建.OBJ文件,以创建.COM文件,或直接在没有链接器的情况下创建它。

[如果要创建一个.EXE并运行此.EXE,是的,您将在某个时间点收到一条非法指令,并采用编码方式(标签应与它们应在的位置相距100h字节)。

如果还没有,则需要将.EXE转换为.COM文件。 .EXE扩展名(带有签名)将告诉操作系统加载堆栈,数据和代码段。 .COM扩展名(带有丢失的签名)将告诉OS只需加载二进制文件并跳转到偏移100h(周期)。

  1. 将.model更改为'tiny'(与'small'并置,告诉汇编程序以创建.COM文件,或使用工具将.EXE转换为.COM。
  2. 删除“ main proc”和“ main endp”行。在此不需要它们上下文。
  3. 为了提高可读性,请将所有标签(“开始”,“此处”,“延迟”等)放入第一栏。即:名称前不能有空格。
  4. 由于您的延迟例程不会修改DX寄存器,因此无需每次都重新为其分配相同的值。如果延迟例程修改了该寄存器,则可以通过在过程中推入/弹出它来保留它。
  5. 由于您正在DOS中运行此命令,因此您可以将其在物理地址0x0046C处的双字读取为增量计时器。这是DOS一天中的时间刻度,每秒增加18.2次。只需读取该值,等待它改变一定的次数,就可以得到一个简单的延迟例程。

要读取该值,您将必须设置一个段寄存器和一个基址/索引寄存器以指向该物理地址。如果您不明白我的意思,则需要阅读有关16位分段寻址的信息。

© www.soinside.com 2019 - 2024. All rights reserved.