LOGO

HỢP NGỮ và LẬP TRÌNH HỆ THỐNG

CHƯƠNG 1: NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH

Phạm Công Hòa GV: Tel: 091.552.9889 Email: conghoaf1@gmail.com

NỘI DUNG HỌC PHẦN

NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH

I

LIÊN KẾT NGÔN NGỮ BẬC CAO VỚI ASM

II

III LẬP TRÌNH HỆ THỐNG

2

NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH

I

1. Ngôn ngữ ASM

2. Hệ lệnh ASM

3. Các lệnh điều khiển khi dịch chương trình ASM

4. Macro và Chương trình con

3

1. NGÔN NGỮ ASM

- Nội dung:

1.1. Giới thiệu chung

1.2. Cài đặt chương trình dịch

1.3. Các bước thực hiện một chương trình ASM

1.4. Cấu trúc chung của một chương trình thuần túy ASM

4

1. NGÔN NGỮ ASM

1.1. Giới thiệu chung

- ASM là ngôn ngữ bậc thấp, gần ngôn ngữ máy. - Ưu điểm:

- Nhược điểm:

 Khó viết vì phải am hiểu phần cứng.  Khó sửa lỗi (lỗi cú pháp và lỗi thuật toán)..

- Ứng dụng:

 Biết lõi của hệ điều hành.  Viết chương trình đo và điều khiển trong công nghiệp  Viết chương trình virus

5

 Tốc độ nhanh.  Tiết kiệm vùng nhớ.

1. NGÔN NGỮ ASM

1.2. Cài đặt chương trình dịch

- Sử dụng MASM (Microsoft) hoặc TASM (Borland).

- Sử dụng EMU8086

Với TASM, có thể copy nguyên CD bản quyền hoặc copy 4 tệp chính:

Tasm.exe Tlink.exe DpmiLoad.exe DpmiMem.dll

6

1. NGÔN NGỮ ASM

1.3. Các bước thực hiện một chương trình ASM

- Gồm 4 bước (Với TASM):

 Bước 1: Dùng chương trình sọan thảo bất kỳ (NC, EDIT, TC, NOTEPAD,…) để viết các lệnh chương trình, lưu vào tệp tin có đuôi “.asm”.

 Bước 2: Dịch tệp “.asm” sang “.obj”. Nếu dịch thành công ta sẽ thấy xuất hiện tệp “.obj”, ngược lại thấy thông báo lỗi dạng: **Error**  Bước 3: Dịch tệp “.obj” sang “.exe”.

 Bước 4: Chạy chương trình (Gọi thi hành tệp “.exe”).

7

1. NGÔN NGỮ ASM

1.4. Cấu trúc chung của một chương trình thuần túy ASM

- Cấu trúc chương trình ASM dạng đơn giản:

;Khai báo biến

;Thân chương trình

Nhãn: [Các chương trình con] (nếu có)

[Phần khai báo MACRO, STRUC, RECORD và UNION] (nếu có) .MODEL .STACK <Độ_lớn_ngăn_xếp> .DATA .CODE END Nhãn

8

1. NGÔN NGỮ ASM

s1 DB 'Hello world!$‟

Mov ax, @data Mov ds, ax Lea dx, s1 Mov ah,9 Int 21h Mov ah,4ch Int 21h

- Ví dụ một chương trình ASM đơn giản: Hiện xâu ký tự “Hello world!” ra màn hình. .MODEL small .STACK 100h .DATA .CODE Main: End Main

9

NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH

I

1. Ngôn ngữ ASM

2. Hệ lệnh ASM

3. Các lệnh điều khiển khi dịch chương trình ASM

4. Macro và Chương trình con

5. Chương trình ASM dạng COM

10

2. HỆ LỆNH ASSEMBLER

- Nội dung:

2.1. Hỗ trợ của hệ thống cho lập trình ASM

2.2. Cú pháp 1 dòng lệnh trong ASM

2.3. Hệ thống lệnh ASM

11

2. HỆ LỆNH ASSEMBLER

2.1. Hỗ trợ của hệ thống cho lập trình ASM

2.1.1. Thanh ghi (Registers)

CPU

12

2. HỆ LỆNH ASSEMBLER

2.1. Hỗ trợ của hệ thống cho lập trình ASM

Thanh ghi (Registers)

- Thanh ghi là vùng nhớ đặc biệt (dạng RAM) nằm ở CPU

13

2. HỆ LỆNH ASSEMBLER

 Phân loại thanh ghi: • Nhóm 1: Gồm 1 thanh ghi cờ 16 bít. Người lập trình ASM hay lấy trạng thái các bit cờ làm điều kiện cho các lệnh nhảy (cờ CF). • Nhóm 2: Gồm 8 thanh ghi đa năng 16 bit:

AX (Accumulator register)

BX (Base register)

CX (Counter regigter)

3 mode truy nhập: AH, AL, AX

DX (Data regigter)

SI

DI

1 mode truy nhập

BP

SP

*Người lập trình chỉ được phép dùng 7 thanh ghi đầu để thay cho biến.

14

2. HỆ LỆNH ASSEMBLER

 Phân loại thanh ghi (tiếp):

