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) 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ý, m t b l nh riêng, do đó, 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 ph ng Emu8086. Tuy ch ng ươ ượ ế ươ ươ
trình ph ng không th hi n đ c đ y đ các t p l nh 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 đ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 th 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 ph ng, ta 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 CNH
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, ư ế
th dùng l nh CMP và TEST.
B n ch t c a l nh CMP Des,Src 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 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 l nh l u 1 byte ư
kho ng cách (offset) gi a v trí hi n t i 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 l nh l u 2 byte kho ng ư
cách (offset) gi a v trí hi n t i v trí c n nh y đ n. Ki u này nh y tùy ý ế
trong ph m vi segment.