1. Trang chủ
  2. » Giáo Dục - Đào Tạo

ĐỀ CƯƠNG ÔN TẬP MÔN VI XỬ LÝ.

10 406 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 108 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

(Dịch sang .EXE) 1) Mục lục: Bài tập 2: Tổ chức ch.tr Assembler 16bit đơn giản ; Assume Cs:Code_Seg, Ds:Data_Seg, Ss:Stack_Seg ; Cs trỏ tới mảng lệnh ; Ds trỏ tới mảng lệnh ; Ss trỏ tới mảng lệnh Code_Seg Segment Public Org 100H ; Chương trình bắt đầu từ địa chỉ 100 hex Extrn Write_char:Far ; Sử dụng thủ tục trong file thư viện Extrn Ket_thuc:Far Extrn Gotoxy :Far ; ; Thủ tục chính : Chuyển số thập ; phân thành từ mã Hexa trên ; màn hình ; Test_write_decimal Proc Far ; Mở thủ tục thập phân > Hexa Call Flag ; In cờ trạng thái Mov DX,1789 ; Hiển thị số 1789 thập phân Call write_decimal ; Gọi chương trình hiển thị Call Ket_thuc Ret Test_write_decimal Endp ; Write_decimal Proc Near Push AX Push CX Push DX Push SI Mov AX,DX Mov SI,10 Xor CX,CX Non_zero: Xor DX,DX Div SI Push DX Inc CX Or AX,AX Jne Non_zero Write_digit_loop: Pop DX Call write_hex_digit Loop Write_digit_loop End_decimal: Pop SI Pop DX Pop CX Pop AX Ret Write_decimal Endp ; Kết thúc thu tuc chinh ; ; Thủ tục in ra màn hình (sử dụng ; hàm dịch vụ của DOS trong PC ; để mô phỏng ch.tr cần viết ; Write_hex Proc Near Push CX Push DX Mov DH,DL Mov CX,4 Shr DL,CL Call Write_hex_digit Mov DL,DH And DL,0FH Call Write_hex_digit Pop DX Pop CX Ret Write_hex Endp ; Write_hex_digit Proc Near Push DX Cmp DL,10 Jae Hex_letter Ađ DL,0 Jmp short Write_digit Hex_letter: Add DL,A10 Write_digit: Call Write_char Pop DX Ret Write_hex_digit Eendp ; Flag Proc Near ; Cờ trạng thái Push AX Push DX Call Gotoxy Mov AX,Data_Seg Mov DS,AX MOV DX,Offset thong_bao ; Thông báo trạng thái Call Message Pop DX

Trang 1

Đề cơng ôn tập

môn vi xử lý.

I) Chơng trình ASSEMBLER

(Dịch sang *.EXE)

1) Mục lục:

Bài tập 2: Tổ chức ch.tr Assembler

16bit đơn giản

; -

Assume Cs:Code_Seg,

Ds:Data_Seg, Ss:Stack_Seg

; Cs trỏ tới mảng lệnh

; Ds trỏ tới mảng lệnh

; Ss trỏ tới mảng lệnh

Code_Seg Segment Public

Org 100H ; Chơng trình bắt

đầu từ địa chỉ 100 hex

Extrn Write_char:Far ; Sử dụng

thủ tục trong file th viện

Extrn Ket_thuc:Far

Extrn Gotoxy :Far

; -; Thủ tục chính : Chuyển số thập

; phân thành từ mã Hexa trên

; màn hình

Test_write_decimal Proc Far ;

Mở thủ tục thập phân -> Hexa

Call Flag ; In cờ trạng thái

Mov DX,1789 ; Hiển thị số

1789 thập phân Call write_decimal ; Gọi

chơng trình hiển thị

Call Ket_thuc

Ret

Test_write_decimal Endp

; -Write_decimal Proc Near

Push AX

Push CX

Push DX

Push SI

Mov AX,DX

Mov SI,10

Xor CX,CX

Non_zero:

Xor DX,DX

Div SI

Push DX

Inc CX

Or AX,AX

Jne Non_zero

Write_digit_loop:

Pop DX

Call write_hex_digit

Loop Write_digit_loop

End_decimal:

Pop SI

Pop DX

Pop CX

Pop AX

Ret

Write_decimal Endp ; Kết thúc

thu tuc chinh

