Hợp ngữ (Assembly language) là một ngôn ngữ lập trình cấp thấp, mục đích nhằm giao
tiếp trực tiếp với phần cứng của máy tính.
Máy tính chỉ có khả năng hiểu được các tín hiệu 0, 1 dưới dạng điện hoặc từ, gọi là tín
hiệu nhị phân (ngôn ngữ nhị phân còn được gọi là ngôn ngữ máy). Các lệnh của hợp ngữ
thực chất là dạng kí hiệu của ngôn ngữ máy: hợp ngữ sử dụng các kí hiệu bằng tiếng Anh
để biểu diễn các lệnh ngôn ngữ máy cho dễ nhớ hơn.
110 trang |
Chia sẻ: candy98 | Lượt xem: 594 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Giáo trình môn Hợp Ngữ - Phạm Thanh Bình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1
MỤC LỤC
CÁC TỪ VIẾT TẮT............................................................................................................ 4
CHƯƠNG I: CÁC KHÁI NIỆM CƠ BẢN ......................................................................... 5
1.1 Mở đầu ....................................................................................................................... 5
1.2 Biểu diễn số và kí tự trong máy tính .......................................................................... 5
1.2.1 Một số hệ đếm ..................................................................................................... 5
1.2.2 Biểu diễn số nguyên trong máy tính.................................................................... 8
1.2.3 Biểu diễn kí tự trong máy tính........................................................................... 10
1.3 Tổ chức của máy tính ............................................................................................... 11
1.3.1 Sơ đồ hệ thống máy tính.................................................................................... 11
1.3.2 Bộ vi xử lý - CPU.............................................................................................. 12
1.3.3 Tổ chức bộ nhớ trong ........................................................................................ 14
BÀI TẬP CHƯƠNG I.................................................................................................... 17
CHƯƠNG II: CÁC LỆNH CƠ BẢN CỦA HỢP NGỮ .................................................... 18
2.1 Cấu trúc chương trình............................................................................................... 18
2.1.1 Ví dụ .................................................................................................................. 18
2.1.2 Giải thích ........................................................................................................... 18
2.2 Một số lệnh thường dùng ........................................................................................ 20
2.2.1 Cấu trúc câu lệnh hợp ngữ................................................................................. 20
2.2.2 Một số lệnh thường dùng................................................................................... 21
2.3 Nhập xuất dữ liệu ..................................................................................................... 23
2.3.1 Chương trình ngắt.............................................................................................. 23
2.3.2 Chức năng nhập - xuất của ngắt 21h ................................................................. 23
2.4 Cách chạy một chương trình hợp ngữ ...................................................................... 26
BÀI TẬP CHƯƠNG II .................................................................................................. 28
CHƯƠNG III: CÁC LỆNH NHẢY................................................................................... 29
3.1 Thanh ghi cờ và các cờ trạng thái ............................................................................ 29
3.1.1 Cờ nhớ CF ......................................................................................................... 29
3.1.2 Cờ Zero ZF ........................................................................................................ 30
3.1.3 Cờ tràn OF ......................................................................................................... 30
3.2 Các lệnh nhảy có điều kiện ...................................................................................... 30
3.2.1 Ví dụ .................................................................................................................. 30
3.2.2 Một số lệnh nhảy ............................................................................................... 31
3.3 Lệnh nhảy không điều kiện JMP.............................................................................. 33
3.4 Một số ứng dụng của lệnh nhảy ............................................................................... 34
3.4.1 Cấu trúc rẽ nhánh If ........................................................................................... 34
3.4.2 Cấu trúc lặp........................................................................................................ 35
BÀI TẬP CHƯƠNG III ................................................................................................. 39
2
CHƯƠNG IV: CÁC LỆNH LOGIC, DỊCH VÀ QUAY .................................................. 40
4.1 Các lệnh logic........................................................................................................... 40
4.1.1 Các phép toán logic ........................................................................................... 40
4.1.2 Các lệnh logic trong hợp ngữ ............................................................................ 41
4.1.3 Ứng dụng các lệnh logic.................................................................................... 42
4.2 Các lệnh dịch............................................................................................................ 43
4.2.1 Các phép toán dịch ............................................................................................ 43
4.2.2 Các lệnh dịch trong hợp ngữ ............................................................................. 43
4.3 Các lệnh quay ........................................................................................................... 45
4.3.1 Lệnh quay trái (ROL - Rotate Left)................................................................... 45
4.3.2 Lệnh quay phải (ROR - Rotate Right)............................................................... 45
4.3.3 Lệnh quay trái qua cờ CF (RCL – Rotate Carry Left) ...................................... 46
4.3.4 Lệnh quay phải qua cờ CF (RCR – Rotate Carry Right) .................................. 46
BÀI TẬP CHƯƠNG IV................................................................................................. 48
CHƯƠNG V: CÁC LỆNH NHÂN VÀ CHIA .................................................................. 49
5.1 Các lệnh nhân ........................................................................................................... 49
5.1.1 Lệnh MUL (Multiply) ....................................................................................... 49
5.1.2 Lệnh IMUL (Integer Multiply).......................................................................... 50
5.2 Các lệnh chia (Divide) ............................................................................................. 50
5.2.1 Cú pháp lệnh...................................................................................................... 50
5.2.2 Hiện tượng tràn trong phép chia........................................................................ 51
BÀI TẬP CHƯƠNG V .................................................................................................. 53
CHƯƠNG VI: NGĂN XẾP VÀ THỦ TỤC...................................................................... 54
6.1 Các thành phần của chương trình............................................................................. 54
6.2 Cách sử dụng ngăn xếp ............................................................................................ 54
6.2.1 Cất dữ liệu vào ngăn xếp ................................................................................... 54
6.2.2 Lấy dữ liệu khỏi ngăn xếp ................................................................................. 55
6.2.3 Ứng dụng của ngăn xếp..................................................................................... 55
6.2.4 Cách thức làm việc của ngăn xếp ...................................................................... 57
6.3 Thủ tục...................................................................................................................... 60
6.3.1 Cấu trúc thủ tục ................................................................................................. 60
6.3.2 Sử dụng thủ tục.................................................................................................. 60
6.3.3 Quan hệ giữa thủ tục và ngăn xếp ..................................................................... 62
BÀI TẬP CHƯƠNG VI................................................................................................. 64
CHƯƠNG VII: MẢNG VÀ CÁC LỆNH THAO TÁC CHUỖI....................................... 65
7.1 Mảng một chiều (chuỗi) ........................................................................................... 65
7.1.1 Khai báo mảng................................................................................................... 65
7.1.2 Các phần tử của mảng một chiều ...................................................................... 66
7.1.3 Các chế độ địa chỉ.............................................................................................. 67
3
7.2 Các lệnh thao tác với chuỗi ...................................................................................... 69
7.2.1 Lệnh chuyển chuỗi (Moving a String) .............................................................. 69
7.2.2 Lệnh chuyển dữ liệu từ thanh ghi vào chuỗi (Store a String) ........................... 73
7.2.3 Lệnh chuyển dữ liệu từ chuỗi vào thanh ghi (Load a String)............................ 75
BÀI TẬP CHƯƠNG VII ............................................................................................... 77
CHƯƠNG VIII: SỬ DỤNG NGẮT TRONG HỢP NGỮ ................................................ 78
8.1 Khái niệm ngắt ......................................................................................................... 78
8.2 Phân loại ngắt ........................................................................................................... 79
8.2.1 Ngắt mềm .......................................................................................................... 79
8.2.2 Ngắt cứng .......................................................................................................... 79
8.3 Một số ngắt thông dụng............................................................................................ 79
8.3.1 Ngắt 17h – Vào/ra máy in ................................................................................. 80
8.3.2 Ngắt 21h ............................................................................................................ 81
8.4 Bảng vector ngắt....................................................................................................... 85
BÀI TẬP CHƯƠNG VIII .............................................................................................. 87
CHƯƠNG IX: MỘT SỐ VẤN ĐỀ MỞ RỘNG................................................................ 88
9.1 Số nguyên 32 bit....................................................................................................... 88
9.1.1 Các phép toán Cộng và Trừ............................................................................... 88
9.1.2 Các phép Logic.................................................................................................. 89
9.1.3 Các phép toán Dịch ........................................................................................... 90
9.2 Số thực dấu phảy động ............................................................................................. 91
9.2.1 Biểu diễn số thực dưới dạng nhị phân............................................................... 91
9.2.2 Biểu diễn số thực dấu phảy động ...................................................................... 92
9.3 Bộ vi xử lý 80286..................................................................................................... 93
9.3.1 Các đặc trưng..................................................................................................... 93
9.3.2 Một số lệnh mở rộng của 80286........................................................................ 94
9.4 Các bộ vi xử lý 80386 và 80486 .............................................................................. 95
BÀI TẬP CHƯƠNG IX................................................................................................. 97
PHỤ LỤC 1: CHƯƠNG TRÌNH DEBUG........................................................................ 98
1. Giới thiệu chương trình .............................................................................................. 98
2. Sử dụng chương trình................................................................................................. 98
3. Các lệnh của DEBUG ................................................................................................ 98
4. Dùng Debug để kiểm soát chương trình .................................................................. 101
PHỤ LỤC 2: BẢNG MÃ ASCII ..................................................................................... 108
TÀI LIỆU THAM KHẢO ............................................................................................... 109
4
CÁC TỪ VIẾT TẮT
Msb Most Significant Bit
Lsb Least Significant Bit
ASCII American Standard Code for Information Interchange
ALU Arithmetic & Logic Unit
CPU Central Processing Unit
BIOS Base Input – Output System
DOS Disk Operating System
RAM Random Accessing Memory
ROM Read Only Memory
MASM Microsoft Macro Assembler
5
CHƯƠNG I: CÁC KHÁI NIỆM CƠ BẢN
1.1 Mở đầu
Hợp ngữ (Assembly language) là một ngôn ngữ lập trình cấp thấp, mục đích nhằm giao
tiếp trực tiếp với phần cứng của máy tính.
Máy tính chỉ có khả năng hiểu được các tín hiệu 0, 1 dưới dạng điện hoặc từ, gọi là tín
hiệu nhị phân (ngôn ngữ nhị phân còn được gọi là ngôn ngữ máy). Các lệnh của hợp ngữ
thực chất là dạng kí hiệu của ngôn ngữ máy: hợp ngữ sử dụng các kí hiệu bằng tiếng Anh
để biểu diễn các lệnh ngôn ngữ máy cho dễ nhớ hơn. Ví dụ:
Lệnh ngôn ngữ máy Lệnh hợp ngữ
0010 1010 1011 0100
0010 0001 1100 1101
MOV AH,2Ah
INT 21h
Ta thấy các lệnh máy tính bằng các dãy bít 0, 1 rất dài và khó nhớ, còn lệnh hợp ngữ
thì ngắn gọn hơn nhiều. Khi chạy một chương trình hợp ngữ thì phải dịch nó sang ngôn
ngữ máy.
Học hợp ngữ, không chỉ để học một ngôn ngữ lập trình có tốc độ rất nhanh (hợp ngữ là
ngôn ngữ lập trình có tốc độ nhanh nhất) mà còn để nắm bắt được bản chất bên trong của
máy tính, biết cách tác động trực tiếp vào phần lõi của máy tính.
1.2 Biểu diễn số và kí tự trong máy tính
1.2.1 Một số hệ đếm
a) Hệ thập phân (Decimal) - Hệ đếm cơ số 10
Hệ thập phân sử dụng 10 kí hiệu (0, 1, 2,...9) để biểu diễn thông tin. Các số trong hệ
thập phân được biểu diễn dưới dạng tổng các luỹ thừa cơ số 10.
Ví dụ:
Số 1998 trong hệ thập phân có thể biểu diễn như sau:
(1998)10 = 1×103 + 9×102 + 9×101 + 8×100
Trong hợp ngữ, người ta kí hiệu 1 số thập phân bằng chữ D hoặc d ở cuối (viết tắt của
Decimal), cũng có thể không cần viết các chữ đó.
Ví dụ:
(1998)10 được kí hiệu là: 1998D, 1998d, hoặc đơn giản là 1998
b) Hệ nhị phân (Binary) - Hệ đếm cơ số 2
6
Hệ nhị phân sử dụng 2 kí hiệu (0,1) để biểu diễn thông tin. Các số trong hệ nhị phân
được biểu diễn dưới dạng tổng các luỹ thừa cơ số 2.
Ví dụ:
Số 1101 trong hệ nhị phân có thể biểu diễn như sau:
(1101)2 = 1×23 + 1×22 + 0×21 + 1×20
= (13)10
Trong hợp ngữ, người ta kí hiệu 1 số nhị phân bằng chữ B hoặc b ở cuối (viết tắt của
Binary).
Ví dụ:
(1101)2 được kí hiệu là: 1101B, hoặc 1101b
c) Hệ thập lục phân (Hexa Decimal) - Hệ đếm cơ số 16
Hệ thập lục phân sử dụng 16 kí hiệu (0, 1, 2,...9, A, B, C, D, E, F) để biểu diễn thông
tin. Các kí hiệu A, B, C, D, E, F lần lượt ứng với các giá trị 10, 11, 12, 13, 14, 15 trong hệ
thập phân. Các số trong hệ thập lục phân được biểu diễn dưới dạng tổng các luỹ thừa cơ
số 16.
Ví dụ:
Số 2B trong hệ thập lục phân có thể biểu diễn như sau:
(2B)16 = 2×161 + B×160
= (43)10
Trong hợp ngữ, người ta kí hiệu 1 số thập lục phân bằng chữ H hoặc h ở cuối (viết tắt của
Hexa Decimal).
Ví dụ:
(2B)16 được kí hiệu là: 2BH, hoặc 2Bh
Chú ý: Kí hiệu một số thập lục phân trong chương trình hợp ngữ phải luôn bắt đầu bằng
số. Ví dụ số (FA)16 được kí hiệu là 0FAh (chứ không kí hiệu là FAh).
Hệ thập lục phân (gọi tắt là hệ hex) là hệ đếm được sử dụng nhiều nhất trong hợp ngữ,
do nó có thể biểu diễn những dãy bít nhị phân dài bằng những kí hiệu ngắn gọn, dễ nhớ
hơn.
d) Chuyển đổi giữa các hệ đếm
• Chuyển từ hệ thập phân về hệ nhị phân:
Quy tắc chuyển: Đem số thập phân chia liên liếp cho 2, cho tới khi thương số bằng 0 thì
dừng lại. Viết các số dư ngược từ dưới lên ta thu được số nhị phân tương ứng.
Ví dụ: Chuyển số thập phân 13 sang hệ nhị phân.
7
13 2
dư 1 6 2
dư 0 3 2
dư 1 1 2
dư 1 0
Viết các số dư ngược từ dưới lên ta thu được số nhị phân 1101b.
• Chuyển từ hệ thập phân về hệ thập lục phân:
Quy tắc chuyển: Đem số thập phân chia liên liếp cho 16, cho tới khi thương số bằng 0 thì
dừng lại. Viết các số dư ngược từ dưới lên ta thu được số thập lục phân tương ứng.
Ví dụ: Chuyển số thập phân 43 sang hệ thập lục phân.
43 16
dư 11 2 16
dư 2 0
Viết các số dư ngược từ dưới lên ta thu được số thập lục phân 2Bh (chú ý là 11d = 0Bh).
• Chuyển đổi giữa hệ nhị phân và hệ thập lục phân:
Việc chuyển đổi giữa 2 hệ đếm này khá dễ dàng do mỗi kí hiệu trong hệ hex lại tương
ứng với 4 kí hiệu nhị phân. Xem bảng chuyển đổi sau:
Hệ thập phân Hệ Hex Hệ nhị phân
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
8
Ví dụ 1:
Chuyển đổi 2Ah sang hệ nhị phân.
Tra bảng ta thấy: 2h = 0010b, Ah = 1010b
Vậy 2Ah = 00101010b
Ví dụ 2:
Chuyển đổi 10110110b sang hệ hex.
Đầu tiên ta chia dãy bít nhị phân thành từng nhóm 4 bít, thu được 2 nhóm sau: 0110 và
1011.
Tra bảng ta thấy: 0110b = 6h, 1011b = Bh
Vậy 10110110b = B6h
1.2.2 Biểu diễn số nguyên trong máy tính
Do giới hạn của phần cứng máy tính, dữ liệu trong máy tính thường được biểu diễn bởi
các nhóm 8 bít (gọi là Byte)
1 byte = 8 bit
2 byte = 16 bit = 1 word
Người ta có thể ghép nhiều byte hay nhiều word để tạo thành dãy bít dài hơn. Dãy bít
càng dài thì lượng thông tin biểu diễn được càng lớn. Nếu gọi N là số bít của dãy thì số
khả năng biểu diễn = 2N.
Xét một dãy bít nhị phân:
1 0 0 1 0 ... 0 0
msb lsb
Bít đầu tiên (bên trái) được gọi là bít nặng nhất hay bít cao nhất của dãy (Most Significant
Bit).
Bít cuối cùng (bên phải) được gọi là bít nhẹ nhất hay bít thấp nhất của dãy (Least
Significant Bit).
a) Số nguyên không dấu:
Một số nguyên không dấu (số không âm) được biểu diễn bởi 1 dãy bít nhị phân như ta
đã xét ở phần trước (phần hệ đếm nhị phân). Ở đây ta chỉ nhấn mạnh thêm về chiều dài
của dãy bít: Độ dài dãy bít khi biểu diễn trong máy tính luôn là bội số của 8.
Ví dụ: Biểu diễn số nguyên 13 trong máy tính.
Ở phần trước ta đã biết: số nguyên 13 chuyển sang hệ nhị phân sẽ là 1101
Trong máy tính sẽ có nhiều cách để biểu diễn số nguyên này:
+ Số nguyên dạng byte (8 bit): 00001101
+ Số nguyên dạng word (16 bit): 00000000 00001101
9
b) Số nguyên có dấu:
Đối với số nguyên có dấu thì khi biểu diễn dưới dạng nhị phân ta phải dành ra 1 bít để
xác định dấu. Đó là bít đầu tiên của dãy (bít nặng nhất - Msb).
Msb = 0: Dấu Dương
Msb = 1: Dấu Âm
Như vậy, nếu chiều dài dãy bít là 8 thì bít đầu tiên để xác định dấu, 7 bít còn lại xác định
giá trị số nguyên?
Ví dụ:
Số +13 được biểu diễn bởi dãy bít 0000 1101.
Vậy số -13 được biểu diễn như thế nào, có phải là dãy bít 1000 1101 hay không?
Nguyên tắc để biểu diễn số âm trong máy tính: phải thoả mãn điều