• Nhóm 3: Gồm 1 thanh ghi 16 bit con trỏ lệnh: IP

• Nhóm 4: Gồm 4 thanh ghi segment 16 bit: CS, DS, ES, SS

15

2. HỆ LỆNH ASSEMBLER

Một số ý nghĩa chung của các thanh ghi:

• AX, thanh ghi tích luỹ (Accumulatior Register): đây là thanh ghi chính để thực hiện các phép toán số học, các lệnh xuất nhập cổng. Ngoài ra nó cũng được dùng trong một số lệnh xử lý chuỗi.

• BX, thanh ghi cơ sở (Base Register): Dùng để chỉ đến vị trí của một ô nhớ trong một đoạn. Thường thanh ghi BX được dùng trong phép định địa chỉ cơ sở khi truy xuất các dữ liệu trong bộ nhớ.

• CX, thanh ghi đếm (Count Register): thường dùng để định số lần lặp

lại trong một lệnh.

16

• DX, thanh ghi dữ liệu (Data Register): thường dùng để ghi kết quả của các phép toán nhân và chia, định địa cổng trong các phép xuất nhập cổng.

2. HỆ LỆNH ASSEMBLER

• Cờ nhớ CF (Carry Flag): Phép toán có/không mượn. • Cờ phụ AF (Auxiliary Carry Flag): Phép toán có/không mượn đối với

4 bit thấp.

• Cờ Zero ZF (Zero Flag): Phép toán có/không bằng 0. • Cờ dấu SF (Sign Flag): Có giá trị tương ứng với bít cao nhất của kết

quả phép toán vừa được thực hiện.

17

• Cờ chẵn lẻ PF (Parity Flag): Tổng 8 bít thấp là số chẵn/lẻ. • Cờ tràn OF (Overflow Flag): kết quả phép toán các số có dấu bị sai.

2. HỆ LỆNH ASSEMBLER

2.1.2. Cách thể hiện địa chỉ của một ô nhớ.

(1 segment = 64K)

• Dạng Logic: Địa chỉ 1 ô nhớ = Segment : Offset - Giải thích: Phần Segment cho biết ô nhớ đó nằm ở Segment nào, phần Offset cho biết vị trí từ đầu segment đến ô nhớ đó. - Ví dụ: Địa chỉ ô nhớ (4:12) cho ta biết ô nhớ nằm ở vị trí thứ 12 của segment 4.

• Dạng vật lý:

Địa chỉ 1 ô nhớ = Segment * 16 + Offset

18

2. HỆ LỆNH ASSEMBLER

2.1.3. Một số hàm thường dùng của hệ thống hỗ trợ lập trình ASM

• Hàm số 1: Chờ nhận 1 ký tự từ bàn phím.

Mov ah,1 Int 21h

Kết quả: phần AL của thanh ghi AX sẽ nhận mã ASCII của bàn phím.

Ví dụ: Khi người dùng bấm ký tự „A‟, giá trị thanh ghi AL sẽ là:

0 1 0 0 0 0 0 1

19

2. HỆ LỆNH ASSEMBLER

• Hàm số 2: Hiện 1 ký tự ra màn hình tại vị trí con trỏ.

- Cách 1:

Mov al, Mã_ASCII_của_ký_tự Mov ah, 0eh Int 10h

- Cách 2:

Mov al, Mã_ASCII_của_ký_tự Mov ah, 2 Int 21h

20

2. HỆ LỆNH ASSEMBLER

• Hàm số 3: Hiện 1 xâu ký tự (kết thúc bằng dấu $ ra màn hình)

Lea dx, tên_biến_xâu Mov ah,9 Int 21h

• Hàm số 4: Kết thúc chưong trình ASM, trở về DOS

Mov ah,4ch Int 21h

21

2. HỆ LỆNH ASSEMBLER

2.2. Cú pháp 1 dòng lệnh trong ASM

- Trong ngôn ngữ ASM mỗi lệnh được viết trên 1 dòng với cú pháp như sau (không phân biệt chữ hoa/thường):

[Nhãn:] [Tên lệnh] [toán hạng] [;Chú thích]

- Các lệnh trong ngôn ngữ ASM thường được viết tắt bởi các từ tiếng Anh như:

Addition Multiplication Move …

Add Mul Mov …

22

2. HỆ LỆNH ASSEMBLER

- Một số quy ước về các toán hạng:

Toán hạng nguồn

SRC (Source)

Toán hạng đích Thanh ghi Biến nhớ

DST (Destination) REG (Register) Mem (Memory)

Hằng số dữ liệu

Data

Thanh ghi Segment

SegReg (Segment Register)

23

2. HỆ LỆNH ASSEMBLER

2.3. Hệ thống lệnh ASM

- Phân loại lệnh:

 Các lệnh di chuyển dữ liệu.

 Nhóm lệnh số học.

 Nhóm lệnh thao tác bit.

 Nhóm lệnh làm việc với xâu ký tự.

 Nhóm lệnh rẽ nhánh.

 Nhóm lệnh làm việc với các bit cờ.

24

2. HỆ LỆNH ASSEMBLER

MOV DST, SRC