; -; Thủ tục in ra màn hình (sử dụng

; hàm dịch vụ của DOS trong PC

; để mô phỏng ch.tr cần viết

; -Write_hex Proc Near

Push CX Push DX Mov DH,DL Mov CX,4 Shr DL,CL Call Write_hex_digit Mov DL,DH

And DL,0FH Call Write_hex_digit Pop DX

Pop CX Ret Write_hex Endp

; -Write_hex_digit Proc Near Push DX

Cmp DL,10 Jae Hex_letter Ađ DL,'0' Jmp short Write_digit Hex_letter:

Add DL,'A'-10 Write_digit:

Call Write_char Pop DX

Ret Write_hex_digit Eendp

; -Flag Proc Near ; Cờ trạng thái Push AX

Push DX Call Gotoxy Mov AX,Data_Seg Mov DS,AX MOV DX,Offset thong_bao

; Thông báo trạng thái Call Message

Pop DX Pop AX Ret Flag Endp

; -Message Proc Near

Push AX Push DX Push SI PushF Cld Mov SI,DX String_loop:

Lodsb

Or AL,AL ;K/tra hết dòng

thông báo ?

Jz End_string Mov DL,AL Call Write_char Jmp String_loop End_string:

Popf Pop SI Pop DX Pop AX Ret Message Endp

; -Code_Seg Ends ; Dòng mang

lệnh

; -Data_Seg Segment Public

Public Thong_bao Thong_bao db 'HELLOW! WORLD ',0Dh,0Ah,00h

db 0Dh,0Ah,00h Data_Seg Ends

; -Stack_Seg Segment Public

db 10 Dup('Stack');

Stack_Seg Ends

; -End Test_write_decimal ; Kết thúc ch.tr chính HEX_BIN

Bài tập 3: Chơng trình hiển thị

Buffer Ram

; -Assume CS:Code_Seg,

DS:Data_Seg, SS:stack_Seg

; CS Trỏ tới mảng lệnh Code_seg Segment Public Extrn Ket_thuc:Far Extrn Send_crlf:Far

; -; Thủ tục chính : In ra màn hình

; buffer Ram theo từng dòng trên

; 2 cửa sổ : Hexa và Ascii

; -Hien_thi Proc Far ; Mở thủ tục

hiển thị Mov AX,Data_seg

Mov DS,AX Mov BX,Offset

Buffer_offset Mov CX,16 ; Hiển thị 16 dòng Ram_buffer:

Call Hien_thi_dong ; Hiển thị

từng dòng 16 byte Call Send_crlf ; Xuống dòng về

đầu dòng Add BX,16 ; Tăng 16 bytes nữa

cho dòng tiếp Loop Ram_buffer ; Lặp lại với

số lần trong CX Call Ket_thuc

Hien_thi Endp

Extrn Write_char:Far

Hien_thi_dong Proc Near

; -; Thủ tục này in từng dòng, mỗi

; dòng 16 byte chứa trong

; Ram_buffer

; Trớc tiên ở cửa sổ Hexa rồi

; đến cửa sổ Ascii

Push AX

Push BX Push CX Push DX Mov CX,16 Push BX ;Offset cho cửa sổ

Ascii Hex_win:

Mov DL,[BX]

Call Write_hex ; Gọi ch.tr in ra

so HEX

1

Trang 2

Mov DL,' ' ;dl=20h là mã

khoảng trắng Call Write_char

Inc BX

Loop Hex_win

; - Xong cửa sổ

Mov DL,' '

Call Write_char ; Dãn cách 2

cửa sổ 2 khoảng trắng

Mov CX,16

Pop BX

Ascii_win:

Mov DL,[BX];

Call Write_char

Inc BX

Loop Ascii_win

Pop DX

Pop CX

Pop BX

Pop AX

Ret

Hien_thi_dong Endp ; Kết thúc

thủ tục hiển thị dàng

; -Write_nex Proc Near

Push CX

Mov DH,DL

Mov CX,4

Shr DL,CL

Call Write_hex_digit

Mov DL,DH

And DL,0Fh

Call Write_hex_digit

Pop CX

Ret

Write_hex Endp

; -Public Write_hex_digit

Extrn Write_char:Far

Write_hex_digit Proc Near

Push DX

Cmp DL,10

Jae Hex_letter

Add DL,'0'

Jmp Write_digit

Hex_letter:

Add DL,'A'-10

Write_digit:

Call Write_char

Pop DX

Ret

Write_hex_digit Endp

; -Code_seg Ends ; Dòng mang

lệnh

; -Data_seg Segment Public

Public Buffer_offset

Buffer_offset db 16 Dup(41h)

db 16 DUP(42h)

db 16 DUP(43h)

db 16 DUP(44h)

db 16 DUP(45h)

db 16 DUP(46h)

db 16 DUP(30h)

db 16 DUP(31h)

db 16 DUP(32h)

db 16 DUP(33h)

db 16 DUP(34h)

db 16 DUP(35h)

db 16 DUP(36h)

db 16 DUP(37h)

db 16 DUP(38h)

db 16 DUP(39h) Data_seg Ends

; -Stack_seg Segment Public

db 10 Dup('Stack') Stack_seg Ends

; -End hien_thi ; Kết thúc ch.tr

chính Hien_thi

Bài tập 4: Chơng trình cộng hai số

tự nhiên kích thớc 2 byte Assume CS:Code_seg, DS:Data_seg, SS:Stack_seg Code_seg Segment Public

; -; Mảng dữ liệu chứa các biến các

; thông báo cần thiết cho ch.trinh

Data_seg Segment Public

Buffer db 7 Dup(?) ; Đệm bộ

nhớ Digit db ?

n1 dw ? ; Số hạng thứ nhất

đợc chứa ở đây n2 dw ? ; Số hạng thứ hai sum d ? ; Tổng

Bien_get dw 0 ; Biến trung

gian Bien_2num dw 0 ; Biến trung

gian Promp1 db 'Nhap so thu 1: ' Promp2 db 'Nhap so thu 2: ' Promp3 db 'Tong so la : ' Fine Label Byte

Data_seg Ends

Extrn Writestring:Far ; ở File

th viện Bt4e.lib Extrn Getstring:Far

Extrn Ket_thuc:Far

; -; Thủ tục chính cộng 2 so TN

; -Addn Proc Far

mov ax,data_seg ; DS trỏ tới

mảng Data_seg Mov DS,AX

Mov DX,Offset Promp1 Mov CX, Offset Promp2 -

Offset Promp1 Call Writetext ; In dòng

' số hạng thứ nhất:' Call Getstr ; Chuẩn bị nhận số

hạng thứ nhất Call Str2num

Mov AX,[Bien_2num]

Mov n1,AX Mov DX,Offset Promp2 Mov CX,Offset Promp3 -

Offset Promp2 Call WRITETEXT ;

in dong 'so hang thu hai:'

CALL GETSTR ; chuan bi nhan so hang thu hai

CALL STR2NUM MOV AX,[BIEN_2NUM] MOV n2,AX

CALL ADDn1n2 MOV DX,OFFSET Promp3 MOV CX,OFFSET Fine-OFFSET Promp3

CALL WRITETEXT CALL WRITESum CALL KET_THUC ADDn ENDP

;

-;Doc mang hay File co the File trong BX,

;so luong byte trong CX Neu doc thanh

;cong thi con tro File se dat o ngay sau

; phan vua doc

; -GETSTR PROC NEAR

DATA_SEG SEGMENT PUBLIC EXTRN FLAG:WORD

DATA_SEG ENDS PUSH AX PUSH BX PUSH CX PUSH DX MOV BX,00H ; the file

MOV CX,07H ; so byte can doc

MOV DX,OFFSET BUFFER ; dat DS:DX vao dau mang BUFFER

CALL GETSTRING MOV AX,[FLAG] ; co FLAG chua bo byte thuc su doc duoc

SUB AX,02H MOV [BIEN_GET],AX POP DX

POP CX POP BX POP AX RET GETSTR ENDP

; -;Ghi mang hay File co the File trong BX,

;so luong byte trong CX Neu ghi thanh

;cong thi con tro File se dat o ngay sau

; phan vua ghi

; -WRITECHAR PROC NEAR PUSH AX

PUSH BX PUSH CX PUSH DX

2

Trang 3

MOV BX,01H ;the File

MOV CX,01H ; so

luong byte can ghi

MOV DX,OFFSET DIGIT

CALL WRITESTRING

POP DX

POP CX

POP BX

POP AX

RET

WRITECHAR ENDP

; -;chuyen so hang vao bien

; BIEN_2NUM

; -STR2NUM PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV CX,[BIEN_GET]

MOV AX,00H

MOV BX,10 ; chuan bi

nhan 10

MOV SI,OFFSET BUFFER ;

dat DS:SI vao dem BUFFER

MOV DH,00H

LOOP1:

MUL BX

MOV DL,[SI]

SUB DL,'0'

ADD AX,DX

INC SI ;tro tiep toi

byte sau cua dem BUFFER

LOOP LOOP1

MOV [BIEN_2NUM],AX

POP DX

POP CX

POP BX

POP AX

RET

STR2NUM ENDP

; -;thuc hien cong

; -ADDn1n2 proc near

PUSH AX

MOV AX, n1

ADD AX, n2

MOV SUM,AX

POP AX

RET

ADDn1n2 ENDP

; -; in tong len man hinh

; -WRITESum PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV AX, Sum

MOV BX,10

mov cx,0

GETADIGIT: ;su dung thuat toan chia lien tuc

MOV DX,0 DIV BX PUSH DX ;cat vao STACK so du chinh la chu so ;co trong so nho nhat hien hanh

Inc cx CMP AX,0000H

JZ WRITE jmp GETADIGIT WRITE:

POP DX ;khoi phuc lai cac chu so tu STACK theo

;thu tu nguoc lai ADD DL,'0'

MOV DIGIT,DL CALL WRITECHAR ; in tung so ra tu trai sang phai

dec cx cmp cx,0 jnz write;

POP DX POP CX POP BX POP AX RET WRITESum ENDP

; -WRITETEXT PROC NEAR PUSH BX

MOV BX,01H CALL WRITESTRING POP BX

RET WRITETEXT ENDP

; -CODE_SEG ENDS STACK_SEG SEGMENT PUBLIC

DB 10 DUP('STACK') STACK_SEG ENDS

; -END ADDn

Bài tập 5: Vẽ khung của sổ bằng

ký tự đồ hoạ

ASSUME cs:CODE_SEG,ds:DATA_SEG,ss:S TACK_SEG; Thong bao cho chuong trinh dich

; cac thanh ghi quan ly mang

; -; Phan nay khai bao cac hang ky hieu cho cac ky tu

; do hoa trong bang ma ASCII de ve khung

0bah ;Thanh ngang

0cdh ;Thanh dung

0c9h ;Thanh khep goc tren ben trai

0bbh ;Thanh khep goc tren ben phai

0c8h ;Thanh khep goc duoi ben trai

0bch ;Thanh khep goc ben phai

0cbh ;Thanh chu T

0cah ;Thanh chu T nguoc

0d1h ;Thanh vach manh

0cfh ;Thanh vach manh phia duoi

code_Seg Segment public

public write_pattern

extrn write_char:far ; 3 thu tuc

o ham thu vien extrn gotoXY :far ; extrn ket_thuc :far

; -;Thu tuc WRITE_PATTERN de ve khung bang cac ky tu

;do hoa cua bang ma ASCII

; -write_pattern proc far

data_Seg Segment public extrn Dong:byte ; bien dong man hinh TEXT

extrn Cot :byte ; bien cot man hinh TEXT

data_Seg ends cld ; dat co huong =

0 (Direction=0) mov ax,data_Seg ; cho DS tro toi mang DATA_SEG

mov ds,ax mov bx,02h ; mov dx,offset top_line_pattern;

DX tro toi CSDL cua duong ngang ; cua khung can ve

mov dong,05h ; lay toa do X

va Y vao bien 'dong' va 'cot' mov Cot, 00h ; (dong:5 cot:0)

Call gotoXY ; goi thu tuc dat con tro man hinh vao toa ; do XY da xac dinh

draw:

3

Trang 4

mov si,dx ; chuyen

OFFSET trong DX vao SI de su

dung

; lenh LODSB

pattern_loop:

lodsb ; nhan byte CSDL

vao AL cua bo VXL

or al,al ; kiem tra da toi

cuoi CSDL chua?

jz end_pattern ; neu roi thi

ket thuc

mov dl,al ; neu chua thi

chuyen AL vao DL

lodsb ; nhan tiep byte

tiep theo va chuyen

; vao AL

mov cl,al ; chuyen vao

thanh dem CL de su dung

; lenh LOOP

xor ch,ch

write_n_times : ; nhan nay in

ky tu trong DL voi so

; lan bang gia tri

chua trong CL

Call write_char ; goi thu tuc

in 1 ky tu trong DL ra man hinh

loop write_n_times

jmp pattern_loop

end_pattern:

dec bx

jz _end

mov dx,offset

bottom_line_pattern; Cho DX tro

toi CSDL cua

; duong ngang

phia duoi

mov dong,10h;

mov cot, 00h;

Call gotoXY;

jmp draw

_end:

Call ket_thuc;

write_pattern endp

code_Seg ends

data_Seg Segment public

; -; Cau truc cua duong ngang phia

tren

; tham so dau la ky tu do hoa, tham

so

; thu hai la so luong ky tu can in ra

; -top_line_pattern label byte

db ' ',7

db upper_left,1

db horizontal_bar,13

db top_t_bar,1

db horizontal_bar,13

db top_t_bar,1

db horizontal_bar,13

db top_t_bar,1

db horizontal_bar,13

db top_t_bar,1

db horizontal_bar,13

db upper_right,1

db 0 bottom_line_pattern label byte

db ' ',7

db lower_left,1

db horizontal_bar,13

db bottom_t_bar,1

db horizontal_bar,13

db bottom_t_bar,1

db horizontal_bar,13

db bottom_t_bar,1

db horizontal_bar,13

db bottom_t_bar,1

db horizontal_bar,13

db lower_right,1

db 0 data_Seg ends

; -STACK_SEG SEGMENT PUBLIC

DB 10 DUP('STACK');

STACK_SEG ENDS end write_pattern

Bài tập 6: Vẽ khung cửa sổ bằng

ký tự đồ hoạ cùng CSLD Chứa trong của sổ Hex và Ascii

; -ASSUME

cs:CODE_SEG,ds:DATA_SEG,ss:S TACK_SEG; Thong bao cho chuong trinh dich

; cac thanh ghi quan ly mang

; -; Phan nay khai bao cac hang ky hieu cho cac ky tu

; do hoa trong bang ma ASCII de ve khung

0bah ;Thanh ngang

0cdh ;Thanh dung

0c9h ;Thanh khep goc tren ben trai

0bbh ;Thanh khep goc tren ben phai

0c8h ;Thanh khep goc duoi ben trai

0bch ;Thanh khep goc ben phai

0cbh ;Thanh chu T

0cah ;Thanh chu T nguoc top_tick equ 0d1h ;Thanh vach manh

0cfh ;Thanh vach manh phia duoi

code_Seg Segment public

; -Bài tập 3: Chơng trình hiển thị

buffer Ram

; -EXTRN KET_THUC:FAR EXTRN SEND_CRLF:FAR

; -;Thu tuc chinh : In ra man hinh buffer

;RAM theo tung dong tren 2 cua so:

;HEXA va ASCII

; -HIEN_THI PROC FAR ;

mo thu tuc HIEN THI MOV AX,DATA_SEG MOV DS,AX

CALL WRITE_TOP_PATTERN; CALL SEND_CRLF

MOV BX,OFFSET BUFFER_OFFSET

MOV CX,16 ; hien thi 16 dong

RAM_BUFFER:

CALL HIEN_THI_DONG

; hien thi tung dong 16 byte CALL SEND_CRLF ; xuong dong ve dau dong

ADD BX,16 ; tang

16 bytes nua cho dong tiep

LOOP RAM_BUFFER ; lap lai voi

so lan trong CX

CALL WRITE_BOTTOM_PATTERN; CALL KET_THUC

HIEN_THI ENDP

EXTRN WRITE_CHAR:FAR HIEN_THI_DONG PROC NEAR

; -; thu tuc nay in tung dong, moi dong I

; 16 byte chua trong RAM_BUFFER : I

; truoc tien o cua so HEXA roi den I

; cua so ASCII I

PUSH AX

PUSH BX PUSH CX PUSH DX MOV DL,' ' ; MOV CX,7

write_n_times : ; nhan nay in

ky tu trong DL voi so ; lan bang gia tri chua trong CL

Call write_char ; goi thu tuc

in 1 ky tu trong DL ra man hinh

4

Trang 5

loop write_n_times

MOV DL,VERTICAL_BAR

CALL WRITE_CHAR

MOV CX,16

PUSH BX ; offset

cho cua so ASCII

HEX_WIN:

MOV DL,[BX];

CALL WRITE_HEX ;

goi ch.tr in ra so HEX

MOV DL,' ' ;

dl=20hexa la ma khoang trang

CALL WRITE_CHAR

INC BX

LOOP HEX_WIN

; - ;

xong cua so HEX_WIN

MOV DL,VERTICAL_BAR

CALL WRITE_CHAR

MOV CX,16

POP BX

ASCII_WIN:

MOV DL,[BX];

CALL WRITE_CHAR

INC BX

LOOP ASCII_WIN

MOV

DL,VERTICAL_BAR

CALL WRITE_CHAR

POP DX

POP CX

POP BX

POP AX

RET

HIEN_THI_DONG

ENDP ; ket thuc thu

tuchien thi dong

; -WRITE_HEX PROC NEAR

PUSH CX

MOV DH,DL

MOV CX,4

SHR DL,CL

CALL WRITE_HEX_DIGIT

MOV DL,DH

AND DL,0FH

CALL WRITE_HEX_DIGIT

POP CX

RET

WRITE_HEX ENDP

; -PUBLIC WRITE_HEX_DIGIT

EXTRN WRITE_CHAR:FAR

NEAR

PUSH DX

CMP DL,10

JAE HEX_LETTER

ADD DL,'0' JMP WRITE_DIGIT HEX_LETTER:

ADD DL,'A'-10 WRITE_DIGIT:

CALL WRITE_CHAR POP DX

RET WRITE_HEX_DIGIT ENDP

public write_top_pattern extrn write_char:far ; 3 thu tuc

o ham thu vien extrn gotoXY :far ; extrn ket_thuc :far

; -;Thu tuc WRITE_PATTERN de ve khung bang cac ky tu

;do hoa cua bang ma ASCII

; -write_top_pattern proc near data_Seg Segment public extrn Dong:byte ; bien dong man hinh TEXT

extrn Cot :byte ; bien cot man hinh TEXT

data_Seg ends

PUSH AX

PUSH BX PUSH CX PUSH DX cld ; dat co huong =

0 (Direction=0) mov dx,offset top_line_pattern;

DX tro toi CSDL cua duong ngang ; cua khung can ve

mov dong,05 ; lay toa do X

va Y vao bien 'dong' va 'cot' mov Cot, 00h ; (dong:5 cot:0)

Call gotoXY ; goi thu tuc dat con tro man hinh vao toa

; do XY da xac dinh

mov si,dx ; chuyen OFFSET trong DX vao SI de su dung

; lenh LODSB pattern_top_loop:

lodsb ; nhan byte CSDL vao AL cua bo VXL

or al,al ; kiem tra da toi cuoi CSDL chua?

jz end_top_pattern ; neu roi thi ket thuc

mov dl,al ; neu chua thi chuyen AL vao DL

lodsb ; nhan tiep byte tiep theo va chuyen

; vao AL

mov cl,al ; chuyen vao thanh dem CL de su dung ; lenh LOOP xor ch,ch

write_n_times1 : ; nhan nay

in ky tu trong DL voi so ; lan bang gia tri chua trong CL

Call write_char ; goi thu tuc in 1 ky tu trong DL ra man hinh loop write_n_times1

jmp pattern_top_loop end_top_pattern:

POP DX POP CX POP BX POP AX ret

write_top_pattern endp

; -public write_bottom_pattern write_bottom_pattern proc near data_Seg Segment public extrn Dong:byte ; bien dong man hinh TEXT

extrn Cot :byte ; bien cot man hinh TEXT

data_Seg ends

PUSH AX

PUSH BX PUSH CX PUSH DX cld ; dat co huong =

0 (Direction=0)

mov dx,offset bottom_line_pattern; DX tro toi CSDL cua duong ngang

; cua khung can ve

mov dong,22 ; lay toa do X

va Y vao bien 'dong' va 'cot' mov Cot, 00h ; (dong:5 cot:0)

Call gotoXY ; goi thu tuc dat con tro man hinh vao toa

; do XY da xac dinh

mov si,dx ; chuyen OFFSET trong DX vao SI de su dung

; lenh LODSB pattern_bottom_loop:

lodsb ; nhan byte CSDL vao AL cua bo VXL

or al,al ; kiem tra da toi cuoi CSDL chua?

jz end_bottom_pattern ; neu roi thi ket thuc

5

Trang 6

mov dl,al ; neu chua

thi chuyen AL vao DL

lodsb ; nhan tiep

byte tiep theo va chuyen

; vao AL

mov cl,al ; chuyen vao

thanh dem CL de su dung

; lenh LOOP

xor ch,ch

write_n_times2 : ; nhan nay

in ky tu trong DL voi so

; lan bang gia tri

chua trong CL

Call write_char ; goi thu tuc

in 1 ky tu trong DL ra man hinh

loop write_n_times2

jmp pattern_bottom_loop

end_bottom_pattern:

POP DX

POP CX

POP BX

POP AX

ret

write_bottom_pattern endp

code_Seg ends

data_Seg Segment public

; -; Cau truc cua duong ngang phia

tren

; tham so dau la ky tu do hoa, tham

so

; thu hai la so luong ky tu can in ra

; -top_line_pattern label byte

db ' ',7

db upper_left,1

db horizontal_bar,11

db top_t_bar,1

db horizontal_bar,11

db top_t_bar,1

db horizontal_bar,11

db top_t_bar,1

db horizontal_bar,12

db top_t_bar,1

db horizontal_bar,16

db upper_right,1

db 0

bottom_line_pattern label byte

db ' ',7

db lower_left,1

db horizontal_bar,11

db bottom_t_bar,1

db horizontal_bar,11

db bottom_t_bar,1

db horizontal_bar,11

db bottom_t_bar,1

db horizontal_bar,12

db bottom_t_bar,1

db horizontal_bar,16

db lower_right,1

db 0

PUBLIC BUFFER_OFFSET BUFFER_OFFSET DB 16 DUP(41H)

DB 16 DUP(42H)

DB 16 DUP(43H)

DB 16 DUP(44H)

DB 16 DUP(45H)

DB 16 DUP(46H)

DB 16 DUP(30H)

DB 16 DUP(31H)

DB 16 DUP(32H)

DB 16 DUP(33H)

DB 16 DUP(34H)

DB 16 DUP(35H)

DB 16 DUP(36H)

DB 16 DUP(37H)

DB 16 DUP(38H)

DB 16 DUP(39H)

; -data_Seg ends

; -STACK_SEG SEGMENT PUBLIC

DB 10 DUP('STACK');

STACK_SEG ENDS

; -END HIEN_THI ; ket thuc ch.tr chinh HIEN_THI

Bài tập 7: Vẽ hình chữ nhật trong

chế độ đồ hoạ trên màn hình 640x480 pixel

; -ASSUME

CS:CODE_SEG,DS:DATA_SEG,SS :STACK_SEG

CODE_SEG SEGMENT PUBLIC EXTRN MODE_GRAPHIC: FAR

; Cac thu tuc nay o FILE thu vien EXTRN KET_THUC : FAR EXTRN WRITE_DOT : FAR

; -;Thu tuc BOX dung de: - ve canh day phia tren tu trai sang phai

; - ve hai canh ben tu tren xuong duoi

; - ve canh day phia duoi tu trai sang phai

; -BOX PROC FAR

CALL MODE_GRAPHIC ; khoi dong che do do hoa (GRAPHIC) MOV AX,DATA_SEG ; cho

DS tro toi mang du lieu MOV DS,AX

MOV CX,[BOTCOL] ; CX chua so pixel canh day phia tren SUB CX,[TOPCOL]

MOV SI,[TOPROW] ; SI chua toa do dong phia tren (ROW) MOV DI,[TOPCOL] ; DI chua toa do cot phia tren (COL)

TOPLOOP: ; vong lap ve canh day phia tren

CALL WRITE_DOT ; goi chuong trinh in pixel

INC DI ; sang cot ke ben phai de ve tiep

CALL DELAY ; giu cham

de quan sat LOOP TOPLOOP MOV CX,[BOTROW]

SUB CX,[TOPROW] ; CX chua so pixel canh ben

MOV SI,[TOPROW]

SIDELOOP: ;vong lap ve hai canh ben

MOV DI,[TOPCOL]

CALL WRITE_DOT MOV DI,[BOTCOL]

CALL WRITE_DOT INC SI

CALL DELAY LOOP SIDELOOP MOV CX,[BOTCOL]

SUB CX,[TOPCOL] ; CX chua so pixel canh day phia duoi MOV SI,[BOTROW]

MOV DI,[TOPCOL]

BOTLOOP: ; vong lap ve canh day phia duoi

CALL WRITE_DOT INC DI

CALL DELAY LOOP BOTLOOP CALL KET_THUC BOX ENDP

; -; Thu tuc nay dung de giu cham qua trinh in

; pixel ra man hinh de de theo roi Bien bo nho

; DELA an dinh thoi gian giu cham can thiet

; -DELAY PROC near ;mo thu tuc giu cham

PUSH AX PUSH BX MOV AX,DELA ; gia tri giu cham DELA -> AX

LOOP1: MOV BX,0FFFH ; BX chua gia tri giu cham cho vong ; lap trong LOOP2 LOOP2: DEC BX ; giam

BX di 1 don vi JNZ LOOP2 ; nhay ve LOOP2 neu chua rong (BX<>0) DEC AX ; giam AX di

1 don vi JNZ LOOP1 ; nhay ve LOOP1 neu chua rong (BX<>0) POP BX

POP AX RET

6

Trang 7

DELAY ENDP

; -CODE_SEG ENDS ; dong mang

lenh

; -DATA_SEG SEGMENT PUBLIC

TOPROW DW 50 ; bien bo

nho WORD cho toa do dong phia

tren

TOPCOL DW 100 ; bien bo

nho WORD cho toa do cot phia

tren

BOTROW DW 400 ; bien bo

nho WORD cho toa do dong phia

duoi

BOTCOL DW 600 ; bien bo

nho WORD cho toa do cot phia

duoi

DELA DW 20 ; bien bo nho

WORD cho do giu cham

PUBLIC COLOR

COLOR DB 15 ; bien bo nho

BYTE cho do mau pixel

DATA_SEG ENDS

; -STACK_SEG SEGMENT PUBLIC

DB 100 DUP('STACK')

STACK_SEG ENDS

; -END BOX ; ket thuc ch.tr chinh

BOX.ASM

II) Chơng trình ASSEMBLER

