
PH N 1: L P TRÌNH H P NG CHO H x86Ầ Ậ Ợ Ữ Ọ
BÀI 1: CĂN B N V H P NGẢ Ề Ợ Ữ
1. M C ĐÍCHỤ
Làm quen v i ngôn ng l p trình Assemblyớ ữ ậ
Bi tế cách vi t, d ch, ch y m t vài ch ng trình đ n gi n trên ch ng trình mô ph ngế ị ạ ộ ươ ơ ả ươ ỏ
Emu8086
2. TÓM T T LÝ THUY TẮ Ế
H p ng (aợ ữ ssembler) là ngôn ng b c th p, giúp cho ng i l p trình không ph i ghi nhữ ậ ấ ườ ậ ả ớ
mã máy (opcode) mà s d ng các t ng g i nh (pseudo-code) g n v i ngôn ng t nhiên đử ụ ừ ữ ợ ớ ầ ớ ữ ự ể
miêu t công vi c c n th c hi n. Tuy v y, assembler r t g n v i ngôn ng máy, đòi h iả ệ ầ ự ệ ậ ấ ầ ớ ữ ỏ
ng i l p trình ph i hi u bi t t ng đ i đ y đ v c u trúc ph n c ng máy tính.ườ ậ ả ể ế ươ ố ầ ủ ề ấ ầ ứ
V i m i ki u ki n trúc c a b vi x lý, có m t b l nh riêng, do đó, có m t ngôn ngớ ỗ ể ế ủ ộ ử ộ ộ ệ ộ ữ
assembler riêng cho nó. đâyỞ, chúng ta nghiên c u assembler cho các b ứ ộ vi x lửý Intel thu cộ
h x86. Các ch ng trình s đ c vi t trên ch ng trình mô ph ng Emu8086. Tuy ch ngọ ươ ẽ ượ ế ươ ỏ ươ
trình mô ph ng không th hi n đ c đ y đ các t p l nh có trong h 8086. Ng c l i,ỏ ể ệ ượ ầ ủ ậ ệ ọ ượ ạ
ch ng trình mô ph ng giúp ta tìm hi u v h p ng m t cách tr c quan và d hi u.ươ ỏ ể ề ợ ữ ộ ự ễ ể
2.1. C u trúc thông th ng c a m t ch ng trình h p ng đ c vi t trênấ ườ ủ ộ ươ ợ ữ ượ ế
Emu8086:
#make_COM# <Khai báo ch ng trình dang .com>ươ
.stack <Khai báo kích th c ngăn x p>ướ ế
.data <Khai báo d li u>ữ ệ
.code
ORG 100h ; COM file is loaded at CS:0100h
<Các l nh>ệ
End
Chúng ta có b qua cỏác khai báo v “.model”, “.stack”, “.data”, “.code” và “end” khi ch y trênề ạ
ch ng trình mô ph ng.ươ ỏ
V í d :ụ Ch ng trình sau in ra màn hình dòng ch “Hello, World!”ươ ữ
#make_COM# ; Standard header
ORG 100H
JMP START ; Jump to start:
msg DB 13, 10, 'Hello, World!$‘ ; Data
START:
LEA DX, msg ; Load address of msg to DX register
MOV AH, 9 ; Print using DOS interrupt
INT 21h
MOV AH, 4Ch ; Exit to operating system
INT 21h

L u ý:ư
- M i ch ng trình đ u ph i có đo n code thoát kh i ch ng trình, n u khôngọ ươ ề ả ạ ỏ ươ ế
ch ng trình s không d ng khi h t ch ng trình c a mình.ươ ẽ ừ ế ươ ủ
2.2. Khai báo bi n trong h p ngế ợ ữ
Cú pháp:
<tên bi n> ếD<Ki u DL> ể<giá tr kh i t o>ị ở ạ
ho cặ
<tên bi n> ếD<Ki u DL> ể<s ph n t >ố ầ ử dup(<giá tr kh iị ở
t o>)ạ
Các ki u d li u: B (1 byte), W (2 bytes), D (ể ữ ệ 4 bytes)
N u không kh i t o, dùng d u h i “ế ở ạ ấ ỏ ?”
Ví d :ụ
Khai báo trong C Khai báo trong h p ngợ ữ
char ch; ch DB ?
char ch = ‘a’; ch DB ‘a’
char ch = 5; ch DB 5
char s[]=”\nhello world!” s DB 10,13,”hello world!$”
int i=100; i DW 100
long l; l DD ?
char a[] = {1,2,3}; a DB 1,2,3
char a[100]; a DB 100 dup(?)
char a[100][50]; a DB 100 dup(50 dup(?))
2.3. D ch, liên k t, ch y và ch n l i ch ng trình t d u nh c DOSị ế ạ ẩ ỗ ươ ừ ấ ắ
Đ t o m t ch ng trình d ng .com, ta ch n File/New/COM Template ể ạ ộ ươ ạ ọ nh hình 1.1ư
Hình 1.1: Cách tao ch ng trình trên Emu8086ươ
Đ biên d ch ch ng trình, ta ch n ể ị ươ ọ Compile. Ta có th mô ph ng tr c ti p b ng cáchể ỏ ự ế ằ
ch n ọEmulate. Màn hình s hi n th lên nh hình 1.2ẽ ệ ị ư

