(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 2Mov 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 3MOV 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 4mov 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 5loop 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 6mov 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 7DELAY 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 8PUSH 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 9BIEN_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