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