組合語言
作業三解答
;* pro31 *;
;* 8253 MODE_4 APPLICATION *;
;* NOTE: SET 8253 MODE OUT=HIGH *;
;* START COUNT OUT=HIGH *;
;* COUNT END OUT=LOW(1 CLK)OUT=HIGH *;
;* 8253 MODE_4 IS SOFTWAWE TIGGERED STROBE *;
;********************************************************;
COUNT_0 EQU 308H
COUNT_1 EQU 309H
COUNT_2 EQU 30AH
CONTROL_8253 EQU 30BH
.MODEL SMALL
.DATA
.STACK
.CODE
BEGIN:
MOV DX,CONTROL_8253 ;SET 8253 COUNT_0 MODE-4
MOV AL,38H
OUT DX,AL
MOV DX,COUNT_0 ;WRITE LSB COUNT=5
MOV AL,05H
OUT DX,AL
MOV DX,COUNT_0 ;WRITE MSB COUNT=0
MOV AL,00
OUT DX,AL
END BEGIN
;pro32 ;
; SIMULATION PERIPHERAL ;
; SIGNAL TO 8255 ;
; METHOD : USING 8255 MODE_1 ;
; PORT_A=IN PORT_B=OUT ;
; ;
;**************************************;
PORT_A EQU 300H
PORT_B EQU 301H
PORT_C EQU 302H
CONTROL_WORD EQU 303H
.MODEL SMALL
.STACK
.CODE
BEGIN:
MOV AL,0BCH ; 設定8255: MODE 1
MOV DX,CONTROL_WORD ; A PROT 為輸入 ,B PROT 為輸出
OUT DX,AL ; PC6,7 為輸入
READ_I:
MOV AH,01 ;
INT 16H ; PRESS ANY KEY ESCAPE TO DOS
JNZ EXIT ;
IN AL,DX ; 讀取 C PROT
TEST AL,20H
JZ READ_I ; 測試 PC5 是否為 1 (BUFFER已滿)
MOV DX,PORT_C
MOV DX,PORT_A
IN AL,DX ; 讀取 A PROT DATA
MOV DX,PORT_B
OUT DX,AL ; 將 A PROT 所讀取的資料輸出到 B PROT
JMP READ_I
EXIT:
MOV AH,4CH ; RETURN DOS
INT 21H ;
END BEGIN ;
;*********************************
;*********************************
.MODEL small
includelib ios.lib
EXTRN newline:near,outdec:near,outhex:near,puts:near
.DATA
.CODE
start:
mov cx,1
again1:
push cx
mov cx,1
again2:
mov ax,cx
inc cx
cmp cx,10000
jc again2
pop cx
inc cx
cmp cx,10000
jc again1
call outdec
mov ah,4ch
int 21h
.STACK
END start
兩者之執行檔大小
組合語言程式: 731 bytes
C 語言程式:11,539 bytes
執行速度(在586-120CPU上)
組合語言程式:約3秒
C 語言程式:約8秒
.MODEL SMALL
EXTRN puts:near,indec:near,outdec:near,newline:near
includelib ios.lib
.STACK 100h
.DATA
msg1 DB 'please input original x-coordinate: ',0
msg2 DB 'please input original y-coordinate:',0
msg3 DB 'please input column no.: ',0
msg4 DB 'please input row no.: ',0
msg5 DB 'please press any key to continue: ',0
num1 DW 0
num2 DW 0
num3 DW 0
num4 DW 0
.CODE
begin:
mov ax,@data ; ┐ds 初值化
mov ds,ax ; ┘
mov si,OFFSET msg1 ; ┐印出提示字串
call puts ; ┘
call indec ; 輸入一個無號數值
call newline
MOV num1,ax ;
mov si,OFFSET msg2 ; ┐印出提示字串
call puts ; ┘
call indec ; 輸入一個無號數值
call newline
MOV num2,ax ;
mov si,OFFSET msg3 ; ┐印出提示字串
call puts ; ┘
call indec ; 輸入一個無號數值
call newline
MOV num3,ax ;
mov si,OFFSET msg4 ; ┐印出提示字串
call puts ; ┘
call indec ; 輸入一個無號數值
call newline
MOV num4,ax ;
PUSH DS
MOV AX,0
PUSH AX
;
MOV AH,0 ;SET GRAPHIC MODE
MOV AL,12H ;FOR VGA CARD
INT 10H ;640X480X16colors
;
MOV BL,0 ;SET INITIAL COLOR
MOV CX,num1 ;COLUMN#
MOV DX,num2 ;ROW#
AGAIN:
MOV AH,0CH ;WRITE PIXEL DOT
MOV AL,BL ;SET COLOR
INT 10H
INC CX ;INCREMENT COLUMN
CMP CX,num3 ;COLUMN
JB AGAIN ;NO -- LOOP
MOV CX,num1 ;YES - RESET COLUMN
INC BL ;CHANGE COLOR
AND BL,0FH ;LET COLOR WITHIN 0 -- 15
INC DX ;INCREMENT ROW
CMP DX,num4 ;ROW
JB AGAIN ;NO -- LOOP
mov si,OFFSET msg5 ; ┐印字串outmsg5
call puts ; ┘
call newline
mov ah,01h ;
int 21h
MOV AH,00h ;SET TEXT MODE
MOV AL,03h ;FOR VGA CARD
INT 10H
MOV AH,01h ;SET cursor
MOV Ch,00H ;type
MOV cl,12h ;
INT 10H
mov ah,4ch ; ┐結束程式
int 21h ; ┘
END begin
CODE SEGMENT
PROG PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACK
; INITIAL THE PROGRAM
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
START : CALL CLS
CALL ARD
;
CALL READ1
;
MOV AH,4CH
INT 21H
PROG ENDP
;******************************************
READ1 PROC
MOV SI,0
MOV CX,84
K1 : MOV DL,X1[SI]
MOV DH,Y1[SI]
MOV AH,2
MOV BH,0
INT 10H
INC SI
MOV AH,2
MOV DL,0DBH
INT 21H
LOOP K1
RET
READ1 ENDP
;*******************************************
;***************************************
CLS PROC
MOV AH,6
MOV AL,0
MOV CX,0
MOV DH,24
MOV DL,79
MOV BH,6
INT 10H
RET
CLS ENDP
;*****************************************
ARD PROC
MOV AH,0
MOV AL,0
MOV CX,24
K5 : MOV DL,AL
MOV DH,AH
MOV SUM1,AH
MOV AH,2
MOV BH,0
INT 10H
MOV AH,2
MOV DL,0DBH
INT 21H
MOV AH,SUM1
MOV DL,79
MOV DH,AH
MOV SUM1,AH
MOV AH,2
MOV BH,0
INT 10H
;
MOV AH,2
MOV DL,0DBH
INT 21H
MOV AH,SUM1
ADD AH,1
MOV AL,0
LOOP K5
;
MOV AH,0
MOV AL,0
MOV CX,79
KK5 : MOV DL,AL
MOV DH,0
MOV SUM2,AL
MOV AH,2
MOV BH,0
INT 10H
MOV AH,2
MOV DL,0DBH
INT 21H
;
MOV AL,SUM2
MOV DL,AL
MOV DH,23
MOV SUM2,AL
MOV AH,2
MOV BH,0
INT 10H
;
MOV AH,2
MOV DL,0DBH
INT 21H
MOV AL,SUM2
ADD AL,1
MOV AH,0
LOOP KK5
RET
ARD ENDP
;*****************************************
DELAY PROC
MOV CX,0FFFFH
N1 : ADD AX,5
PUSH AX
ADD BX,5
PUSH BX
POP BX
POP AX
SUB AX,5
SUB BX,5
LOOP N1
RET
DELAY ENDP
CODE ENDS
;=========================================================================
DATA SEGMENT
SUM0 DB ?
SUM1 DB ?
SUM2 DB ?
SUMM DB ?
SUM3 DB ?
X1 DB 6,7,8,9,10,19,20,21,22,23,34,45,56,69,70,71,72,73
DB 6,10,19,23,34,45,56,69,73
DB 6,10,19,23,34,45,56,69,73
DB 6,7,8,9,10,19,23,34,45,56,69,73
DB 6,10,19,23,34,45,56,69,73
DB 6,10,19,23,34,45,56,69,73
DB 6,7,8,9,10,19,20,21,22,23,34,45,56,69,70,71,72,73
Y1 DB 18 DUP(2),9 DUP(3),9 DUP(4),12 DUP(5)
DB 9 DUP(6),9 DUP(7),18 DUP(8)
X5 DB 14
DB 8,9,10,11,12,13,14,15,16,17,18,19,20
DB 12,13,14,15,16
DB 10,11,14,17,18
DB 8,9,14,19,20
DB 12,13,14,15,16
DB 15
DB 8,9,10,11,12,13,14,15,16,17,18,19,20
DB 15
DB 11,12,15
DB 13,14,15
Y5 DB 1 DUP(11)
DB 13 DUP(12)
DB 5 DUP(13)
DB 5 DUP(14)
DB 5 DUP(15)
DB 5 DUP(16)
DB 1 DUP(17)
DB 13 DUP(18)
DB 1 DUP(19)
DB 3 DUP(20)
DB 3 DUP(21)
X6 DB 38
DB 34,35,36,37,38,39,40,41,42
DB 32,33,34,35,36,37,38,39,40,41,42,43,44
DB 34,35,41,42
DB 36,37,39,40
DB 32,33,34,35,36,37,38,39,40,41,42,43,44
DB 34,35,36,37,38,39,40,41,42
DB 38
DB 38
DB 38
DB 38
Y6 DB 1 DUP(11)
DB 9 DUP(12)
DB 13 DUP(13)
DB 4 DUP(14)
DB 4 DUP(15)
DB 13 DUP(16)
DB 9 DUP(17)
DB 1 DUP(18)
DB 1 DUP(19)
DB 1 DUP(20)
DB 1 DUP(21)
X7 DB 64
DB 57,58,59,60,61,62,63,64,65,66,67,68,69,70,71
DB 55,56,62,63,65,66,72,73
DB 60,61,67,68
DB 58,59,69,70
DB 62,63,65,66
DB 60,61,67,68
DB 58,59,62,63,65,66,69,70
DB 57,58,62,63,65,66,71,72
DB 62,63,65,66
DB 62,63,64,65,66
Y7 DB 1 DUP(11)
DB 15 DUP(12)
DB 8 DUP(13)
DB 4 DUP(14)
DB 4 DUP(15)
DB 4 DUP(16)
DB 4 DUP(17)
DB 8 DUP(18)
DB 8 DUP(19)
DB 4 DUP(20)
DB 5 DUP(21)
DATA ENDS
;===========================================
STACK SEGMENT STACK
DW 64 DUP(?)
STACK ENDS
;===========================================
END PROG