組合語言


回目錄

作業三解答


;********************************************************;

;* 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 ;


Pro33.其相對應之組合語言程式:

;*********************************

;*********************************

.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秒


pro34. TITLE 繪圖

.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


; pro37

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