ấ
C u trúc máy tính
ươ ng 4
Ợ Ữ Ch Ậ L P TRÌNH H P NG
10/19/16 Chương 4: Lập trình hợp ngữ 1
ộ
N i dung
ớ ữ
i thi u v ngôn ng Assembly ng trình Assembler ng trình Assembler
ề ệ 4.1. Gi ươ ế t ch 4.2. Cách vi ươ ấ 4.3. C u trúc ch ậ ệ 4.4. T p l nh
10/19/16 Chương 4: Lập trình hợp ngữ 2
ớ
ữ
ệ
Gi
i thi u ngôn ng Assembly
ấ Là ngôn ng b c th p, dùng chính các câu ủ
ữ ậ ậ ệ
ộ ử
ệ l nh trong t p l nh c a b x lý
ế
ạ
ng trình ch y nhanh và chi m
u đi m ch ượ
ươ ộ
ớ
ỏ
Ư ể dung l
ng b nh nh
ể ữ
ng trình dài, khó ki m soát ỉ ợ ươ ng trình h p ng ch ậ
ế
ươ
ươ ể ượ c đi m ch Nh ả ỗ i, khó b o trì, ch l ạ ch y trên h th ng máy có ki n trúc và t p ệ l nh t
ệ ố ứ ng ng
10/19/16 Chương 4: Lập trình hợp ngữ 3
ứ
Lý do nghiên c u Assembly
Đó là cách tốt nhất để học phần cứng MT và hệ
điều hành.
Vì các tiện ích của nó. Có thể nhúng các chương trình con viết bằng
ASM vào trong các chương trình viết bằng ngôn ngữ cấp cao.
10/19/16 Chương 4: Lập trình hợp ngữ 4
Assembler
Một chương trình viết bằng ngôn ngữ Assembly muốn MT thực hiện được ta phải chuyển thành ngôn ngữ máy. Chương trình dùng để dịch 1 file viết bằng Assembly Chương trình dùng để dịch 1 file viết bằng Assembly ngôn ngữ máy , gọi là Assembler ngôn ngữ máy , gọi là Assembler..
Có 2 chương trình dịch:
MASM và TASM
10/19/16 Chương 4: Lập trình hợp ngữ 5
Lệnh máy
Là 1 chuỗi nhị phân có ý nghĩa đặc biệt – nó ra lệnh
cho CPU thực hiện tác vụ.
Tác vụ đó có thể là :
di chuyển 1 số từ vị trí nhớ này sang vị trí nhớ khác. Cộng 2 số hay so sánh 2 số.
0 0 0 0 0 1 0 0 Add a number to the AL register
1 0 0 0 0 1 0 1 Add a number to a variable
1 0 1 0 0 0 1 1 Move the AX reg to another reg
10/19/16 Chương 4: Lập trình hợp ngữ 6
Lệnh máy
Tập lệnh máy được định nghĩa trước, khi CPU được
Ex : B5 05 là 1 lệnh máy viết dạng số hex, dài 2 byte. Byte đầu B5 gọi là Opcode Byte sau 05 gọi là toán hạng Operand
Ý nghĩa của lệnh B5 05 : chép giá trị 5 vào reg AL
sản xuất và nó đặc trưng cho kiểu CPU .
10/19/16 Chương 4: Lập trình hợp ngữ 7
Cách dịch chương trình Assembly
Soạn CT TenCT.ASM
Dịch CT
Dùng 1 phần mềm soạn thảo VB bất kỳ để soan CT Assembly như : NotePad, NC, màn hình C, Pascal ... lưu CT có phần mở rộng là .ASM dùng MASM để dịch chương trình nguồn .ASM File Object.
Liên kết CT
Dùng LINK để liên kết Object tạo tập tin thực hiện .EXE
Chạy CT
Gõ tên tập tin thực hiện .EXE từ dấu nhắc DOS để chạy
10/19/16 Chương 4: Lập trình hợp ngữ 8
ố ế
ị
ươ
D ch và n i k t ch
ng trình
MASM.EXE
TenCT .ASM
TenCT .OBJ
LINK.EXE
TenCT .CRF
TenCT .MAP
TenCT .LIB
TenCT .EXE
10/19/16 Chương 4: Lập trình hợp ngữ 9
ươ
ợ
ữ
Khung ch
ng trình h p ng
ớ
ể
ằ
ế
ở ầ
ươ
ệ
ng trình chính ươ ỏ
ng trình
ế
ng trình con (n u có) đ
ể ở ạ t
i đây
ộ .MODEL Small ;ki u b nh cướ .STACK 100 ; kích th .DATA ; khai báo bi n và h ng .CODE MAIN PROC ; kh i đ u cho DOS MOV AX, @DATA MOV DS,AX các l nh ch MOV AH,4CH ; thoát kh i ch INT 21H MAIN ENDP ươ các ch END MAIN
10/19/16 Chương 4: Lập trình hợp ngữ 10
ử ụ
ộ
ớ
Khai báo quy mô s d ng b nh
Ki uể
Mô tả
ữ ệ
ệ
ạ
ọ
ộ
Mã l nh và d li u gói g n trong m t đo n
TINY
ữ ệ
ệ
ạ
ạ
Mã l nh trong 1 đo n. D li u trong 1 đo n
SMALL
ữ ệ
ệ
ề
ạ
ơ
ạ Mã l nh nhi u h n 1 đo n. D li u trong 1 đo n
MEDIUM
ề
ệ
ạ
ạ
ơ
ữ ệ Mã l nh trong 1 đo n. D li u trong nhi u h n 1 đo n
COMPACT
ệ
ề
ạ
ạ
ơ
LARGE
ề ả
ớ
ơ
ữ ệ ơ Mã l nh nhi u h n 1 đo n. D li u nhi u h n 1 đo n, không có m ng nào l n h n 64K
ệ
ữ ệ
ề
ạ
ơ
ơ
HUGE
ả
ơ
ạ ề Mã l nh nhi u h n 1 đo n. D li u nhi u h n 1 đo n, các ể ớ m ng có th l n h n 64K
10/19/16 Chương 4: Lập trình hợp ngữ 11
ế
ạ Khai báo đo n ngăn x p
Khai báo vùng nh dùng làm ngăn x p ph c v cho
ụ ụ ế ớ
ươ
ng trình ch Stack kích th ế ặ ị cướ N u không khai báo thì m c đ nh là 1KB
10/19/16 Chương 4: Lập trình hợp ngữ 12
ữ ệ
ạ
Khai báo đo n d li u
Dùng đ nh nghĩa các bi n và h ng Ví dụ
ị ế ằ
.DATA
MSG DB ‘Hello!$’ CR DB 13 LF EQU 10
10/19/16 Chương 4: Lập trình hợp ngữ 13
ạ
Khai báo đo n mã
ươ
ươ ệ ng trình con
.Code Main Proc ệ ; Các l nh thân ch ng trình chính Call ten_chuong_trinh_con ;goi ctc Main Endp Ten_chuong_trinh_con Proc ; Các l nh thân ch RET Ten_chuong_trinh_con Endp END MAIN
10/19/16 Chương 4: Lập trình hợp ngữ 14
Dạng lệnh
[name] [operator] [ operand] [comment]
ạ ớ
ệ Mã l nh d ng g i nhợ
Register, ô nhớ ị ằ Tr , h ng
Nhãn, tên bi nế Tên th t củ ụ
Ví dụ:
ỗ
ỗ
ệ
MOV CX , 0 ;gan zero
ứ ỉ M i dòng ch ch a 1 l nh và m i ả ằ ệ l nh ph i n m trên 1 dòng
LAP : MOV CX, 4
LIST DB 1,2,3,4
10/19/16 Chương 4: Lập trình hợp ngữ 15
INT 21H
Muốn sử dụng hàm nào của INT 21h ta đặt function_number vào thanh ghi AH, sau đó gọi INT 21h
Lệnh INT số hiệu ngắt được dùng để gọi chương trình ngắt của DOS và BIOS.
AH=1: nhập 1 ký tự từ bàn phím AH=2: xuất 1 ký tự ra mà hình.
AH=9: xuất 1 chuổi ký tự ra màn hình AH=4CH: kết thúc chương trình .EXE
10/19/16 Chương 4: Lập trình hợp ngữ 16
INT 21h
Hàm 1 : Nhập 1 ký tự
Input : AH =1 Output : AL = mã ASCCI của phím ấn
= 0 nếu 1 phím điều khiển được ấn
Hàm 2 : Hiển thị 1 ký tự ra màn hình
Input : AH =2 DL = Mã ASCII của ký tự hiển thị hay ký tự điều khiển
10/19/16 Chương 4: Lập trình hợp ngữ 17
Khai báo bi nế
Cú pháp : [tên biến] DB | DW |.... [trị khởi tạo] Là một tên ký hiệu dành riêng cho 1 vị trí trong
bộ nhớ nơi lưu trữ dữ liệu.
Offset của biến là khoảng cách từ đầu phân đoạn
đến biến đó.
VD : khai báo 1 danh sách aList ở địa chỉ 100 với
nội dung sau : .data
aList db “ABCD”
10/19/16 Chương 4: Lập trình hợp ngữ 18
Khai báo bi nế
Từ gợi nhớ
Mô tả
Số byte
Thuộc tính
DB
Định nghĩa byte
1
Byte
DW
Từ
2
Word
DD
Từ kép
4
Doubleword
DQ
Từ tứ
8
Quardword
DT
10 bytes
10
tenbyte
10/19/16 Chương 4: Lập trình hợp ngữ 19
Minh họa khai báo biến
Char db ‘A’ Num db 41h Mes db “Hello Word”,’$’ Array_1 db 10, 32, 41h, 00100101b Array_2 db 2,3,4,6,9 Myvar db ? ; bieán khoâng khôûi taïo Btable db 1,2,3,4,5 db 6,7,8,9,10
10/19/16 Chương 4: Lập trình hợp ngữ 20
Toán tử DUP
Lặp lại 1 hay nhiều giá trị khởi tạo. VD :
Bmem DB 50 Dup(?) ; khai báo vùng nhớ gồm 50 bytes. db 4 dup (“ABC”) ;12 bytes “ABCABCABCABC” db 4096 dup (0) ; Vùng đệm 4096 bytes tất cả bằng 0
10/19/16 Chương 4: Lập trình hợp ngữ 21
Khởi tạo biến
Lưu ý : Khi khởi tạo trị là 1 số hex thì giá trị số luôn luôn bắt đầu bằng 1 ký số từ 0 đến 9. Nếu ký số bắt đầu là A.. F thì phải thêm số 0 ở đầu.
VD :
Db A6H ; sai Db 0A6h ; đúng
10/19/16 Chương 4: Lập trình hợp ngữ 22
ậ ệ T p l nh
ả Tham kh o PDF File
10/19/16 Chương 4: Lập trình hợp ngữ 23
ể
ữ
ữ ấ Chuy n ngôn ng c p cao thành ngôn ng ASM
ả ử
ế ừ
s A và B là 2 bi n t
. ệ
ữ ấ
ữ
ề
ẽ
ể
ề
ệ
Gi Chúng ta s chuy n các m nh đ sau trong ngôn ng c p cao ra ngôn ng ASM . M nh đ B=A
ư ư
AX,A B,AX
; đ a A vào AX ; đ a AX vào B
ệ
MOV MOV ề M nh đ A=5A
ư
AX,5 AX,A A,AX
; đ a 5 vào AX ; AX=5A ; A=5A
A A,5
;A=A ;A=5A
ệ
MOV SUB MOV cách khác : NEG ADD ề M nh đ A=B2*A MOV SUB SUB MOV
AX,B AX,A AX,A A,AX
;Ax=B ;AX=BA ;AX=B2*A ;A=B2*A
10/19/16 Chương 4: Lập trình hợp ngữ 24
ẽ
ấ
C u trúc r nhánh
IF condition is true THEN
execute true branch statements
END IF
Ho cặ
IF condition is true THEN
execute true branch statements
ELSE
execute false branch statements
END_IF
10/19/16 Chương 4: Lập trình hợp ngữ 25
ằ
ị
ị ế ụ Ví d 1: Thay th giá tr trên AX b ng giá tr ệ ố ủ tuy t đ i c a nó
ậ Thu t toán:
IF AX<0
THEN
replace AX by AX
ENDIF
Mã hoá:
;if AX<0
CMP
AX,0
JNL
END_IF
; no , exit
;then
NEG
AX
; yes , change sign
END_IF :
10/19/16 Chương 4: Lập trình hợp ngữ 26
ủ ứ ự ứ s AL và BL ch a ASCII code c a 1 ký ự ướ tr ký .Hãy xu t ra màn hình ký t c ( theo th t
ả ử ụ Ví d 2 : gi ự ấ t ) ự t
ậ
Thu t toán
IF AL<= BL THEN display AL
ELSE
display character in BL
END_IF
Mã hoá :
ẩ
ấ
ự
ị ; chu n b xu t ký t
AH,2
;if
; AL<=BL? ; no, display character in BL
MOV AL<=BL CMP JNBE
AL,BL ELSE_
;then
MOV JMP
DL,AL DISPLAY
ELSE_:
DL,BL
21H
MOV DISPLAY: INT END_IF :
10/19/16 Chương 4: Lập trình hợp ngữ 27
ề
ẽ
ướ
R nhánh nhi u h
ng
ẽ
ướ
Case là m t c u trúc r nhánh nhi u h
ộ ấ ộ
ề ế
ể ứ
ị ụ ể ằ
ể ng . Có th ộ dùng đ test m t thanh ghi hay , bi n nào đó hay m t ể bi u th c mà giá tr c th n m trong 1 vùng các giá ị tr . ấ
ư
ủ
C u trúc c a CASE nh sau :
CASE expression
value_1 : Statements_1 value_2 : Statements_2 . . value_n : Statements_n
10/19/16 Chương 4: Lập trình hợp ngữ 28
Ví dụ
ặ
ằ ươ ặ ặ
ế N u AX âm thì đ t 1 vào BX ế N u AX b ng 0 thì đ t 0 vào BX ế ng thì đ t 1 vào BX N u AX d ậ Thu t toán : CASE AX
< 0 put 1 in BX = 0 put 0 in BX > 0 put 1 in BX
10/19/16 Chương 4: Lập trình hợp ngữ 29
Cài đ tặ
; case AX
CMP JL JE JG
AX,0 NEGATIVE ZERO POSITIVE
; test AX ; AX<0 ; AX=0 ; AX>0
NEGATIVE:
MOV JMP
BX,1 END_CASE
ZERO:
MOV JMP
BX,0 END_CASE
POSITIVE:
MOV JMP
BX,1 END_CASE
END_CASE :
10/19/16 Chương 4: Lập trình hợp ngữ 30
ộ ổ ợ
ớ
ề
ẽ
R nhánh v i m t t
ệ h p các đi u ki n
Đôi khi tình tr ng r nhánh trong các l nh IF , CASE
ẽ
ạ ộ ổ ợ ề ệ ầ c n m t t ệ ướ ạ i d ng :
h p các đi u ki n d Condition_1 AND Condition_2 Condition_2 Condition_1 OR
10/19/16 Chương 4: Lập trình hợp ngữ 31
ụ
ự
ộ
ế
ự
và n u nó là ký t
ọ Ví d 1: Đ c m t ký t hoa thì in nó ra màn hình
ậ Thu t toán :
Read a character ( into AL) IF ( ‘A’<= character ) AND ( charater <= ‘Z’) THEN
display character
END_IF
10/19/16 Chương 4: Lập trình hợp ngữ 32
Cài đ tặ
; read a character
MOV
AH,2
INT
21H
; character in AL
; IF ( ‘A’<= character ) AND ( charater <= ‘Z’)
CMP
AL,’A’
; char >=‘A’?
JNGE END_IF
; no, exit
CMP
AL,’Z
; char <=‘Z’?
JNLE
END_IF
; no exit
; then display it
MOV
DL,AL
MOV
AH,2
INT
21H
END_IF :
10/19/16 Chương 4: Lập trình hợp ngữ 33
ộ
ụ
ự
ế
ặ
, n u ký t
đó là ‘Y’ ho c ế
ự ượ ạ c l
i thì k t
ươ
ọ Ví d 2: Đ c m t ký t ‘y’ thì in nó lên màn hình , ng ng trình . thúc ch
ậ Thu t toán
Read a charcter ( into AL) IF ( character =‘Y’) OR ( character=‘y’) THEN dispplay it ELSE
terminate the program
END_IF
10/19/16 Chương 4: Lập trình hợp ngữ 34
Cài đ tặ
; read a character
MOV INT
AH,2 21H
; character in AL
; IF ( character =‘y’ ) OR ( charater = ‘Y’)
CMP JE CMP JE JMP
AL,’y’ THEN AL,’Y’ THEN ELSE_
; char =‘y’? ;yes , goto display it ; char =‘Y’? ; yes , goto display it ;no , terminate
THEN :
MOV MOV INT JMP
DL,AL AH,2 21H END_IF
ELSE_:
MOV INT
AH,4CH 21h
END_IF :
10/19/16 Chương 4: Lập trình hợp ngữ 35
ấ
ặ C u trúc l p
M t vòng l p g m nhi u l nh đ
ộ ồ ượ ặ ạ c l p l ố ầ i , s l n
ề ệ ệ ụ ề ặ ộ ặ l p ph thu c đi u ki n
10/19/16 Chương 4: Lập trình hợp ngữ 36
Vòng FOR
ể ự
ệ
ệ
ể
L nh LOOP có th dùng đ th c hi n vòng FOR .
LOOP
destination_label
ố ế
ượ
ầ
S đ m cho vòng l p là thanh ghi CX mà ban đ u nó đ ệ
ượ
ự
ằ
ị ả ế ụ
ư ệ
ế ế
ệ
c ẽ ệ c th c hi n CX s ượ c c
ệ ệ
ặ gán 1 giá tr nào đó . Khi l nh LOOP đ ặ ự ộ đ ng gi m đi 1 . N u CX ch a b ng 0 thì vòng l p đ t ượ ự th c hi n ti p t c . N u CX=0 l nh sau l nh LOOP đ ự th c hi n
ằ
ư
ự
ệ
L u ý r ng vòng FOR cũng nh l nh LOOP th c hi n ít
ế
ẽ
ầ
ấ
ứ
ế
ầ
ư ệ ặ ầ nh t là 1 l n. Do đó n u ban đ u CX=0 thì vòng l p s làm ệ ặ ự cho CX=FFFH, t c là th c hi n l p đ n 65535 l n
10/19/16 Chương 4: Lập trình hợp ngữ 37
ụ ấ ặ Ví d : Dùng vòng l p in ra 1 hàng 80 d u ‘*’
ứ
MOV CX,80 MOV AH,2 MOV DL,’*’ ố ầ ặ ; CX ch a s l n l p ự ấ ; hàm xu t ký t ự ư ; DL ch á ký t ‘*’
TOP:
INT
ặ LOOP 21h TOP ấ ; in d u ‘*’ ầ ; l p 80 l n
10/19/16 Chương 4: Lập trình hợp ngữ 38
Vòng WHILE
ệ ề
ộ ệ ụ ự ề ế
Vòng WHILE ph thu c vào 1 đi u ki n .N u đi u ki n đúng thì th c hi n vòng WHILE . Vì v y n u ả đi u ki n sai thì vòng WHILE không th c hi n gì c
ế ậ ệ ệ ề ự ệ
10/19/16 Chương 4: Lập trình hợp ngữ 39
ế
ố
ự ượ đ
c
ể ế t đo n mã đ đ m s ký t ộ
ậ
ạ Ví d :ụ Vi nh p vào trên cùng m t hàng .
ự
ự ọ MOV DX,0 MOV AH,1 INT 21h ố ể ế ; DX đ đ m s ký t ọ ; hàm đ c 1 ký t ; đ c ký t ự vào AL
WHILE_:
ự ả ; có ph i là ký t CR?
END_WHILE ; đúng , thoát
ự
CMP AL,0DH JE INC DX 21h INT JMP WHILE_ ; tăng DX lên 1 ọ ; đ c ký t ; l pặ
END_WHILE :
10/19/16 Chương 4: Lập trình hợp ngữ 40