用汇编语言写一个能够让流水灯来回亮的代码,并附上注释
时间: 2023-06-27 22:05:20 浏览: 214
流水灯 程序代码 汇编语言
5星 · 资源好评率100%
以下是用汇编语言写的流水灯来回亮的代码,注释已经添加在代码中:
```
; 定义端口地址
PORT_A equ 0x05 ; 输出端口A地址
PORT_B equ 0x06 ; 输出端口B地址
; 定义常数
DELAY_TIME equ 200 ; 延时常数,控制时间间隔
; 定义数据段
cseg segment
assume cs:cseg, ds:cseg, ss:cseg
org 0x100 ; 程序入口地址
start:
mov ax, cseg ; 把代码段地址赋值给ax
mov ds, ax ; 把ds寄存器赋值为代码段地址
mov al, 0xFF ; 把al寄存器赋值为11111111b,表示所有灯都亮
out PORT_A, al ; 把al寄存器内容输出到端口A,点亮所有灯
mov al, 0x01 ; 把al寄存器赋值为00000001b,表示只有第1盏灯亮
out PORT_B, al ; 把al寄存器内容输出到端口B,点亮第1盏灯
mov cx, 0 ; 把cx寄存器赋值为0,用于计数
loop:
; 延时一段时间
mov bx, DELAY_TIME
delay:
dec bx
jnz delay
; 如果灯亮到了最后一盏,就往回亮
cmp al, 0x80 ; 比较al寄存器的值和10000000b,判断是否到了最后一盏灯
je reverse ; 如果到了最后一盏灯,就转到reverse标签处
; 灯往前亮
shl al, 1 ; 把al寄存器的值向左移动1位,表示灯向前移动一盏
out PORT_B, al ; 把al寄存器内容输出到端口B,点亮对应的灯
jmp loop ; 跳转到loop标签处
reverse:
; 延时一段时间
mov bx, DELAY_TIME
delay_reverse:
dec bx
jnz delay_reverse
; 如果灯亮到了第一盏,就往回亮
cmp al, 0x01 ; 比较al寄存器的值和00000001b,判断是否到了第一盏灯
je loop ; 如果到了第一盏灯,就转到loop标签处
; 灯往后亮
shr al, 1 ; 把al寄存器的值向右移动1位,表示灯向后移动一盏
out PORT_B, al ; 把al寄存器内容输出到端口B,点亮对应的灯
jmp reverse ; 跳转到reverse标签处
; 程序结束,返回操作系统
mov ax, 4C00h
int 21h
cseg ends
end start
```
以上代码使用了两个端口,分别是端口A和端口B,其中端口A用于控制所有灯的亮灭,端口B用于控制单个灯的亮灭。在程序开始时,先点亮所有灯,然后只点亮第一盏灯。然后在一个无限循环中,不断地让灯往前亮,直到亮到最后一盏,然后让灯往后亮,直到亮到第一盏,再往前亮,如此循环往复。在灯往前和往后移动时,需要把al寄存器的值进行左移和右移操作,然后把移动后的值输出到端口B,以控制对应的灯的亮灭。为了控制灯亮灭的时间间隔,程序中还设置了一个延时常数DELAY_TIME。
阅读全文