Hình 1.2: Giao di n ch ng trình mô ph ngệ ươ ỏ
Trên ch ng trình mô ph ng, ta có th quan sát đ c n i d ng các thanh ghi, d li u l uươ ỏ ể ượ ộ ụ ữ ệ ư
trong b nh , màn hình, b ALU, Stack, thanh ghi c … Ngoài ra, ta có th ch y ch ng trìnhộ ớ ộ ờ ể ạ ươ
(ch n Run) ho c th c hi n t ng l nh (Single Step).ọ ặ ự ệ ừ ệ
2.4. M t s l nh c b nộ ố ệ ơ ả
MOV des,src : chép d li u t src sang desữ ệ ừ
INC des : tăng des m t đ n vộ ơ ị
DEC des : gi m des m t đ n vả ộ ơ ị
ADD des,src : des = des + src
SUB des,src : des = des – src
INT num : g i ng tọ ắ
3. TH C HÀNHỰ
3.1. Bài t p ậ
B à i 1. Vi t CT nh p vào 1 ký t , xu t ra ký t đóế ậ ự ấ ự
V í dụ :
Nhap 1 ky tu: b
Ky tu vua nhap: b
B à i 2. Vi t ch ng trình xu t ra màn hình ế ươ ấ m tộ số dòng chữ
Ví d : ụ
Dai hoc Quoc gia Thanh pho Ho Chi Minh
Truong Dai hoc Khoa hoc tu nhien
Khoa Dien tu – Vien thong
Bài 3. Vi t CT nh p vào 1 ký t , xu t ra ký t li n tr c và li n sau.ế ậ ự ấ ự ề ướ ề

V í dụ :
Moi ban nhap 1 ky tu: b
Ky tu lien truoc: a
Ky tu lien sau: c
Bài 4. Vi t CT nh p vào 1 ký t th ng. In ra ký t Hoaế ậ ự ườ ự
V í dụ :
Moi ban nhap 1 ky tu: b
Ky tu hoa la: B
Bài 5. Vi t CT nh p vào 1 ký t hoa. In ra ký t th ngế ậ ự ự ườ
Ví d :ụ
Moi ban nhap 1 ky tu: B
Ky tu thuong la: b
Bài 6. Vi t ch ng trình nh p vào 2 s nguyên d ng x1, x2 (1 ế ươ ậ ố ươ ≤ x2 < x1 < 9). Xu t ra k tấ ế
qu các phép tính: 3x1 + 5x2ả
Ví d :ụ
x1 = 3
x2 = 4
3x1 + 5X2 = 32
3.2. H ng d nướ ẫ
Bài 1. Đ nh p 1 m t ký t s d ng hàm 1 c a ng t 21h, đ xu t, s d ng hàm 2.ể ậ ộ ự ử ụ ủ ắ ể ấ ử ụ
Ví d :ụ
mov AH,1
int 21h ; k t qu trong ALế ả
mov DL,AL ; kí t c n xu t trong DLự ầ ấ
mov AH,2
int 21h
Bài 2. C p kí t xu ng dòng là 10,13. Có th khai báo nhi u xâu kí t ho c chung m t xâu.ặ ự ố ể ề ự ặ ộ
Ví d :ụ
Msg1 DB 10,13,9,“ Dai hoc Quoc gia Thanh pho Ho Chi
Minh”
Msg2 DB 10,13,9,“ Truong Dai hoc Khoa hoc tu nhien”
Ho cặ
Msg12 DB 10,13,9,“ Dai hoc Quoc gia Thanh pho Ho Chi
Minh”
DB 10,13,9,“ Truong Dai hoc Khoa hoc tu nhien”
Bài 3, 4. Kí t hoa và kí t th ng c a cùng m t ch cái ti ng Anh cách nhau 20h. Do đó, đự ự ườ ủ ộ ữ ế ể
chuy n đ i ch hoa thành ch th ng và ng c l i, ch c n dùng l nh ADD, SUB.ể ổ ữ ữ ườ ượ ạ ỉ ầ ệ
Bài 5. Đ chuy n đ i các kí t ‘0’ – ‘9’ thành s 0 – 9 ch c n th c hi n phép tr đi 48 (mãể ể ổ ự ố ỉ ầ ự ệ ừ
c a ‘0’). Sau khi th c hi n phép tính, chuy n đ i thành kí t và in ra màn hình (có th dùngủ ự ệ ể ổ ự ể
bi u di n Hex).ể ễ