(Dịch sang *.COM)

Bài tập 1: Tổ chức chơng trình

Assembler đơn giản

CODE_SEG,DATA_SEG

ASSUME CS:CGROUP,DS:CGROUP ;

CS tro toi manh lenh

CODE_SEG SEGMENT PUBLIC

ORG 100H ;

bat dau tu dia chi 100 hex

EXTRN KET_THUC:NEAR

EXTRN INRA :NEAR

; -;Thu tuc chinh : chuyen byte ma

HEX

;thanh tu ma nhi phan tren man

hinh

; -HEX_NHI PROC NEAR ; mo

thu tuc HEXA >bieu dien NHI

PHAN

MOV BL,8AH ; hien thi so

8A hexa

CALL HIEN_THI ; goi ch.tr

hien thi

CALL KET_THUC

HEX_NHI ENDP

HIEN_THI PROC NEAR

MOV CX,08H DOI_MA:

MOV DL,0H RCL BL,1H ADC DL,30H CALL INRA ; goi thu tuc in

ra man hinh tung bit tu file thu vien LOOP DOI_MA

HIEN_THI ENDP ; ket thuc thu tuc chinh

; -CODE_SEG ENDS ; dong mang lenh

;&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&

DATA_SEG SEGMENT PUBLIC DATA_SEG ENDS

