Cơ chế liên kết ngôn ngữ Assembly...2II... Ngôn ngữ Assembly- Ngôn ngữ Assembly là ngôn ngữ bậc thấp.- Ưu điểm:Chạy nhanh và tiết kiệm bộ nhớ.Dễ dàng thâm nhập trực tiếp vào các thiết bị
Trang 1Hà N i - Năm 2023 ộ
Gi ng Viên Hả ướng Dẫẫn : Đ ng Thành Phuặ
L p : AAS3132023.001ớ
Sinh Viên Th c Hi n : Nguyêẫn Nh t Long -17A10010223-17A01ự ệ ậ Toàn Ch& V' -17A10010275-17A01
1
Trang 2MỤC LỤC
I Mở đầu về lập trình hệ thống 2
1 Ngôn ngữ Assembly 2
2 Cơ chế liên kết ngôn ngữ Assembly 2
II Nội dung đề tài bài tập lớn 3
III Các công cụ hỗ trợ 3
1 Các macro hỗ trợ 3
2 Các chương trình con 4
IV Cách thực hiện 7
V Tài liệu tham khảo 16
1
Trang 3I Mở đầu về lập trình hệ thống
1 Ngôn ngữ Assembly
- Ngôn ngữ Assembly là ngôn ngữ bậc thấp.
- Ưu điểm:
Chạy nhanh và tiết kiệm bộ nhớ
Dễ dàng thâm nhập trực tiếp vào các thiết bị phần cứng như: vùng nhớ, các cổng, các thanh ghi,…
- Nhược điểm:
Khó viết vì phải am hiểu sâu về phần cứng
Khó khăn trong việc kiểm tra lỗi
Khó khăn trong việc chuyển giao chương trình lên các máy tính
có cấu trúc khác nhau
- Ứng dụng:
Các chương trình của ROM BIOS,
Các chương trình trong các hệ thống nhúng,
Các chương trình tạo và diệt VIRUS
2 Cơ chế liên kết ngôn ngữ Assembly
- Cơ chế liên kết ngôn ngữ Assembly với bất kỳ một ngôn ngữ bậc cao
nào về cơ bản là giống nhau Do vậy, nếu nắm vững cơ chế liên kết giữa ngôn ngữ Assembly với một ngôn ngữ bậc cao nào đó thì sẽ dễ dàng hiểu được sự liên kết ngôn ngữ Assembly với một loại ngôn ngữ bậc cao khác
- Nhìn chung có hai cách thường dùng để liên kết ngôn ngữ Assembly
với ngôn ngữ bậc cao, đó là:
Inline Assembly với cơ chế chèn một khối lệnh Assembly vào chương trình được viết bằng ngôn ngữ bậc cao và
Viết tách biệt module (tệp) của ngôn ngữ bậc cao và module (tệp) của ngôn ngữ Assembly
2
Trang 4- Để phần nào hiểu được cơ chế liên kết ngôn ngữ Assembly với ngôn
ngữ bậc cao, trong phần này đề cập đến sự liên kết giữa ngôn ngữ Assembly với ngôn ngữ C/C ++
II Nội dung đề tài bài tập lớn
- Viết chương trình thực hiện 4 chức năng:
Chức năng TYPE | more
Chức năng tính giá trị biểu thức an
Chức năng hiện địa chỉ cơ sở của videoram
Chức năng thoát khỏi chương trình
III. Các công cụ hỗ trợ
1 Các macro hỗ trợ
- Macro hiện một xâu ký tự kết thúc bằng ‘$’ ra màn hình.
HienString MACRO xau
push AX DX mov DX,offset xau ; DX tro den dau xau mov AH,9 ; Chuc nang hien 1 xau ky tu int 21h ; (ket thuc bang '$') len man hinh pop DX AX
ENDM
- Macro xóa màn hình.
clrscr MACRO
push AX mov AH,0fh ; Chuc nang lay mode man hinh hien thoi int 10h ; va so mode nam o AL
mov AH,0 ; Chuc nang dat mode cho man hinh int 10h ; so mode can dat nam o AL pop AX
3
Trang 52 Các chương trình con
- Chương trình con nhận một số nguyên vào từ bàn phím.
VAO_SO_N PROC
push BX CX DX SI
mov BX,10 ; Mot so hang nhan
xor CX,CX ; Phan so da vao truoc (luc dau bang 0) mov SI,CX ; Co dau cua so (luc dau coi nhu so duong) VSN1:
mov AH,1 ; Cho 1 ky tu tu ban phim
int 21h
cmp AL,0dh ; Ky tu vua vao la phim Enter
je VSN3
cmp AL,'-' ; Ky tu vua vao la dai '-'
jne VSN2 ; Khong phai dau '-' thi nhay
inc SI ; con khong thi co dau len 1
jmp VSN1
VSN2:
sub AL,30h ; Chuyen ky tu vua vao tu ma ASCII sang dang so
xor AH,AH ; AH=0 (AX la so vua vao)
xchg AX,CX ; Doi cheo so vua vao va phan so da vao truoc mul BX ; Nhan phan so da vao truoc voi 10
add CX,AX ; Cong so vua vao voi phan so da vao sau khi nhan 10
jmp VSN1
VSN3:
and SI,SI ; Dung co ZF (Neu SI#0 thi so vao la am)
jz VSN4 ; So vua vao la duong thi nhay
4
Trang 6neg CX ; Bu 2 gia tri vua vao de duoc so am
VSN4:
mov AX,CX
pop SI DX CX BX
ret
VAO_SO_N ENDP
- Chương trình con hiện số n ra màn hình dạng cơ số 10.
VAO_SO_N PROC
push BX CX DX SI
mov BX,10 ; Mot so hang nhan
xor CX,CX ; Phan so da vao truoc (luc dau bang 0) mov SI,CX ; Co dau cua so (luc dau coi nhu so duong) VSN1:
mov AH,1 ; Cho 1 ky tu tu ban phim
int 21h
cmp AL,0dh ; Ky tu vua vao la phim Enter
je VSN3
cmp AL,'-' ; Ky tu vua vao la dai '-'
jne VSN2 ; Khong phai dau '-' thi nhay
inc SI ; con khong thi co dau len 1
jmp VSN1
VSN2:
sub AL,30h ; Chuyen ky tu vua vao tu ma ASCII sang dang so xor AH,AH ; AH=0 (AX la so vua vao)
xchg AX,CX ; Doi cheo so vua vao va phan so da vao truoc mul BX ; Nhan phan so da vao truoc voi 10
add CX,AX ; Cong so vua vao voi phan so da vao sau khi nhan 10
jmp VSN1
5
Trang 7and SI,SI ; Dung co ZF (Neu SI#0 thi so vao la am)
jz VSN4 ; So vua vao la duong thi nhay
neg CX ; Bu 2 gia tri vua vao de duoc so am
VSN4:
mov AX,CX
pop SI DX CX BX
ret
VAO_SO_N ENDP
- Chương trình con hiện một số nguyên trong thanh ghi ax ra màn hình
dạng cơ số hexa
HIEN_HEXA PROC
push ax bx cx dx
mov bx,16 ; BX=so chia
xor cx,cx ; CX=so lan cat vao stack (luc dau=0)
HSH1:
xor dx,dx ; DX=0
div bx ; DX:AX chia cho 16 (DX luon=0) cmp dx,10 ; Lieu so du nho hon 10 (tu 0 den 9) ?
jb HSH2 ; Dung thi nhay
add dx,7 ; Con khon thi dx=dx+7
HSH2:
add dx,30h ; Chuyen so du dang so ra dang ASCII
push dx ; Cat vao stack
inc cx ; So lan cat vao stack tang len 1
and ax,ax ; Lieu thuong da bang 0 ?
jnz HSH1 ; Chua bang khong thi tiep tuc thuat toan chia HSH3: ; con khong thi tao vong lap lay tu stack cac gia pop ax ; tri da cat va hien ra man hinh
6
Trang 8mov ah,0eh int 10h loop HSH3 mov al,'h' ; Hien them chu 'h' phia sau so hexa vua hien mov ah,0eh
int 10h pop dx cx bx ax ret
HIEN_HEXA ENDP
- Chương trình con nhận tên tệp vào từ bàn phím.
GET_FILE_NAME PROC
push ax bx cx dx mov ah,0ah ; Chuc nang nhan 1 xau tu int 21h ; ban phim va de vao buff mov bx,dx ; bx tro den dau buf inc bx ; bx tro den byte chua so luong ky tu da vao mov cl,[bx] ; cl=so luong ky tu thuc te da vao
xor ch,ch ; ch=0 de cx=cl inc bx ; bx tro den byte dau tien chua ky tu da vao add bx,cx ; bx tro den byte chua 0dh (Enter) mov [bx],ch ; Cho byte do bang 0 pop dx cx bx ax
ret GET_FILE_NAME ENDP
IV Cách thực hiện
- Liên kết giữa ngôn ngữ C++ và Assembly với sự phân công nhiệm vụ như sau: Tệp ngôn ngữ C++ viết chương trình chính làm nhiệm vụ hiện màn hình giới thiệu và màn hình chức năng và Ngôn ngữ
7
Trang 9Assembly thiết lập 4 hàm: HIENTEP(), LUYTHUA(), DCVRAM(), VeDOS()
- Chương trình chính viết bằng C++
#include <iostream.h>
#include <conio.h>
extern HIENTEP();
extern LUYTHUA();
extern DCVRAM();
extern VeDOS();
void main()
{
char tl;
cn;int
clrscr();
cout<<"\n Truong Dai Hoc Mo Ha Noi";
cout<<"\n Khoa Cong Nghe Thong Tin";
cout<<"\n -o0o -";
cout<<"\n\n\n BAI TAP LON ";
cout<<"\n\n\n Cac sinh vien thuc hien:";
cout<<"\n Nguyen Nhat Long Lop:17A01"; cout<<"\n Toan Chi Vi Lop:17A01";
cout<<"\n\n\n Co tiep tuc CT (c/k)?";
tl=getch();
(tl== )if 'c'
{
L1:
a;int
clrscr();
cout<<"\n CAC CHUC NANG CUA BAI TAP LON";
8
Trang 10cout<<"\n -";
cout<<"\n\n\n 1 Chuc nang hien noi dung tep"; cout<<"\n 2 Tinh a luy thua n";
cout<<"\n 3 Dia chi co so videoram";
cout<<"\n 4 Ve DOS";
cout<<"\n\n\n Hay chon: ";
cin>>cn;
switch(cn){
case : HIENTEP();1 break;
case : LUYTHUA();2 break;
case : DCVRAM();3 break;
case : VeDOS();4 break;
default: cout<<"\n Khong co chuc nang nay";break; }
cout<<"\n Co tiep tuc chuc nang khac:";
tl=getch();
if(tl=='c') goto L1;
}
}
- Hàm HIENTEP()
INCLUDE lib1.asm
.MODEL small
.DATA
hx db 13,10,' CHUC NANG HIEN NOI DUNG MOT TEP'
db 13,10,' -*** -'
db 13,10,13,10,' Hay vao ten tep can hien: $'
kc db 13,10,13,10,'$'
9
Trang 11Err_O db 13,10,' Khong mo duoc tep !$'
Err_R db 13,10,' Khong doc duoc tep !$'
Err_W db 13,10,' Khong ghi duoc tep !$'
Err_C db 13,10,' Khong dong duoc tep !$'
buff db 30
db ?
file_name db 13,10, 30 dup(?)
the_tep dw ?
dem db 512 dup(?)
more db 13,10,' More $'
tieptuc db 13,10,' Co tiep tuc CT (c/k) ? $'
.CODE
PUBLIC @HIENTEP$qv
@HIENTEP$qv PROC L_CT0: clrscr HienString hx ; Hien thong bao hx
lea dx,buff ; DX tro den byte dau cua buff
call GET_FILE_NAME ; Vao ten tep can hien
HienString kc
lea dx,file_name ; Mo tep da co de doc
mov al,0 ; De doc
mov ah,3dh ; Chuc nang mo tep da co
int 21h
jnc L_CT1 ; CF=0 (mo tep tot) thi nhay den L_CT1,
HienString Err_O ; con neu co loi CF=1 thi bao loi
jmp Exit_CT ; roi nhay ve Exit_CT
L_CT1:
mov the_tep,ax ; Neu mo tep tot thi dua the tep co trong AX->bien the_tep
10
Trang 12L_CT2: ; Vong lap doc 512 byte cua tep -> vung dem mov bx,the_tep ; BX=the tep copy di
mov cx,512 ; So luong byte can doc
lea dx,dem ; DX tro den dau vung dem
mov ah,3fh ; Chuc nang doc
int 21h
jnc L_CT3 ; CF=0 (doc tot) thi nhay den L_CT3,
HienString Err_R ; con CF=1 (khong doc duoc) hien thong bao err_r neu doc tep bi loi (CF=1)
jmp DONG_TEP ; roi nhay ve DONG_TEP
L_CT3:
and ax,ax ; Lieu so luong byte thuc te da doc duoc bang 0 ?
jz DONG_TEP ; ZF=0 (dung bang 0 la het tep) thi nhay den dong cac tep va ket thuc
mov bx,1 ; con khong bang 0 thi tien hanh dua ra man hinh voi the tep=1
mov cx,ax ; Dua so luong byte doc duoc vao cx
lea dx,dem ; DX tro den vung dem chua so lieu can dua ra man hinh mov ah,40h ; Chuc nang hien(ghi tep voi the tep bang 1) int 21h
jnc L_CT ; CF=0 (ghi tep tot) thi nhay den L_CT,
HienString Err_W ; con CF=1 thi hien thong bao err_w (khong ghi duoc)
jmp DONG_TEP ; roi nhay ve DONG_TEP
L_CT:
HienString more ; Hien chu More len man hinh
mov ah,1 ; cho 1 ky tu tu ban phim
int 21h
11
Trang 13jmp L_CT2 ; Nhay ve tiep tuc doc va hien
DONG_TEP:
mov bx,the_tep ; Chuc nang dong tep
mov ah,3eh
int 21h
jnc Exit_CT ; CF=0 (dong tep tot) thi nhay ve Exit_CT, HienString Err_C ; con CF=1 (khong dong duoc) thi hien loi Exit_CT:
HienString tieptuc ; Hien thong bao tiep tuc
mov ah,1 ; cho 1 ky tu tu ban phim
int 21h
cmp al,'c' ; Ky tu vao co phai 'c'
jne Thoat_CT ; Khong phai 'c'thi nhay de Thoat_CT jmp L_CT0 ; con dung la 'c' thi nhay ve L_CT0 Thoat_CT:
ret ; ve DOS
@HIENTEP$qv ENDP
INCLUDE lib3.asm ; lib3.asm chua CT con GET_FILE_NAM
END
- Hàm LUYTHUA()
INCLUDE lib1.asm
.MODEL small
.DATA
m1 db 13,10,' CHUC NANG TINH a LUY THUA n'
db 13,10,' -*** -'
db 13,10,13,10,' Hay vao a: $'
m2 db 13,10,' Hay vao n: $'
crlf db 13,10,' $'
12
Trang 14m3 db ' luythua $'
m4 db ' la: $'
m5 db 13,10,' Co tiep tuc CT (c/k)? $'
.CODE
PUBLIC @LUYTHUA$qv
@LUYTHUA$qv PROC
L0:
clrscr ; Xoa man hinh
HienString m1 ; Hien thong bao m1
call VAO_SO_N ; Nhan gia tri a
mov bx,ax ; BX=gia tri cua a
HienString m2 ; Hien thong bao m2
call VAO_SO_N ; Nhan gia tri n
mov cx,ax ; CX=gia tri cua n
HienString crlf ; Hien xuong hang, quay dau dong mov ax,bx ; AX=gia tri a
call HIEN_SO_N ; Hien gia tri a
HienString m3 ; Hien thong bao ' luy thua ' mov ax,cx ; AX=gia tri n
call HIEN_SO_N ; Hien gia tri n
HienString m4 ; Hien ' la: '
mov ax,1 ; AX=1 (tich ban dau bang 1) and cx,cx ; Dung co ZF
jz HIEN ; Neu ZF=0 (n=0) ti nhay den HIEN, LAP:
mul bx ; AX=AX*BX
loop LAP
HIEN:
13
Trang 15call HIEN_SO_N ; Hien ket qua a luy thua n co trong AX HienString m5 ; Hien thong bao m5
mov ah,1 ; Cho an 1 phim
int 21h
cmp al,'c' ; Lieu phim am la 'c'
jne EXIT ; Khong phai thi nhay ve EXIT de ket thuc CT, jmp L0 ; con dung la chu 'c' thi nhay ve L0 de tiep tuc CT EXIT:
ret
@LUYTHUA$qv ENDP
INCLUDE lib2.asm
END
- Hàm VDRAM()
INCLUDE lib1.asm
.model small
.data
m1 db 13,10,' CHUC NANG HIEN DIA CHI CO SO CUA VIDEORAM'
db 13,10,' -*** -'
db 13,10,13,10,' Dia chi co so VIDEORAM la: $'
tieptuc db 13,10,' An phim bat ky de tiep tuc CT $'
.code
PUBLIC @DCVRAM$qv
@DCVRAM$qv PROC
clrscr ; Xoa man hinh
HienString m1 ; Hien thong bao m1
int 11h ; Noi dung o nho co dia chi 0:410h -> AL and al,00110000b ; Tach 2 bit chua thong tin ve loai dieu khien man hinh
14
Trang 16cmp al,00110000b ; Kiem tra 2 bit 5,6 co bang 1 1 khong?
je MONO ; Neu bang 1 1 thi nhay den MONO, mov ax,0B000h ; con khong thi gan d/c co so VIDEORAM color -> AX
jmp HIEN
MONO:
mov ax,0B800h ; 2 bit bang 11 thi gan dia chi com so VIDEORAM -> AX
HIEN:
call HIEN_HEXA ; Hien dia chi co so VIDEORAM HienString tieptuc ; Hien thong bao tieptuc
mov ah,1 ; Cho an mot phim
int 21h
ret
@DCVRAM$qv ENDP
INCLUDE lib2.asm ; Chua CT con HIEN_HEXA
END
- Hàm VeDOS()
INCLUDE lib1.asm
.MODEL small
.CODE
PUBLIC @VeDOS$qv
@VeDOS$qv PROC
clrscr
mov ah,4ch
int 21h
ret
@VeDOS$qv ENDP
END
15
Trang 17- Kết luận: Các hàm chạy đúng chức năng Liên kết ngôn ngữ Assembly
với ngôn ngữ C hoặc C là giống nhau, chỉ khác có tên hàm của ngôn ++ ngữ Assembly
V Tài liệu tham khảo
- Turbo Assembler Ver.4.0 (User Guide) Borland International, INC
1800 GREEN HILLS ROAD, 1993
- Turbo Assembler Ver.4.0 (Quick Reference Guide) Borland
International, INC 1800 GREEN HILLS ROAD, 1993
- Turbo Assembler và ứng dụng, Đặng Thành Phu, NXB Khoa học và
Kỹ thuật, 2007
- Lập trình trên môi trường Windows với MFC, Dương Thăng Long,
NXB Khoa học và Kỹ thuật, 2006
- PC System Programming – An in depth reference for DOS
programmer, Michael Tischer, Abacus, 1990
- Công cụ phần mềm hỗ trợ THELP
16