2.3.1. Các lệnh di chuyển dữ liệu.  Lệnh 1: MOV - Cú pháp: - Chức năng: Đưa giá trị toán hạng nguồn SRC vào toán hạng đích DST.

- Chú ý:

+ Các toán hạng DST và SRC có thể chuyển nhận giá trị theo các dạng:

DST

SRC

Ví dụ

Reg1

Reg2

Mov ax, bx

Reg

Mem

Mov ax, value

Reg

Data

Mov ax, 123

Mem

Reg

Mov value, bx

Mem

Data

Mov value, 50

SegReg

Reg16

Mov ds, ax

Reg16

SegReg

Mov ax, es

SegReg

Mem

Mov ds, value

25

2. HỆ LỆNH ASSEMBLER

 Lệnh 1: MOV (tiếp)

Nếu muốn chuyển giá trị từ mem1 sang mem2 ta phải chuyển gián tiếp theo cách:

26

Mov reg, mem1 Mov mem2, reg

2. HỆ LỆNH ASSEMBLER

 Lệnh 2: PUSH

- Cú pháp: PUSH DST

 Lệnh 3: POP

- Chức năng: Đưa 2 byte của DST vào đỉnh STACK

- Cú pháp: POP DST

27

- Chức năng: Lấy 2 byte của đỉnh STACK và đưa vào DST

2. HỆ LỆNH ASSEMBLER

(Sau lệnh Pop AX, trong stack chỉ còn chứa giá trị 158)

28

2. HỆ LỆNH ASSEMBLER

 Lệnh 4: XCHG

- Cú pháp: XCHG DST, SRC

- Chức năng: Hoán đổi nội dung giá trị của 2 toán hạng.

29

- Chú ý: DST và SRC có thể là : Reg1, Reg2 Reg, Mem

2. HỆ LỆNH ASSEMBLER

 Lệnh 5: IN

- Cú pháp: IN AL/AX, Địa_chỉ_cổng

- Chức năng: Đọc địa chỉ cổng dữ liệu 8/16 bit.

30

- Chú ý: Nếu địa chỉ cổng <256 thì địa chỉ đó có thể dùng trực tiếp trong lệnh IN. - Ví dụ: Cổng COM1 của máy tính có địa chỉ 3f8h, muốn đọc nội dung từ cổng COM1 ta phải thực hiện: Mov dx, 3f8h In al, dx

2. HỆ LỆNH ASSEMBLER

 Lệnh 6: OUT

- Cú pháp: OUT Địa_chỉ_cổng, AL/AX

- Chức năng: Đưa địa chỉ có trong thanh ghi AL/AX ra một cổng 8/16 bit.

31

- Chú ý: Về địa chỉ cổng giống với lệnh IN

2. HỆ LỆNH ASSEMBLER

 Lệnh 7: LEA

- Cú pháp: LEA Reg, Value

 Lệnh 8: LDS - Cú pháp: LDS Reg16, Mem - Chức năng: Đưa 2 byte của biến nhớ vào thanh ghi 16 và nội dung 2 byte tiếp theo đưa vào DS.

 Lệnh 9: LES

- Cú pháp: LES Reg16, Mem - Chức năng: Giống lệnh LDS chỉ khác DS được thay thế bằng ES.

32

- Chức năng: Lấy địa chỉ offset của biến đưa vào thanh ghi Reg.

2. HỆ LỆNH ASSEMBLER

2.3.2. Nhóm lệnh số học.

- Nhóm lệnh thực hiện các phép toán số học: +,-,*,/,…

33

- Chú ý: Hầu hết các lệnh của nhóm này khi thực hiện có thể làm thay đổi các bit cờ.

2. HỆ LỆNH ASSEMBLER

 Lệnh 1: ADD

- Cú pháp: ADD DST, SRC - Chức năng: Cộng giá trị 2 toán hạng. Kết quả của phép cộng sẽ nằm ở DST. - Chú ý:

(Bảng*)

+ Các toán hạng sử dụng trong hàm có thể là:

DST

SRC

Ví dụ

Reg1

Reg2

Add ax, bx

Reg

Data

Add cx, 200

Reg

Mem

Add ax, value

Mem

Reg

Add value, dx

Mem

Data

Add value, 300

+ Các cờ bị tác động: C, P, A, Z, S, O

34

2. HỆ LỆNH ASSEMBLER

 Lệnh 2: ADC

- Chức năng: Cộng giá trị 2 toán hạng và giá trị cờ.

- Cú pháp: ADC DST, SRC

- Chú ý:

+ Các cờ bị tác động: C, P, A, Z, S, O

35

+ (Bảng*)

2. HỆ LỆNH ASSEMBLER

 Lệnh 3: INC

- Chức năng: Tăng giá trị của toán hạng DST lên 1

- Cú pháp: INC DST

- Chú ý:

+ Các cờ bị tác động: C, P, A, Z, S, O

36

+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (mem)

2. HỆ LỆNH ASSEMBLER

 Lệnh 4: SUB

- Chức năng: Phép trừ DTS – SRC (DST  DST – SRC)

- Cú pháp: SUB DST, SRC

- Chú ý:

+ Các cờ bị tác động: C, P, A, Z, S, O

37

+ (Bảng*)

2. HỆ LỆNH ASSEMBLER

 Lệnh 5: DEC

- Chức năng: Trừ giá trị toán hạng DST đi 1

- Cú pháp: DEC DST

- Chú ý:

+ Các cờ bị tác động: C, P, A, Z, S, O

38

+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (Mem).

2. HỆ LỆNH ASSEMBLER

 Lệnh 6: NEG

- Chức năng: Đổi dấu giá trị của toán hạng.

- Cú pháp: NEG DST

- Chú ý:

+ Các cờ bị tác động: C, P, A, Z, S, O

39

+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (Mem).

2. HỆ LỆNH ASSEMBLER

 Lệnh 7: CMP

- Chức năng: So sánh nội dung 2 toán hạng và dựng cờ.

- Cú pháp: CMP DST, SRC

- Chú ý:

+ Các cờ bị tác động: C, P, A, Z, S, O

+ Kết quả:

Nếu DST=SRC Nếu DST=SRC Nếu DST<>SRC

thì cờ C = 1 thì cờ C = 0 thì cờ Z = 1 thì cờ Z = 0

40

+ (Bảng*)

2. HỆ LỆNH ASSEMBLER

 Lệnh 8: MUL|IMUL - Cú pháp: MUL|IMUL SRC - Chức năng: Thực hiện phép nhân không dấu | phép nhân có dấu.

toán hạng nguồn SRC

là 16 bit

là DX:AX

+ Nếu toán hạng nguồn SRC là 8 bit thì kết quả là AX (AX=AL*SRC) + Toán hạng nguồn có thể là Reg hoặc Mem. + Phải xóa giá trị nằm trong DX trước khi thực hiện phép nhân. + Nếu thì kết quả (DX:AX=AX*SRC)

41

- Chú ý:

2. HỆ LỆNH ASSEMBLER

 Lệnh 9: DIV|IDIV

- Cú pháp: DIV|IDIV SRC

- Chức năng: Thực hiện phép chia giữa 2 toán hạng (không dấu|có dấu). - Chú ý:

42

+ Chia số 16 bit (nằm trong AX) cho số 8 bit, ta được kết quả: AL: thương số; AH: số dư + Chia số 32 bit (nằm trong DX:AX) cho số 16 bit, ta được kết quả: AX: thương số; DX: số dư + Phải xóa giá trị nằm trong DX trước khi thực hiện phép chia.

2. HỆ LỆNH ASSEMBLER

2.3.3. Nhóm lệnh thao tác bit. - Nhóm lệnh thực hiện các phép toán dịch chuyển bit, đảo bit, so sánh các bit,….

- Chú ý: Hầu hết các lệnh của nhóm này khi thực hiện có thể làm thay đổi các bit cờ.

43

2. HỆ LỆNH ASSEMBLER

 Lệnh 1: AND

- Cú pháp: AND DST, SRC

- Chức năng: Thực hiện phép “và” logic. Bit của kết quả = 1 khi 2 bit tương ứng của 2 toán hạng đều bằng 1.

al = 0101 1010 bl = 1001 0110

cho kết quả:

0001 0010

- Ví dụ: AND al,bl

- Chú ý:

44

+ (Bảng*) + Các cờ bị tác động: P, Z, S

2. HỆ LỆNH ASSEMBLER

 Lệnh 2: OR

- Cú pháp: OR DST, SRC

- Chức năng: Thực hiện phép “hoặc” logic. Bit của kết quả = 1 khi chỉ cần 1 trong 2 bit tương ứng của 2 toán hạng bằng 1.

al = 1010 0110 bl = 0101 0110

cho kết quả: 1111 0110

- Ví dụ: OR al,bl

- Chú ý:

45

+ (Bảng*) + Các cờ bị tác động: P, Z, S

2. HỆ LỆNH ASSEMBLER

 Lệnh 3: XOR

- Cú pháp: XOR DST, SRC

- Chức năng: Thực hiện phép toán OR có loại trừ. Bit của kết quả = 1 khi 2 bit tương ứng của 2 toán hạng có giá trị khác nhau.

al = 1010 0110 bl = 0101 0110

cho kết quả:

kq= 1111 0000

- Ví dụ: XOR al,bl

- Chú ý:

46

+ (Bảng*) + Các cờ bị tác động: P, Z, S

2. HỆ LỆNH ASSEMBLER

 Ví dụ: Thực hiện gán giá trị của thanh ghi AX bằng 0 mov ax, 0 sub ax, ax and ax, 0 xor ax, ax

- Cách 1: - Cách 2: - Cách 3: - Cách 4:

47

2. HỆ LỆNH ASSEMBLER

 Lệnh 4: SHL (Shift Left)

- Chức năng: Dịch trái toán hạng count bit.

- Cú pháp: SHL DST, count

- Chú ý:

Mov cl, 4 SHL ax, cl

48