BÀI 2: CÁC CH TH LOGIC VÀ ĐI U KHI NỈ Ị Ề Ể
1. M C ĐÍCHỤ
Hi u cách so sánh hai s trong h p ngể ố ợ ữ
Hi u cách thay đ i th t th c hi n các l nhể ổ ứ ự ự ệ ệ
Bi t cách s d ng các l nh so sánh, nh y và l p ế ử ụ ệ ả ặ
2. TÓM T T LÝ THUY TẮ Ế
2.1. L nh so sánhệ
Trong h p ng , mu n so sánh hai s , ta ph i th c hi n m t phép toán s h c ho c logicợ ữ ố ố ả ự ệ ộ ố ọ ặ
trên hai s đó và căn c vào các bit trong thanh ghi c r i đ a ra k t lu n. Đ làm vi c này, cóố ứ ờ ồ ư ế ậ ể ệ
th dùng l nh CMP và TEST.ể ệ
B n ch t c a l nh ả ấ ủ ệ CMP Des,Src là l nh ệSUB Des,Src (th c hi n phép tính ự ệ Des – Src)
nh ng k t qu c a phép tính không đ c l u vào Des nh trong l nh SUB.ư ế ả ủ ượ ư ư ệ
Ví d :ụ so sánh hai s nguyên d ngố ươ
MOV AH,1
MOV AL,2
CMP AH,AL
Sau khi th c hi n hai l nh trên, c Carry (CF) b t, báo hi u r ng AH < ALự ệ ệ ờ ậ ệ ằ
B n ch t c a l nh ả ấ ủ ệ TEST Des,Src là l nh ệAND Des,Src (th c hi n phép tính ự ệ Des AND
Src) nh ng k t qu c a phép tính không đ c l u vào Des nh trong l nh AND.ư ế ả ủ ượ ư ư ệ
Ví d :ụ ki m tra hai bit cu i cùng c a ALể ố ủ
TEST AL,3 ; 3h = 11b
N u c Zero (ZF) b t, có nghĩa là c hai bit 0 và 1 c a AL đ u b ng 0.ế ờ ậ ả ủ ề ằ
2.2. L nh nh yệ ả
Thông th ng, khi m t l nh (instruction) đ c th c hi n, giá tr c a thanh ghi IPườ ộ ệ ượ ự ệ ị ủ
(instruction pointer) đ c t đ ng c p nh t đ tr đ n l nh k ti p. Ngoài ra, n i dung c aượ ự ộ ậ ậ ể ỏ ế ệ ế ế ộ ủ
thanh ghi IP ch có th b thay đ i thông qua m t s l nh đ c bi t. Đó là: các l nh nh y (J*),ỉ ể ị ổ ộ ố ệ ặ ệ ệ ả
l nh l p (LOOP*), l nh g i hàm (call, ret), l nh g i ng t (int, iret). Các l nh này đ c x pệ ặ ệ ọ ệ ọ ắ ệ ượ ế
vào nhóm “L nh đi u khi n lu ng” (Program flow control instructions). Trong bài th c hànhệ ề ể ồ ự
này, chúng ta s h c cách s d ng các l nh nh y và các l nh l p.ẽ ọ ử ụ ệ ả ệ ặ
L nh nh y không đi u kệ ả ề i nệ
JMP <target>
Có các tr ng h p sau:ườ ợ
•JMP SHORT <tên nhãn> (short jump). Khi đó trong mã l nh l u 1 byteệ ư
kho ng cách (offset) gi a v trí hi n t i và v trí c n nh y đ n. Ki u này chả ữ ị ệ ạ ị ầ ả ế ể ỉ
nh y trong ph m vi t –128 đ n +127 byte so v i v trí hi n t i.ả ạ ừ ế ớ ị ệ ạ
Ví d :ụJMP SHORT Calculate
•JMP <tên nhãn> (near jump). Khi đó trong mã l nh l u 2 byte kho ngệ ư ả
cách (offset) gi a v trí hi n t i và v trí c n nh y đ n. Ki u này nh y tùy ýữ ị ệ ạ ị ầ ả ế ể ả
trong ph m vi segment.ạ