最后改进代码:
.MODEL TINY
.STACK 100
.DATA
ledshow DB 11111110B ;数据段定义变量按“变量名 数据类型 数据”;DB为字节型
seven DB 07h
zero DB 00h
.CODE
START: A equ 0270H ;数码管端口地址
B equ 0271H ;0-1开关端口地址
C equ 0272H ;控制数码管显示内容
mov ax,@DATA ;获得当前程序的数据段地址,并传送给数据段DS寄存器保存。
mov ds,ax ;这样,程序中访问存储器操作数时,默认情况下就会从DS指定的数据段进行存取
mov dx,273h
mov al,10000010H
out dx,al
function:
call delay
mov dx,B
in al,dx ;从dx端口地址中将数据读入到al中
and al,00001111B
cmp al,00000001B
je fun1
cmp al,00000010B
je fun2
cmp al,00000100B
je fun3
cmp al,00001000B
je fun4
fun1: mov dx,A
mov al,00H
out dx,al ;将al中的值读出到dx端口地址中
jmp function
fun2: mov dx,A
mov al,0FFH
out dx,al
mov dx,C
mov al,01011011B
out dx,al
jmp function
fun3: mov dx,C
mov al,01001111B
out dx,al
mov dx,A
fun3xh: mov cx,8
lea bx,ledshow
rol ledshow
mov al,seven
dec seven
xlat
out dx,al
call delay
loop fun3xh
jmp function
fun4: mov dx,C
mov al,01100110B
out dx,al
mov dx,A
fun4xh: mov cx,8
lea bx,ledshow
ror ledshow
mov al,zero
inc zero
xlat
out dx,al
call delay
loop fun4xh
jmp function
delay proc near ;proc为子程序起点; 调用程序和子程序在同一code segment中时用near, 只能被相同code segment的其它程序调用; 不在同一code segment中时用far,可以被相同或不同的代码段程序调用。
push cx
mov cx,30000
delay1: loop delay1
pop cx
ret ;子程序结束时调用, 用于实现相应地址参数从该子程序到下一步程序的转移的转移
delay endp
END START
改进前汇编代码:
.MODEL TINY COM_ADD EQU 0273H PA_ADD EQU 0270H PB_ADD EQU 0271H PC_ADD EQU 0272H .STACK 100 .DATA LED_Data DB 11111110B DB 11111101B DB 11111011B DB 11110111B DB 11101111B DB 11011111B DB 10111111B DB 01111111B .CODE START: MOV AX,@DATA MOV DS,AX NOP MOV DX,COM_ADD MOV AL,82H ;PA、PB、PC为基本输出模式 OUT DX,AL LOOP1: CALL DL500ms CALL DL500ms MOV DX,PB_ADD IN AL,DX AND AL,00001111B CMP AL,00000001B JE f1 cmp al,00000010B je f2 cmp al,00000100B je f3 cmp al,00001000B je f4 f1: mov dx,PA_ADD MOV al,00H OUT dx,al jmp LOOP1 f2: mov dx,PA_ADD MOV al,0FFH OUT dx,al mov dx,PC_ADD mov al,01011011B out dx,al jmp LOOP1 f4: mov dx,PC_ADD mov al,01100110B out dx,al mov dx,PA_ADD lea bx,LED_DATA mov al,0 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,1 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,2 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,3 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,4 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,5 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,6 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,7 xlat out dx,al call DL500ms jmp LOOP1 f3: mov dx,PC_ADD mov al,01001111B out dx,al mov dx,PA_ADD lea bx,LED_DATA mov al,7 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,6 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,5 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,4 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,3 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,2 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,1 xlat out dx,al call DL500ms lea bx,LED_DATA mov al,0 xlat out dx,al call DL500ms jmp LOOP1 DL500ms PROC NEAR PUSH CX MOV CX,30000 DL500ms1: LOOP DL500ms1 POP CX RET DL500ms ENDP END START
前导题目:




LEDdt db 8 dup(0)
mov si, offset LEDdt
call LEDdisp
LEDdisp proc
push ax
push bx
push dx
mov bx, offset LEDtb
mov ah, 0feh
LED1: lodsb
xlat cs:LEDtb
mov dx, segport
out dx, al
mov al, ah
mov dx, bitport
out dx, al
call delay
rol ah, 1
cmp ah, 0feh
jnz LED1
pop dx
pop bx
pop ax
ret
LEDtb db 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h
db 80h, 90h, 88h, 83h, 0c6h, 0c1h, 86h, 8eh
LEDdisp endp
timer =10
delay proc
push bx
push cx
mov bx, timer
delay1: xor cx, cx
delay2: loop delay2
dec bx
jnz delay1
pop cx
pop bx
ret
delay endp
