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=5­A

ư

AX,5 AX,A A,AX

; đ a 5 vào AX ; AX=5­A ; A=5­A

A A,5

;A=­A ;A=5­A

MOV SUB MOV cách khác : NEG ADD ề M nh đ   A=B­2*A MOV SUB SUB MOV

AX,B AX,A AX,A A,AX

;Ax=B ;AX=B­A ;AX=B­2*A ;A=B­2*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

END­IF

 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