+ Nếu count=1 thì ta có thể đặt số 1 trực tiếp trong lệnh, nếu count >1 thì ta phải sử dụng đến thanh ghi CL làm trung gian: + Các cờ bị tác động: C, P, Z, S, O + Dịch trái 1 bit: Bit đầu tiên (bên trái) được chuyển vào cờ C + Dịch count bit: Bit thứ count được chuyển vào cờ C (bit đầu tiên bên phải sẽ được gán = 0)

2. HỆ LỆNH ASSEMBLER

49

2. HỆ LỆNH ASSEMBLER

 Lệnh 5: SHR (Shift Right)

- Chức năng: Dịch phải toán hạng count bit.

- Cú pháp: SHR DST, count

- Chú ý:

Mov cl, 4 SHR ax, cl

50

+ Nếu count=1 thì ta có thể đặt số 1 trực tiếp trong lệnh, nếu count >1 thì ta phải sử dụng đến thanh ghi CL làm trung gian: + Các cờ bị tác động: C, P, Z, S, O + Dịch phải 1 bit: Bit đầu tiên (bên phải) được chuyển vào cờ C + Dịch count bit: Bit thứ count được chuyển vào cờ C

2. HỆ LỆNH ASSEMBLER

 Lệnh 6: SAR (Shift Arithmetic Right )

- Cú pháp: SAR DST, count

- Chức năng: Mỗi lần dịch = Chia đôi giá trị toán hạng đích DST làm tròn dưới.

+ Giống với lệnh SHR

- Chú ý:

+ Các cờ bị tác động: C, P, Z, S, O

51

-Ví dụ: dịch 1 lần: 1000 1010 -> 0100 0101

2. HỆ LỆNH ASSEMBLER

 Lệnh 7: ROL (Rotate Left)

- Cú pháp: ROL DST, count

- Chức năng: Dịch các bit của toán hạng đích DST sang trái theo vòng tròn.

+ Giống với lệnh SHR

- Chú ý:

+ Các cờ bị tác động: C, P, Z, S, O

52

-Ví dụ: dịch 1 lần: 1000 1010 -> 0001 0101

2. HỆ LỆNH ASSEMBLER

53

2. HỆ LỆNH ASSEMBLER

 Lệnh 8: ROR (Rotate Right)

- Cú pháp: ROR DST, count

- Chức năng: Dịch các bit của toán hạng đích DST sang phải theo vòng tròn.

+ Giống với lệnh SHR

- Chú ý:

+ Các cờ bị tác động: C, P, Z, S, O

54

-Ví dụ: dịch 1 lần: 1000 1010 -> 0001 0101

2. HỆ LỆNH ASSEMBLER

2.3.4. Nhóm lệnh làm việc với xâu ký tự.  Lệnh 1: MOVSB|MOVSW

- Cú pháp: MOVSB/MOVSW

 Lệnh 2: LODSB|LODSW

- Chức năng: Chuyển các ký tự xâu theo từng byte (hoặc từng Word) từ vùng nhớ trỏ bởi DS:SI đến vùng nhớ trỏ bởi ES:DI

- Cú pháp: LODSB/LODSW

55

- Chức năng: Chuyển các ký tự xâu theo từng byte (hoặc từng Word) từ vùng nhớ trỏ bởi DS:SI đến vùng nhớ trỏ bởi AL/AX

2. HỆ LỆNH ASSEMBLER

 Lệnh 3: STOSB|STOSW

- Cú pháp: STOSB/STOSW - Chức năng: Chuyển các ký tự xâu theo từng byte (hoặc từng Word) từ vùng nhớ trỏ bởi AL/AX đến vùng nhớ trỏ bởi DS:DI

 Lệnh 4: CMPSB|CMPSW

- Cú pháp: CMPSB/CMPSW - Chức năng: So sánh các ký tự của 2 xâu theo từng byte giữa 2 vùng nhớ DS:SI và ES:DI.

56

2. HỆ LỆNH ASSEMBLER

2.3.5. Nhóm lệnh rẽ nhánh  Lệnh 1: CALL

- Cú pháp: CALL Tên_CTCon

 Lệnh 2: RET

- Chức năng: Gọi thực hiện chương trình con (có tên Tên_CTCon )

- Chức năng: Từ chương trình con quay về đoạn chương trình đã gọi nó.

57

- Cú pháp: RET

2. HỆ LỆNH ASSEMBLER

 Lệnh 3: INT

- Chức năng: Gọi một chương trình con phục vụ ngắt của hệ thống.

- Cú pháp: INT n

- Chú ý: n là số ngắt

 Lệnh 4: IRET

- Ví dụ: int 21h

- Cú pháp: IRET

58

- Chức năng: Trở về đoạn chương trình đã kích hoặt nó từ chương trình con phục vụ ngắt.

2. HỆ LỆNH ASSEMBLER

 Lệnh 5: JMP (jump)

- Chức năng: Nhảy không điều kiện tới 1 nhãn.

- Cú pháp: JMP nhãn (hoặc địa chỉ Seg:Offset)

59

- Chú ý: Bước nhảy của lệnh JMP<=64K

2. HỆ LỆNH ASSEMBLER

 Lệnh 6: Tập các lệnh nhảy có điều kiện

- Cú pháp: Cmp DST,SRC Tên_lệnh nhãn

- Bao gồm các lệnh:

Ý nghĩa

Tên_lệnh

Jump below

Nhảy nếu DST nhỏ hơn SRC

JB

Nhảy nếu không lơn hơn hay bằng

Jnae

Jump not above and equal

Jbe/Jna …

Je

Jne

Ja

Jae

60

2. HỆ LỆNH ASSEMBLER

 Lệnh 6: Tập các lệnh nhảy có điều kiện (tiếp)

- Với số có dấu:

Tên_lệnh

Ý nghĩa

Jl

Jump less

Nhảy nếu DST nhỏ hơn SRC

Jle

Jg

Jump greater

Nhảy nếu DST lớn hơn SRC

61

2. HỆ LỆNH ASSEMBLER

Nếu cờ C=1 thì nhảy tới Nhãn Nếu cờ C=0 thì nhảy tới Nhãn

 Lệnh 7: Lệnh nhảy theo trạng thái bit cờ. - Cú pháp: JC Nhãn JNC Nhãn

62

- Chú ý: Tương tự với các lệnh JZ, JNZ, JS, JNS

2. HỆ LỆNH ASSEMBLER

 Lệnh 8: LOOP

Cú pháp:

;Khối lệnh ASM

Mov cx, số_lần_lặp Nhãn: LOOP Nhãn

63

- Chú ý: Thực hiện lặp các công việc nằm giữa Nhãn và LOOP cho đến khi giá trị của CX=0, sau mỗi lần lặp CX tự động giảm đi 1.

2. HỆ LỆNH ASSEMBLER

2.3.6. Nhóm lệnh làm việc với các bit cờ.  Lệnh 1: CLC (Clear Carry)

- Cú pháp: CLC

 Lệnh 2: STC (Set Carry)

- Chức năng: Gán giá trị cờ C = 0

- Chức năng: Gán giá trị cờ C = 1

64

- Cú pháp: STC

2. HỆ LỆNH ASSEMBLER

 Lệnh 3: CMC

- Chức năng: Đảo bit cờ C

 Lệnh 4: CLI (Clear Interrupt flag)

- Cú pháp: CMC

- Cú pháp: CLI

 Lệnh 5: STI (Set Interrupt flag)

- Cú pháp: STI

- Chức năng: Gán cờ I = 0 (cấm ngắt cứng – trừ ngắt không che).

65

- Chức năng: Gán cờ I = 1 (cho phép ngắt với ngắt cứng).

NỘI DUNG HỌC PHẦN

NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH

I

1. Ngôn ngữ ASM

2. Hệ lệnh ASM

3. Các lệnh điều khiển khi dịch chương trình ASM

4. Macro và Chương trình con

5. Chương trình ASM dạng COM

66

3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH

Các lệnh điều khiển Segment đơn giản

- Bao gồm:

.MODEL .STACK .DATA .CODE

67

3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH

3.1. Lệnh điều khiển .MODEL

- Chức năng: Báo cho chương trình dịch của ASM biết để xác lập một vùng nhớ RAM thích hợp cho chương trình.

.MODEL

- Cú pháp:

- Trong đó nhận các giá trị sau:

Kiểu

Ý nghĩa

Tiny

Vùng nhớ dành cho CODE+DATA<=64Kb

Small

CODE<=64Kb; DATA<=64Kb

Compact

CODE<=64Kb; DATA>=64Kb

Medium

CODE>=64Kb; DATA<=64Kb

Large

CODE>=64Kb; DATA>=64Kb nhưng 1 mảng <=64Kb

Huge

CODE>=64Kb; DATA>=64Kb

68

3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH

3.2. Lệnh điều khiển .STACK

- Chức năng: Báo cho chương trình dịch ASM biết để xác lập một vùng nhớ RAM cho stack.

.STACK <Độ_lớn >

- Cú pháp:

- Trong đó <Độ_lớn> tính theo byte

.STACK 100h ; 100h=256 byte

69

- Ví dụ:

3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH

3.3. Lệnh điều khiển .DATA

- Chức năng: Báo cho ASM biết để xác lập một vùng nhớ RAM dành cho dữ liệu (các biến trong chương trình).

.DATA

70

- Cú pháp: ;Khai báo biến (biến số, biến xâu, biến trường số)

3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH

3.4. Lệnh điều khiển .DATA (tiếp) a) Khai báo biến số:

- Trong đó có thể là: db (1 byte) dw (2 byte) dd (4 byte) dp (6 byte) dq (8 byte) dt (10 byte) - Giá trị ban đầu có thể là một hằng hoặc „?‟ nếu chưa muốn gán. - Ví dụ:

.DATA

X db 15 Y dw ?

71

3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH

3.4. Lệnh điều khiển .DATA (tiếp) b) Khai báo biến xâu:

db

- Dạng 1: Ví dụ: strName DB „HA$‟

db <Độ_lớn>

- Dạng 2: Ví dụ: strName1 DB 100h dup(„A‟) strName2 DB 100h dup(?)

72

 Chú ý: Nếu trong chương trình có khai báo .DATA (và có khai báo biến) thì người lập trình ASM phải đưa địa chỉ Segment dữ liệu vào thanh ghi DS nhờ 2 lệnh sau: Mov AX, @data Mov DS, AX