;&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&

END HEX_NHI ; ket thuc ch.tr chinh HEX_BIN

Bài tập 2: Tổ chức chơng trình

Assembler đơn giản

CODE_SEG,DATA_SEG

ASSUME CS:CGROUP,DS:CGROUP ;

CS tro toi manh lenh ; DS tro toi manh lenh

; SS tro toi manh lenh

CODE_SEG SEGMENT PUBLIC ORG 100H ; bat dau tu dia chi 100 hex

EXTRN WRITE_CHAR:NEAR

; su dung thu tuc trong file thu vien EXTRN KET_THUC :NEAR EXTRN GOTOXY :NEAR

; -;Thu tuc chinh : chuyen so thap phan

;thanh tu ma HEXA tren man hinh

; -TEST_WRITE_DECIMAL PROC NEAR ; mo thu tuc thap phan -> HEXA

CALL FLAG ; in co trang thai

MOV DX,1789 ; hien thi so 1789 THAP PHAN

CALL WRITE_decimal ; goi ch.tr hien thi

CALL KET_THUC TEST_WRITE_DECIMAL ENDP

; -WRITE_DECIMAL PROC NEAR PUSH AX

PUSH CX PUSH DX PUSH SI MOV AX,DX MOV SI,10 XOR CX,CX NON_ZERO:

XOR DX,DX DIV SI PUSH DX INC CX

OR AX,AX JNE NON_ZERO WRITE_DIGIT_LOOP:

POP DX CALL WRITE_HEX_DIGIT LOOP WRITE_DIGIT_LOOP END_DECIMAL:

POP SI POP DX POP CX POP AX RET WRITE_DECIMAL ENDP ; ket thuc thu tuc chinh

; -;Thu tuc in ra man hinh (su dung ham dich vu

; cua DOS trong PC de mo phong ch.tr can viet

; -WRITE_HEX PROC NEAR PUSH CX

PUSH DX MOV DH,DL MOV CX,4 SHR DL,CL CALL WRITE_HEX_DIGIT MOV DL,DH

AND DL,0FH CALL WRITE_HEX_DIGIT POP DX

POP CX RET WRITE_HEX ENDP

NEAR PUSH DX CMP DL,10 JAE HEX_LETTER ADD DL,'0'

JMP SHORT WRITE_DIGIT HEX_LETTER:

ADD DL,'A'-10 WRITE_DIGIT:

CALL WRITE_CHAR POP DX

RET WRITE_HEX_DIGIT ENDP

; -FLAG PROC NEAR; co trang thai

PUSH DX CALL GOTOXY LEA DX,THONG_BAO ; thong bao trang thai

CALL MESSAGE POP DX

RET FLAG ENDP

; -MESSAGE PROC NEAR

7

Trang 8

PUSH AX

PUSH DX

PUSH SI

PUSHF

CLD

mov SI,DX

STRING_LOOP:

LODSB

OR AL,AL ; k/tra

het dong thong bao?

JZ END_STRING

MOV DL,AL

CALL WRITE_CHAR

JMP STRING_LOOP

END_STRING:

POPF

POP SI

POP DX

POP AX

RET

MESSAGE ENDP

; -CODE_SEG ENDS ; dong mang

lenh

; -DATA_SEG SEGMENT PUBLIC

PUBLIC THONG_BAO

THONG_BAO DB

',0DH,0AH,00H

DB 0DH,0AH,00H

DATA_SEG ENDS

;&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&&&

END

TEST_WRITE_DECIMAL ; ket

thuc ch.tr chinh HEX_BIN

Bài tập 3: Chơng trình hiển thị

Buffer Ram

; -Cgroup Group Code_seg,

Data_seg

Assume CS:Cgroup,

DS:Cgroup ; CS trỏ tới

mảng lệnh Code_seg Segment Public

Org 100h ; Bắt đầu từ địa chỉ

100 hex Extrn Ket_thuc:Near

Extrn Send_crlf:Near

; -; Thủ tục chính : In ra màn hình

; buffer Ram theo từng dòng trên

; 2 cửa sổ Hexa và Ascii

; -Hien_thi Proc Near ; Mở thủ tục

hiển thị Xor DX,DX ; Bắt đầu từ offset

DX=0000 h Mov CX,16 ; Hiển thị 16 dàng

Ram_buffer:

Call Hien_thi_dong ; Hiển thị

từng dòng 16 byte Call Send_crlf ; Xuống dòng về

đầu dòng Add DX,16 ; Tăng 16 bytes nữa

cho dòng tiếp

Loop Ram_buffer ; Lặp lại với

số lần trong CX Call Ket_thuc

Hien_thi Endp

; -Extrn Write_char:Near

Hien_thi_dong Proc Near

; -; Thủ tục này in từng dòng, mỗi

; dòng 16 byte chứa trong

; Ram_buffer trớc tiên ở cửa sổ

; Hexa rồi đến cửa sổ Ascii

; Chú ý: Nếu muốn hiển thị cửa

; sổ Ascii trớc rồi mới đến Hexa

; thi thay theo thứ tự:

; Ascii_win:

; Mov DL,’ ‘

; Hex_win:

; Pop DX

Push BX

Push CX Push DX Mov BX,DX ; Chuyển offset

cho BX Mov CX,16 ; In ra 16 cột

Ascii Push BX ; Offset cho cửa sổ

Ascii Hex_win:

Mov DL,Buffer_offset[BX]

Call Write_hex ; Gọi ch.tr in ra

số hex Mov DL,' ' ; dl = 20h là mã

khoảng trắng Call Write_char

Inc BX Loop Hex_win

; Xong cửa sổ Hex_win

Mov DL,' ' Call Write_char ; Dãn cách 2

cửa sổ 2 khoảng trắng

Mov CX,16 ; In ra 16 cột bên

cửa sổ Hex Pop BX

Ascii_win:

MOV DL,Buffer_offset[BX]

Call Write_char Inc BX

Loop Ascii_win

Pop DX Pop CX Pop BX Ret

Hien_thi_dong Endp ; Kết thúc

thủ tục hiển thị dòng

; -Write_hex Proc Near

Push CX Push DX Mov DH,DL ; Chuyển bit thấp

lên bít cao để làm gì ? Mov CX,4

Shr DL,CL ; Shift right Call Write_hex_digit Mov DL,DH ; Trả giá trị cho dl And DL,0Fh

Call Write_hex_digit Pop DX

Pop CX Ret Write_hex Endp

; -Extrn Write_char:Near

Write_hex_digit Proc Near Push DX

Cmp DL,10;compare dl with 10 Jae Hex_letter ;if equal then

jump to Hex_letter Add DL,'0' ;dl cộng với mã Asii

của 0 Jmp Short Write_digit Hex_letter:

Add DL,'A'-10 Write_digit:

Call Write_char Pop DX

Ret Write_hex_digit Endp

; -Code_seg Ends ; Dong mang

lệnh

; -Data_seg Segment Public

Public Buffer_offset Buffer_offset db 16 Dup(1Ah)

db 16 Dup(1Bh)

db 16 Dup(1Ch)

db 16 Dup(1Dh)

db 16 Dup(1Eh)

db 16 Dup(1Fh)

db 16 Dup(20h)

db 16 Dup(21h)

db 16 Dup(22h)

db 16 Dup(23h)

db 16 Dup(24h)

db 16 Dup(25h)

db 16 Dup(26h)

db 16 Dup(27h)

db 16 Dup(28h)

db 16 Dup(29h) Data_seg Ends

; -End Hien_thi ; Kết thúc ch.tr

chính Hien_thi

Bài tập 4: Cộng hai số tự nhiên

kích thớc 2 byte

CODE_SEG,DATA_SEG

ASSUME CS:CGROUP,DS:CGROUP

CODE_SEG SEGMENT PUBLIC org 100h

; - DATA_SEG SEGMENT PUBLIC BUFFER DB 7 DUP(?) DIGIT DB ?

n1 DW ? n2 DW ? sum DW ?

BIEN_GET DW 0

8

Trang 9

BIEN_2NUM DW 0

Promp1 DB 'Nhap so thu 1: '

Promp2 DB 'Nhap so thu 2: '

Promp3 DB 'Tong so la: '

Fine LABEL BYTE

DATA_SEG ENDS

; -

EXTRN WRITESTRING:NEAR

EXTRN GETSTRING:NEAR

EXTRN KET_THUC:NEAR

; -ADDn PROC NEAR

LEA DX, Promp1

MOV CX, Promp2- Promp1

CALL WRITETEXT

CALL GETSTR

CALL STR2NUM

MOV AX,[BIEN_2NUM]

MOV n1,AX

LEA DX, Promp2

MOV CX,Promp3-Promp2

CALL WRITETEXT

CALL GETSTR

CALL STR2NUM

MOV AX,[BIEN_2NUM]

MOV n2,AX

CALL ADDn1n2

LEA DX,Promp3

MOV CX,Fine-Promp3

CALL WRITETEXT

CALL WRITESum

CALL KET_THUC

ADDn ENDP

; -GETSTR PROC NEAR

DATA_SEG SEGMENT PUBLIC

EXTRN FLAG:WORD

DATA_SEG ENDS

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV BX,00H

MOV CX,07H

LEA DX,BUFFER

CALL GETSTRING

MOV AX,[FLAG]

SUB AX,02H

MOV [BIEN_GET],AX

POP DX

POP CX

POP BX

POP AX

RET

GETSTR ENDP

; -WRITECHAR PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV BX,01H

MOV CX,01H

LEA DX,DIGIT

CALL WRITESTRING POP DX

POP CX POP BX POP AX RET WRITECHAR ENDP

; -STR2NUM PROC NEAR PUSH AX

PUSH BX PUSH CX PUSH DX MOV CX,[BIEN_GET]

MOV AX,00H MOV BX,10 LEA SI,BUFFER MOV DH,00H LOOP1:

MUL BX MOV DL,[SI]

SUB DL,'0' ADD AX,DX INC SI LOOP LOOP1 MOV [BIEN_2NUM],AX POP DX

POP CX POP BX POP AX RET STR2NUM ENDP

; -ADDn1n2 proc near PUSH AX

MOV AX,n1 ADD AX,n2 MOV SUM,AX POP AX

RET ADDn1n2 ENDP

; -WRITESum PROC NEAR PUSH AX

PUSH BX PUSH CX PUSH DX MOV AX,Sum MOV BX,10 mov cx,0 GETADIGIT:

MOV DX,0 DIV BX PUSH DX inc cx CMP AX,0000H

JZ WRITE jmp GETADIGIT WRITE:

POP DX ADD DL,'0' MOV DIGIT,DL CALL WRITECHAR dec cx

cmp cx,0 jnz write;

POP DX POP CX POP BX POP AX RET WRITESum ENDP

; -WRITETEXT PROC NEAR PUSH BX

MOV BX,01H CALL WRITESTRING POP BX

RET WRITETEXT ENDP

; -CODE_SEG ENDS END ADDn

III) Phụ lục III một số điều về hệ

