最后改進代碼:
.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