3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH

3.5. Lệnh điều khiển .CODE

- Chức năng: Báo cho chương trình dịch ASM biết để xác lập vùng nhớ RAM cho phần mã lệnh chương trình.

; Thân chương trình

- Cú pháp:

.CODE

Nhãn_chương_trình: END Nhãn_chương_trình

73

Bài tập thực hành phần 1

74

Bài tập thực hành phần 1

 Ví dụ 1: Viết chương trình thuần túy asm thực hiện các công việc sau:

75

- Hiện xâu „Hello World!‟ ra màn hình

Bài tập thực hành phần 1

 Ví dụ 2: Viết chương trình thuần túy asm thực hiện các công việc sau:

- Hiện 1 số nguyên nằm trong thanh ghi ax ra màn hình dạng nhị phân Ví dụ: AX chứa giá trị 5, hiện thị trên màn hình

76

+ Dạng đầy đủ: 0000 0000 0000 0101 + Dạng rút gọn: 101

NỘI DUNG HỌC PHẦN

NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH

I

1. Ngôn ngữ ASM

2. Hệ lệnh ASM

3. Các lệnh điều khiển khi dịch chương trình ASM

4. Macro và Chương trình con

5. Chương trình ASM dạng COM

77

4. MACRO và CHƯƠNG TRÌNH CON

4.1. Macro

- Ý nghĩa: Cho phép người lập trình ASM tạo ra các lệnh mới trên cơ sở sử dụng các lệnh chuẩn ASM.

 Tạo Macro

- Có thể viết các macro trong các tệp tin độc lập.

;Bảo vệ các thanh ghi mà thân macro sẽ phá vỡ. ;Các lệnh ASM. ;Hồi phục lại các lệnh Macro mà thân chương trình đã phá vỡ.

- Cú pháp:

78

MACRO [Danh_sách_đối_số] ENDM

4. MACRO và CHƯƠNG TRÌNH CON

 Sử dụng Macro

INCLUDE Ổ_đĩa:\Đường_dẫn\Tên_tệp_chứa_Macro

79

- Sau khi đã tạo ra một macro ta khai báo chèn macro trong thân chương trình ASM của ta bằng lệnh INCLUDE với cú pháp như sau: -Ví dụ: Include C:\TASM\lib1.asm - Thông thường dòng lệnh chèn macro được đặt ở đầu các chương trình ASM.

4. MACRO và CHƯƠNG TRÌNH CON

- Ví dụ 1: Tạo 1 macro cho phép xóa màn hình. (tương đương hàm clrscr() trong C/C++)

 Một số ví dụ

Mov ah, 0fh Int 10h => Giá trị Mode màn hình sẽ được đưa vào thanh ghi AL

80

+ Cơ chế của màn hình ở chế độ text: Mỗi lần đặt Mode cho màn hình thì màn hình sẽ bị xóa toán bộ và con trỏ đứng ở vị trí góc trên bên trái. • Lấy Mode màn hình (Get mode): • Đặt Mode màn hình (Set mode): Mov AL, số_mode Mov AH,0h Int 10h

4. MACRO và CHƯƠNG TRÌNH CON

4.1. Macro (tiếp)

81

+ Viết macro: Đặt Macro vào tệp tin LIB1.asm clrscr MACRO Push AX Mov AH,0Fh Int 10h Mov AH,0h Int 10h Pop AX ENDM

4. MACRO và CHƯƠNG TRÌNH CON

- Ví dụ 2: Tạo 1 macro cho phép hiện 1 xâu ký tự ra màn hình.

+ Viết macro: Đặt Macro vào tệp tin LIB1.asm

Push AX DX Lea DX, xau Mov AH, 9 Int 21h Pop DX AX

82

Hien_xau MACRO xau ENDM

4. MACRO và CHƯƠNG TRÌNH CON

4.2. Chương trình con

83

- Khái niệm: Đoạn chương trình độc lập giải quyết một nhiệm vụ nào đó. - Ý nghĩa: + Làm cho chương trình có cấu trúc. + Tiết kiệm bộ nhớ. + Giảm mã lệnh, thuận tiện cho việc sửa lỗi.

4. MACRO và CHƯƠNG TRÌNH CON

4.2.1. Cơ chế thực hiện khi một chương trình con được gọi:

- Khi một chương trình con được gọi, chương trình dịch sẽ thực hiện lần lượt các bước sau: • Bước 1: Đưa tham số thực sự vào STACK. • Bước 2: Địa chỉ lệnh tiếp theo được đưa vào STACK. • Bước 3: Chương trình dịch đưa địa chỉ đầu của chương trình con vào thanh ghi CS:IP và chuyển sang chương trình con. • Bước 4: Thực hiện các lệnh trong chương trình con cho đến khi gặp lệnh return thì vào STACK lấy các lệnh tiếp theo trong thanh ghi CS:IP và quay về nơi đã gọi chương trình con. • Bước 5: Tiếp tục các lệnh trong chương trình chính.

84

4. MACRO và CHƯƠNG TRÌNH CON

4.2.2. Cú pháp một chương trình con ASM