vi xử lý 16bit Intel

1) Cách bố trí các thanh ghi cờ trong hệ vi xử lý 16bit Intel

N15 N8

N7 N0

Chú thích:

+ C: Cờ nhớ (Carry) + P: Cờ chẵn lẻ (Parity) + A: Cờ nhớ phụ + Z: Cờ rỗng (Zero) + S: Cờ dấu (Sign) + T: Cờ bẫy (Trap) + I: Cờ ngắt (Interrupt) + D: Cờ hớng (Derection) + O: Cờ tràn (Oterflow) + IO:

+ PL: Previlege Level + NT: Nested Task

IV) Phụ lục III tóm tắt các lệnh, kiến thức về bộ vi xử lý (micro proccessor)

8 bit Intel 1) XCHG dest,source

Chức năng: Hoán chuyển nội dung của hai toán hạng nguồn và đích

Ta chỉ có thể hoán chuyển giữa thanh ghi và thanh ghi hoặc giữa thanh ghi và bộ nhớ

2)

V) Cơ chế quản lý địa chỉ của 80x86 và cơ chế ngắt

1) cơ chế quản lý không gian bộ nhớ :vxl16/32 bit

- mảng nhớ

- đ/c cơ sở hình vẽ

Đ/c cở sở

Kích thớc mảng

