KỸ THUẬT VI XỬ LÝ ; ; BAI TAP 1 : Tổ chức chương trình ASSEMBLER16 đơn giảm ; CGROUP GROUP CODE_SEG,DATA_SEG ASSUME CS:CGROUP,DS:CGROUP ; CS trỏ tới manh lenh CODE_SEG SEGMENT PUBLIC ORG 100H ; bat dau từ dia chi 100 hex EXTRN KET_THUC:NEAR EXTRN INRA :NEAR ; ; Thủ tục chính : Chuyển byte mã HEX thành từ mã nhị phân trên màn hình ; HEX_NHị PROC NEAR ; mở thủ tục HEXA >biểu diễn NHị PHAN MOV BL,8AH ; hiển thị số 8A hexa CALL HIEN_THI ; gọi chương trình hiển thị CALL KET_THUC HEX_NHị ENDP HIEN_THI PROC NEAR MOV CX,08H DOI_MA: MOV DL,0H RCL BL,1H ADC DL,30H CALL INRA ; gọi thủ tục in ra màn hình từng bit từ file Thư viện LOOP DOI_MA HIEN_THI ENDP ; kết thúc Thủ tục chính ; CODE_SEG ENDS ; dòng mang lệnh ; DATA_SEG SEGMENT PUBLIC DATA_SEG ENDS ; END HEX_NHị ; kết thúc chương trình chính HEX_BIN ;
Trang 1Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CGROUP,DS:CGROUP ; CS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC
ORG 100H ; bat dau tõ dia chi 100 hex
EXTRN KET_THUC:NEAR
EXTRN INRA :NEAR
-
; -; Thñ tôc chÝnh : ChuyÓn byte m· HEX thµnh tõ m· nhÞ ph©n trªn mµn h×nh
-
; -HEX_NHÞ PROC NEAR ; më thñ tôc HEXA >biÓu diÔn NHÞ PHAN
MOV BL,8AH ; hiÓn thÞ sè 8A hexa
CALL HIEN_THI ; gäi ch¬ng tr×nh hiÓn thÞ
; -CODE_SEG ENDS ; dßng mang lÖnh
CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CGROUP,DS:CGROUP; CS trá tíi m¶ng lÖnh
Trang 2Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
RET
INRA ENDP
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de m« pháng)
; CS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC
EXTRN KET_THUC:FAR ; gäi cac thñ tôc File Th viÖn
EXTRN INRA :FAR
Trang 3Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CGROUP,DS:CGROUP ; CS trá tíi manh lenh
; DS trá tíi manh lenh
; SS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC
ORG 100H ; bat dau tõ dia chi 100 hex
EXTRN WRITE_CHAR:NEAR ; sö dông thñ tôc trong file Th viÖn
EXTRN KET_THUC :NEAR
Trang 4Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
EXTRN GOTOXY :NEAR
MOV DX,1789 ; hiÓn thÞ sè 17 THAP PHAN
CALL WRITE_decimal ; gäi ch¬ng tr×nh hiÓn thÞ
; -;Thñ tôc in ra mµn h×nh (sö dông ham dich vu
; cua DOS trong PC de më pháng ch¬ng tr×nh can viet
Trang 5Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
Trang 6; -Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; Tæ chøc FILE Th viÖn sö dông ham dich vu
; cua DOS va BIOS PC de më pháng mot sè chuc
; nang cua he vi xu ly 16 bit can thiet ke
; -CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CGROUP,DS:CGROUP
; DS trá tíi manh lenh
; SS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC ; më mang m· lenh
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
Trang 7Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
ASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG
; CS trá tíi manh lenh
; DS trá tíi manh lenh
; SS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC
ORG 100H ; bat dau tõ dia chi 100 hex
EXTRN WRITE_CHAR:FAR ; sö dông thñ tôc trong file Th viÖn
EXTRN KET_THUC :FAR
EXTRN GOTOXY :FAR
MOV DX,1789 ; hiÓn thÞ sè 17 THAP PHAN
CALL WRITE_decimal ; gäi ch¬ng tr×nh hiÓn thÞ
; -;Thñ tôc in ra mµn h×nh (sö dông ham dich vu
; cua DOS trong PC de më pháng ch¬ng tr×nh can viet
Trang 8Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
Trang 9; -Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
CODE_SEG ENDS ; dßng mang lÖnh
; -; Tæ chøc FILE Th viÖn sö dông ham dich vu
; cua DOS va BIOS PC de më pháng mot sè chuc
; nang cua he vi xu ly 16 bit can thiet ke
; -ASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG
; DS trá tíi manh lenh
; SS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC ; më mang m· lenh
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
Trang 10Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CGROUP,DS:CGROUP ; CS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC
ORG 100H ; bat dau tõ dia chi 100 hex
; -HIEN_THI PROC NEAR ; më thñ tôc HIÓN THÞ
XOR DX,DX ; bat dau tõ offset DX=0000 hexa
MOV CX,17 ; hiÓn thÞ 16 dong
RAM_BUFFER:
CALL HIEN_THI_DONG ; hiÓn thÞ tõng dong 16 byte
CALL SEND_CRLF ; xuong dong ve dau dong
ADD DX,16 ; tang 16 bytes nua cho dong tiep
LOOP RAM_BUFFER ; lap lai voi sè lan trong CX
; thu tuc nay in tõng dong, moi dong I
; 16 byte chua trong RAM_BUFFER : I
; truoc tien o cua sè HEXA roi den I
; cua sè ASCII I
; -'
Trang 11Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
CALL WRITE_HEX ; gäi ch¬ng tr×nh in ra sè HEX
MOV DL,' ' ; dl=20hexa la m· khoang trang
JAE HEX_LETTER ;if equal then jump to Hex_letter
ADD DL,'0' ;dl cong voi m· asii cua 0
JMP SHORT WRITE_DIGIT
HEX_LETTER:
ADD DL,'A'-10 ;
WRITE_DIGIT:
Trang 12Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; -; Tæ chøc FILE Th viÖn sö dông ham dich vu
; cua DOS va BIOS PC de më pháng mot sè chuc
; nang cua he vi xu ly 16 bit can thiet ke
; -CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CGROUP,DS:CGROUP
; DS trá tíi manh du lieu
; CS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC ; më mang m· lenh
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
Trang 13Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
MOV AH,02H ; gäi ham dich vu cua DOS
INT 21H ; VE DAU DONG
; CS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC
; ORG 100H ; bat dau tõ dia chi 100 hex
Trang 14Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
MOV CX,16 ; hiÓn thÞ 16 dong
RAM_BUFFER:
CALL HIEN_THI_DONG ; hiÓn thÞ tõng 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 sè lan trong CX
; thu tuc nay in tõng dong, moi dong I
; 16 byte chua trong RAM_BUFFER : I
; truoc tien o cua sè HEXA roi den I
CALL WRITE_HEX ; gäi ch¬ng tr×nh in ra sè HEX
MOV DL,' ' ; dl=20hexa la m· khoang trang
Trang 15Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
Trang 16Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; -; Tæ chøc FILE Th viÖn sö dông ham dich vu
; cua DOS va BIOS PC de më pháng mot sè chuc
; nang cua he vi xu ly 16 bit can thiet ke
; -;CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CODE_SEG,DS:DATA_SEG;SS:STACK_SEG
; DS trá tíi manh du lieu
; CS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC ; më mang m· lenh
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
MOV AH,02H ; gäi ham dich vu cua DOS
INT 21H ; VE DAU DONG
DATA_SEG ENDS
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&STACK_SEG SEGMENT
DB 10 DUP('STACK')
STACK_SEG ENDS
Trang 17Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
Promp1 DB 'Nhap sè thu 1: '
Promp2 DB 'Nhap sè thu 2: '
Promp3 DB 'Tong sè la: '
Fine LABEL BYTE
; -GETSTR PROC NEAR
DATA_SEG SEGMENT PUBLIC
EXTRN FLAG:WORD
DATA_SEG ENDS
PUSH AX
PUSH BX
Trang 18Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
Trang 19Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; -; Tæ chøc FILE Th viÖn sö dông ham dich vu
; cua DOS va BIOS PC de më pháng mot sè chuc
; nang cua he vi xu ly 16 bit can thiet ke
Trang 20
; -Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CGROUP,DS:CGROUP
; DS trá tíi manh lenh
; SS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC ; më mang m· lenh
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
; -;Thñ tôc nay de doc TT tõ tap tin hay TB vao/ra
;vao dem DS:DX trá tíi(co the file trong BX, so
;byte can doc trong CX
; -;Thñ tôc nay de ghi TT vao tap tin hay TB vao/ra
;tõ vung dem DS:DX trá tíi(co the file trong BX,
;sè byte can doc trong CX
Trang 21Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; dông duoc dat trong File Th viÖn BT4e.LIB
; -;Mang du lieu chua cac bien cac thong bao can
; thiet cho chuong trinh
DATA_SEG SEGMENT PUBLIC
BUFFER DB 7 DUP(?) ; dem bo nho
DIGIT DB ?
n1 DW ? ; sè hang thu nhat duoc chua o day
n2 DW ? ; sè hang thu hai
sum DW ? ; tong
BIEN_GET DW 0 ; bien trung gian
BIEN_2NUM DW 0 ;bien trung gian
Promp1 DB 'Nhap sè thu 1: '
Promp2 DB 'Nhap sè thu 2: '
; -ADDn PROC FAR
mov ax,data_seg ; DS trá tíi mang DATA_SEG
MOV DS,AX
MOV DX, OFFSET Promp1
MOV CX, OFFSET Promp2- OFFSET Promp1
CALL WRITETEXT ; in dong ' sè hang thu nhat:'
CALL GETSTR ; chuan bi nhan sè hang thu nhat
CALL STR2NUM
MOV AX,[BIEN_2NUM]
MOV n1,AX
MOV DX, OFFSET Promp2
MOV CX,OFFSET Promp3- OFFSET Promp2
CALL WRITETEXT ; in dong 'sè hang thu hai:'
CALL GETSTR ; chuan bi nhan sè hang thu hai
CALL STR2NUM
MOV AX,[BIEN_2NUM]
MOV n2,AX
CALL ADDn1n2
MOV DX,OFFSET Promp3
MOV CX,OFFSET Fine-OFFSET Promp3
; -;Doc mang hay File co the File trong BX,
;sè luong byte trong CX Neu doc thµnh
Trang 22Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
;cong thi con tro File se dat o ngay sau
; ph©n vua doc
; -GETSTR PROC NEAR
DATA_SEG SEGMENT PUBLIC
MOV BX,00H ; the file
MOV CX,07H ; sè 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
; -;Ghi mang hay File co the File trong BX,
;sè luong byte trong CX Neu ghi thµnh
;cong thi con tro File se dat o ngay sau
MOV BX,01H ;the File
MOV CX,01H ; sè luong byte can ghi
MOV DX,OFFSET DIGIT
MOV BX,10 ; chuan bi nhan 10
MOV SI,OFFSET BUFFER ; dat DS:SI vao dem BUFFER
MOV DH,00H
Trang 23Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
PUSH DX ;cat vao STACK sè du chÝnh la chu so
;co trong sè nho nhat hiÖn hµnh
POP DX ;khoi phuc lai cac chu sè tõ STACK theo
;thu tõ nguoc lai
Trang 24Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; -; Tæ chøc FILE Th viÖn sö dông ham dich vu
; cua DOS va BIOS PC de më pháng mot sè chuc
; nang cua he vi xu ly 16 bit can thiet ke
; -;CGROUP GROUP CODE_SEG,DATA_SEG
ASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG
; DS trá tíi manh lenh
; SS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC ; më mang m· lenh
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
; -;Thñ tôc nay de doc TT tõ tap tin hay TB vao/ra
;vao dem DS:DX trá tíi(co the file trong BX, so
;byte can doc trong CX
Trang 25Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
RET
GETSTRING ENDP
; -;Thñ tôc nay de ghi TT vao tap tin hay TB vao/ra
;tõ vung dem DS:DX trá tíi(co the file trong BX,
;sè byte can doc trong CX
; -; Ph©n nay khai bao cac hang ky hieu cho cac ky tõ
; do hoa trong bang m· ASCII de ve khung
; -vertical_bar equ 0bah ;Thµnh ngang
horizontal_bar equ 0cdh ;Thµnh dung
upper_left equ 0c9h ;Thµnh khep goc tren ben trai
upper_right equ 0bbh ;Thµnh khep goc tren ben phai
lower_left equ 0c8h ;Thµnh khep goc duoi ben trai
lower_right equ 0bch ;Thµnh khep goc ben phai
top_t_bar equ 0cbh ;Thµnh chu T
bottom_t_bar equ 0cah ;Thµnh chu T nguoc
top_tick equ 0d1h ;Thµnh vach manh
bottom_tick equ 0cfh ;Thµnh vach manh phia duoi
code_seg segment public
public write_pattern
extrn write_char:far ; 3 thñ tôc o ham Th viÖn
Trang 26Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
extrn gotoXY :far ;
extrn ket_thuc :far
; -;Thñ tôc WRITE_PATTERN de ve khung bang cac ky tõ
;do hoa cua bang m· ASCII
; -write_pattern proc far
data_seg segment public
extrn Dong:byte ; bien dong mµn h×nh TEXT
extrn Cot :byte ; bien cot mµn h×nh TEXT
data_seg ends
cld ; dat co huong = 0 (Direction=0)
mov ax,data_seg ; cho DS trá tíi mang DATA_SEG
mov ds,ax
mov bx,02h ;
mov dx,offset top_line_pattern; DX trá tíi 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 ; gäi thñ tôc dat con tro mµn h×nh vao toa
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 kÕt thóc
mov dl,al ; neu chua thi ChuyÓn AL vao DL
lodsb ; nhan tiep byte tiep theo va ChuyÓn
; vao AL
mov cl,al ; ChuyÓn vao thµnh dem CL de sö dông
; lenh LOOP
xor ch,ch
write_n_times : ; nhan nay in ky tõ trong DL voi so
; lan bang gia tri chua trong CL
call write_char ; gäi thñ tôc in 1 ky tõ trong DL ra mµn h×nh
Trang 27Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
code_seg ends
data_seg segment public
; -; Cau truc cua duong ngang phia tren
; tham sè dau la ky tõ do hoa, tham so
; thu hai la sè luong ky tõ can in ra
; -; Tæ chøc FILE Th viÖn sö dông ham dich vu
; cua DOS va BIOS PC de më pháng mot sè chuc
; nang cua he vi xu ly 16 bit can thiet ke
; -ASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG
; DS trá tíi manh lenh
; SS trá tíi manh lenh
CODE_SEG SEGMENT PUBLIC ; më mang m· lenh
PUBLIC WRITE_CHAR
Trang 28Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
WRITE_CHAR PROC FAR
MOV DH,Dong; Toa do dong cua mµn h×nh TEXT
MOV DL,Cot; Toa do cot cua mµn h×nh TEXT
; -; Thñ tôc kÕt thóc nhiÖm vô hiÖn hµnh de
; tra ®iÒu khiÓn ve ch¬ng tr×nh chÝnh (sö dông
; ham 4C hex cua DOS de më pháng)
Trang 29Trêng §¹i häc d©n lËp §«ng §« - Khoa C«ng nghÖ th«ng tin
; -; Ph©n nay khai bao cac hang ky hieu cho cac ky tu
; do hoa trong bang m· ASCII de ve khung
; -vertical_bar equ 0bah ;Thµnh ngang
horizontal_bar equ 0cdh ;Thµnh dung
upper_left equ 0c9h ;Thµnh khep goc tren ben trai
upper_right equ 0bbh ;Thµnh khep goc tren ben phai
lower_left equ 0c8h ;Thµnh khep goc duoi ben trai
lower_right equ 0bch ;Thµnh khep goc ben phai
top_t_bar equ 0cbh ;Thµnh chu T
bottom_t_bar equ 0cah ;Thµnh chu T nguoc
top_tick equ 0d1h ;Thµnh vach manh
bottom_tick equ 0cfh ;Thµnh vach manh phia duoi
code_seg segment public
MOV BX,OFFSET BUFFER_OFFSET
MOV CX,16 ; hiÓn thÞ 16 dong
RAM_BUFFER:
CALL HIEN_THI_DONG ; hiÓn thÞ tõng 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 sè lan trong CX
; thu tuc nay in tõng dong, moi dong I
; 16 byte chua trong RAM_BUFFER : I
; truoc tien o cua sè HEXA roi den I
; cua sè ASCII I
; -'
PUSH AX