PROC [Near|Far]

85

;Bảo vệ các thanh ghi mà thân chương trình con phá vỡ. ;Các lệnh trong thân chương trình con. ;Hồi phục các thanh ghi mà thân chương trình con đã phá vỡ. RET ENDP

4. MACRO và CHƯƠNG TRÌNH CON

4.2.2. Cú pháp một chương trình con ASM (tiếp)

+ Near: (Mặc định) Mã lệnh chương trình con và chương

+ Phần MODEL trong chương trình chính sẽ cho biết

86

- Trong đó: trình chính cùng nằm trên 1 Segment, khác nhau Offset. + Far: Mã lệnh chương trình con và chương trình chính không cùng nằm trên 1 Segment. Địa chỉ vùng nhớ chưa mã lệnh chương trình con và chương trình chính khác nhau cả Segment và Offset. chương trình con là Near hay Far: tiny, small, compact medium, large, huge .MODEL .MODEL => Near => Far

4. MACRO và CHƯƠNG TRÌNH CON

4.2.3. Một số ví dụ  Ví dụ 1: Tạo 1 chương trình con cho phép nhận 1 giá trị số nguyên từ bàn phím. Kết thúc nhập giá trị số bằng phím Enter.

- Chú ý: + Không cho phép vào sai và sửa. + Giá trị số nguyên nhận được đặt trong thanh ghi AX.

- Thuật toán: • Kiểm tra ký tự đầu tiên Nếu là ”-” thì biến cờ dấu = 1, khác “-“ thì biến cờ dấu = 0. • Các ký tự tiếp theo: Nhận từng ký tự và đưa vào AL (dạng mã ASCII), dùng lệnh SUB để được giá trị. • Số nhận được sẽ = số vừa vào + phần số trước đưa vào nhân với 10.

*) Soạn thảo lệnh và đặt trong tệp lib2.asm

87

4. MACRO và CHƯƠNG TRÌNH CON

 Ví dụ 2: Tạo 1 chương trình con cho phép hiện giá trị có trong thanh ghi AX ra màn hình dạng cơ số 10.

- Thuật toán: • Nếu AX chứa số nguyên dương: Chia số trong AX cho 10, đưa phần dư vào STACK và phần thương vào AX cho đến khi AX=0 thì dừng. Lấy từng chữ số lưu trong STACK và hiện ra màn hình. • Nếu AX chứa số âm: Đổi dấu AX và hiện giống phần nguyên dương.

*) Soạn thảo lệnh và đặt trong tệp lib2.asm

88

Bài tập thực hành phần 2

89

Bài tập thực hành phần 2

 Bài tập 1: Viết chương trình thuần túy asm thực hiện các công việc sau:

- Nhập từ bàn phím 2 số nguyên.

- Kiểm tra và hiện giá trị nhỏ nhất trong 2 số vừa nhập.

*) Soạn thảo lệnh và đặt trong tệp tin baitap01.asm

90

Bài tập thực hành phần 2

Mời nhập giá trị b = 5 Tổng của 10 và 5 là: 15 Có tiếp tục không (c/k?):

 Bài tập 2: Nhập từ bàn phím 2 số nguyên a và b. Tính tổng 2 số và hiện ra màn hình. Chương trình khi thực hiện có dạng: Mời nhập giá trị a = 10 Nếu chọn „c‟ thì tiếp tục thực hiện chương trình

*) Soạn thảo lệnh và đặt trong tệp tin baitap02.asm

91

Bài tập thực hành phần 2

 Bài tập 3: Nhập từ bàn phím 1 số nguyên a (1<=a<=7). Tính giai thừa của a và hiện kết quả ra màn hình. Chương trình khi thực hiện có dạng: Nếu chọn „c‟ thì tiếp tục thực hiện chương trình

Mời nhập giá trị a = 5 Giai thừa của 5 là: 120 Có tiếp tục không (c/k?):

*) Soạn thảo lệnh và đặt trong tệp tin baitap03.asm

92

Bài tập thực hành phần 2

Mời nhập giá trị N = 10 Tổng từ 1 đến 10 là : 55 Có tiếp tục không (c/k?):

 Bài tập 4: Nhập từ bàn phím 1 số nguyên N. Tính tổng các số nằm trong đoạn [1..N] và hiện kết quả ra màn hình. Chương trình khi thực hiện có dạng: Nếu chọn „c‟ thì tiếp tục thực hiện chương trình

*) Soạn thảo lệnh và đặt trong tệp tin baitap04.asm

93

Bài tập thực hành phần 2

Nhập số lượng phần tử của dãy N= 3 Số thứ 1 : 6 Số thứ 2 : -3 Số thứ 3 : -7 Tổng các số âm là: -10 Có tiếp tục không (c/k?):

 Bài tập 5: Nhập từ bàn phím 1 dãy N số nguyên. Tính tổng các số âm có trong dãy và hiện kết quả ra màn hình. Chương trình khi thực hiện có dạng: Nếu chọn „c‟ thì tiếp tục thực hiện chương trình

*) Soạn thảo lệnh và đặt trong tệp tin baitap05.asm

94

Q & A

95