9

Trang 10

Đợc quyền thâm nhập

Đ/c thực :

Bộ chọn mảng +offset

Các bít cao của đ/c

đ/c ảo :bộ chọn mảng

IT RPL

Đặc quyền yêu cầu

Phân biệt vùng nhớ  

 

1 0

CucBo ToanCuc

Kết hợp: 14bit + 16bit offset =

30bit -> 230 = 1GB

a) Bộ mô tả mảng dl

Cho hệ VXL từ 386 trở lên

P D PL 1 0 ED W A Đ/c cơ sở A23-A16

Địa chỉ cơ sở A15 - A0

Giới hạn L15 - L0

b) Bộ mô tả mã lệnh

Chú thích:

+ P: Present

+ DPL-Desriptor

+ 11: Mảng lệnh

+ C: Conforming

0

1

D u ocQ uyen D P L o fbo M oT aC hua C T con

D u ocQ uyen D P L o fb oM oT a G oi

0

1

ChiThucHien

VuaThucHienVuaDoc

+ A:Accerr

Cho hệ VXL từ 80386

P DPL 1 1 C R A A23-A16

A15 - A0

L15 - L0

lý từ địa chỉ ảo.

Bộ chọn TI DPL OFFSET

0-Toàn cục

1-Cục bộ

RAM RAM

Ngăn nhớ Bộ

mô tả Địa chỉ cơ sở

mảng A23 - A0

Kích thớc mảng

d) Các thanh ghi quản lý địa chỉ ảo

2 Byte - 1 Byte - 3 Byte - 2

Byte

CS Byte Đ/c Kích Phần kín dùng

DS đặc cơ sở thớc để sao bảng

ES tả A23 Mảng mô tả mảng

SS A0 L15-0 (tự động)

Phần kín Phần hở

(63-48) (47-15)

Hệ vi xử lý 16 bit Intel

10

Ngày đăng: 13/05/2016, 14:07

TỪ KHÓA LIÊN QUAN

w