1
I. C.Trình ASM
1. Directive ñiu khin segment dng ñơn gin
a. .Model
# Ch$c năng: Báo cho chương trình d*ch ASM bi,t ñ xác l.p m0t vùng
nh2 Ram thích h5p cho chương trình
# Cú Pháp: .Model kiu
Tiny : Code + Data <= 64k
Small : Code<=64k; Data<=64k
Compact : Code<=64k;Data>=64k
Medium : Code>=64k;Data<=64k
Large : Code>=64k;Data>=64k
##################################################################################
b. .Stack
# Ch$c năng: Báo cho chương trình d*ch ASM bi,t ñ xác l.p m0t vùng
nh2 Ram cho Stack
# Cú Pháp: .Stack ñ0 l2n (tính theo byte)
# Ví DD: .Stack 100h (xin 256byte)
#################################################################################
c. .Data
# Ch$c năng: Báo cho chương trình d*ch ASM bi,t ñ xác l.p m0t vùng
nh2 Ram cho dH liIu
# Cú Pháp: .Data
Khai báo bi,n
# Các dng bi,n hay dùng cKa ASM:
+Dng sL: tên_bi,n kiu_bi,n gán_giá_tr*_ban_ñOu (hoPc ?)
Db (define byte: 1byte)
Dw (define word: 2byte)
Ví dD: x db ?
y dw #254
+Dng xâu: tên_bi,n db các_kí_tU (cách nhau bVi dWu ,)
ñ0_l2n dup(1 kí tU hoPc ?)
Ví dD: x db ‘h’,’e’,’l’,’l’,’o’
y db ‘hello’
z db 100h dup(‘A’)
t db 100 dup(?)
#################################################################################
d. .Code
# Ch$c năng: Báo cho chương trình d*ch ASM bi,t ñ xác l.p m0t vùng
nh2 Ram cho mã máy cKa chương trình
# Cú Pháp: .Code
Nhãn Chương Trình:
Thân Chương Trình
End Nhãn Chương Trình
2
###################################################################################
Dng thư_ng thWy cKa m0t chương trình ASM dng ñơn gin:
#################################################################
.Model kiu
.Stack ñ0_l2n
.Data ;
Có th k có(mPc ñ*nh là 1024b byte)
Khai báo bi,n
.Code
Nhãn_C.Trình:
Mov ax,@data
; Chd khai báo khi khai báo data
Mov ds,ax
; Chd khai báo khi khai báo data
… các lInh ASM
Mov ah,4ch
; TrV v Dos
Int 21h
End Nhãn_C.Trình
#################################################################
###################################################################################
2. Chương Trình Con
Tên_Chương_trình_con Proc
bo vI các thanh ghi mà thân chương trình con sf phá vg
.. các lInh
Ret
Tên_Chương_trình_con Endp
# Cơ ch, thUc hiIn Chương trình con:
+ b1: tham sL thUc ñư5c ñưa vào stack
+ b2: ñ*a chd lInh ti,p theo ñư5c ñưa vào stack (2/4 byte)
+ b3: ñưa ñ*a chd chương trình con vào cs:ip
+ b4: thUc hiIn chương trình con ñ,n khi gPp return thì ñưa ñ*a chd lWy ti,p
theo ñư5c ñưa vào stack trong bư2c 2 ñ ñưa vào cs:ip
+ b5: ti,p tDc chương trình chy dV
###################################################################################
3. Macro
Tên_Macro Macro các_tham_sL
bo vI các thanh ghi mà thân Macro sf phá vg
.. các lInh
Endm
###################################################################################
4. Inline ASM Trong C++
# Gkm 1 tIp .cpp liên k,t v2i m0t tIp .asm
# Yêu cOu:
M0t file d*ch có ñuôi .bat ñ liên k,t 2 tIp
dich.bat
F:\ASM\TC30\BIN\tcc #ml #IF:\ASM\TC30\INCLUDE #IF:\ASM\TC30\LIB %1 %2
(chú ý là phi ñúng ñư_ng dsn ch$a TC30)
3
Các nhãn (chương trình chính, chương trình con) phi hiu nhau.
MuLn v.y cOn có 2 directive là Public (cho phép) và Extrn (xin
phép)
# Ví dD: Tính a lũy thva n
+ Vd1: dùng hàm ASM không ñLi
TIp 1: lt1.cpp
#include<iostream.h>
#include<conio.h>
int a,n;
extrn int LT();
void main()
{
clrscr();
cout<<”\n Nhap a: ”; cin>>a;
cout<<”\n Nhap n: “; cin>>n;
cout<<”\n “<<a<<” luy thua ”<<n<<” bang: “<<LT();
getch();
}
TIp 2: lt11.asm
.model small
.stack 100h
.data
Extrn _a:word,_n:word
.code
Public @LT$qv
@LT$qv PROC
Mov bx,_a
Mov cx,_n
Mov ax,1
And cx,cx ; dUng c_ xét liIu n có b~ng 0
Jz L2 ; n,u n=0 thì nhy ñ,n L2
L1:
Mul bx
Loop L1
L2:
Ret
@LT$qv EndP
End
+ Vd2: dùng hàm ASM 1 ñLi
TIp 1: lt2.cpp
#include<iostream.h>
#include<conio.h>
int n;
extrn int LT(int a);
void main()
{
clrscr();
cout<<”\n Nhap a: ”; cin>>a;
cout<<”\n Nhap n: “; cin>>n;
cout<<”\n “<<a<<” luy thua ”<<n<<” bang: “<<LT(a);
getch();
}
TIp 2: lt22.asm
.model small
.stack 100h
.data
Extrn _n:word
.code
Public @LT$qi
@LT$qi PROC
4
Push bp ; CWt giá tr* BP hiIn th_i vào stack
Mov bp,sp
Mov bx,[bp+6] ;bx=a
Mov cx,_n
Mov ax,1
And cx,cx ; dUng c_ xét liIu n có b~ng 0
Jz L2 ; n,u n=0 thì nhy ñ,n L2
L1:
Mul bx
Loop L1
L2:
Pop bp
Ret
@LT$qi EndP
End
+ Vd3: dùng hàm ASM 2 ñLi
TIp 1: lt3.cpp
#include<iostream.h>
#include<conio.h>
extrn int LT(int a,int n);
void main()
{
clrscr();
cout<<”\n Nhap a: ”; cin>>a;
cout<<”\n Nhap n: “; cin>>n;
cout<<”\n “<<a<<” luy thua ”<<n<<” bang: “<<LT(a,n);
getch();
}
TIp 2: lt33.asm
.model small
.stack 100h
.data
Extrn _n:word
.code
Public @LT$qii
@LT$qii PROC
Push bp ; CWt giá tr* BP hiIn th_i vào stack
Mov bp,sp
Mov bx,[bp+6] ;bx=a
Mov cx,[bp+8] ;cx=n
Mov ax,1
And cx,cx ; dUng c_ xét liIu n có b~ng 0
Jz L2 ; n,u n=0 thì nhy ñ,n L2
L1:
Mul bx
Loop L1
L2:
Pop bp
Ret
@LT$qii EndP
End
###################################################################################
5. Các loi thanh ghi cho máy tính 16 bit
a. Thanh ghi c_ 16 bit
O
D
I
T
S
Z
A
P
C
C : Carry P : Parity A : Auxiliary Z : Zero S : Sign
T : Trap I : Interrupt D : Direction O : Overflow
###################################################################################
b. 8 Thanh ghi ña năng 16 bit
5
Ax Bx Cx Dx : 3 ch, ñ0 truy nh.p (al,ah,ax)
Si Di Bp Sp : 1 ch, ñ0
Ngư_i l.p trình chd ñư5c dùng 7 thanh ghi (trv thanh ghi Sp)
###################################################################################
c. Thanh ghi con tr… lInh 16 bit
Ip : cho bi,t phOn ñ*a chd offset cKa vùng nh2 Ram ch$a mã máy cKa
chương trình
###################################################################################
d. 4 Thanh ghi segment 16 bit
Cs : Code Segment
; cho bi,t phOn ñ*a chd segmentcKa vùng nh2 Ram ch$a mã máy chương trình
Ds : Data Segment
;cho bi,t phOn ñ*a chd segmentcKa vùng nh2 Ram ch$a dH liIu chương trình
Es : Extra Segment
;cho bi,t phOn ñ*a chd segmentcKa vùng nh2 Ram ch$a dH liIu chương trình
Ss : Stack Segment
;cho bi,t phOn ñ*a chd segment cKa vùng nh2 Ram ch$a ngăn x,p chương trình
###################################################################################
II. Các lInh hay dùng cKa ASM
1. Nhóm các lInh di chuyn dH liIu
a. Mov
# Ch$c năng: DST
SRC
# Cú Pháp: Mov DST,SRC
# Ví DD: Mov reg1,reg2 ;(ax,bx)
Mov reg,data ;(ax,100)
Mov reg,mem ;(bx,value)
Mov mem,reg ;(value,cx)
Mov mem,data ;(value,#100)
Mov seg,reg ;(ds,ax)
###################################################################################
b. Push
# Ch$c năng: ðưa n0i dung 2 byte cKa SRC vào ñdnh Stack
# Cú Pháp: Push SRC
# Ví dD: Push reg
mem
###################################################################################
c. Pop
# Ch$c năng: ðưa n0i dung 2 byte cKa ñdnh Stack vào SRC
# Cú Pháp: Pop SRC
# Ví dD: Pop reg
Mem
###################################################################################
d. PushF