Bài 1<br />
Đại cương về Hợp ngữ<br />
<br />
Mục tiêu<br />
Tìm hiểu cấu trúc tổng quát của PC<br />
Tổ chức bộ nhớ<br />
Tổ chức các thanh ghi<br />
<br />
Tìm hiểu khái quát về Hợp ngữ<br />
Cấu trúc lệnh<br />
Cấu trúc chương trình hợp ngữ<br />
Một số lệnh cơ bản<br />
<br />
1.1 Tổ chức PC<br />
<br />
1.2 CPU<br />
<br />
1.3 Tổ chức bộ nhớ<br />
Địa chỉ tuyệt đối:<br />
Xác định vị trí của từng byte trong bộ nhớ<br />
(8086) dài 20 bit, bộ nhớ 1MB<br />
<br />
Địa chỉ tương đối:<br />
<br />
Segment<br />
<br />
1134h<br />
<br />
Offset<br />
<br />
1023h<br />
11340h<br />
<br />
Chế độ thực, truy cập bộ nhớ theo dạng<br />
Segment:Offset<br />
( Đoạn : Ô )<br />
Segment, Offset: địa chỉ 16 bit (lưu trong thanh ghi)<br />
Segment: địa chỉ tuyệt đối bắt đầu đoạn (chia cho 16)<br />
Ví dụ: 11340h<br />
1134h<br />
Offset: vị trí của byte trong đoạn<br />
<br />
12363h<br />
<br />
Các đoạn có thể chồng lên, nối tiếp, cách xa nhau<br />
Chỉ đề cập đến chế độ thực và bộ lệnh 8086<br />
<br />
1<br />
<br />
1.4 Tổ chức thanh ghi<br />
Thanh ghi là nơi lưu trữ dữ liệu trong CPU<br />
Gồm 16 thanh ghi, mỗi thanh dài 16 (hoặc 32 bit)<br />
Người dùng chỉ dùng địa chỉ tương đối<br />
CPU sẽ chuyển thành đ/chỉ tuyệt đối và truy xuất bộ nhớ<br />
<br />
Nhóm thanh ghi đoạn (Segment Register)<br />
(chứa địa chỉ đoạn các ô nhớ cần truy xuất)<br />
CS (Code Seg.) chứa địa chỉ đoạn vùng mã lệnh<br />
DS (Data Seg.)<br />
dữ liệu<br />
SS (Stack Seg.)<br />
ngăn xếp<br />
ES (Extra Seg.) kèm thêm với DS<br />
<br />
Nhóm thanh ghi đa dụng:<br />
AX, BX, CX, DX<br />
Xem như 1 thanh ghi 16 bit (ví dụ: AX)<br />
hoặc 2 thanh ghi 8 bit (ví dụ: AH (high), AL (low))<br />
Chứa dữ liệu, nhưng trong mỗi lệnh sẽ có ý nghĩa riêng<br />
<br />
Nhóm thanh ghi con trỏ và chỉ số (Pointer, Index Reg)<br />
(chứa địa chỉ offset các vùng dữ liệu)<br />
SI (Source Index) và<br />
DI (Destination Index) ứng với địa chỉ seg. trong DS, ES<br />
SP (Stack Pointer) và<br />
BP (Base Point.) ứng với địa chỉ segment trong SS<br />
<br />
Nhóm thanh ghi cờ và con trỏ lệnh<br />
FLAGS: ghi nhận thông tin điều khiển và trạng thái CPU<br />
(sẽ nói kỹ ở bài sau)<br />
IP (Instruction Pointer) địa chỉ offset của lệnh tiếp,<br />
ứng với địa chỉ segment trong CS<br />
<br />
1.5 Ngôn ngữ máy – Hợp ngữ<br />
(Các thanh ghi sắp xếp theo chức năng)<br />
<br />
Ngôn ngữ máy:<br />
Dạng nhị phân<br />
Thực hiện nhanh, chiếm ít chỗ trong bộ nhớ<br />
Khó viết, khó nhớ<br />
<br />
Hợp ngữ:<br />
Dùng một số ký hiệu dễ nhớ<br />
Cần có ch/trình chuyển hợp ngữ sang ng/ngữ máy<br />
<br />
1.6 Cách viết lệnh hợp ngữ<br />
Chương trình hợp ngữ gồm nhiều lệnh, mỗi lệnh viết trên 1 dòng<br />
Gồm 2 loại: chỉ thị (lệnh) và chĩ dẫn (hướng dẫn hợp dịch)<br />
Cú pháp: <br />
: Là chuỗi gồm các ký tự, ký số, ? , . , @ , _ , $, %<br />
Nhãn: vị trí trong chương trình (theo sau :), tên thủ tục, tên biến<br />
Ký hiệu: đại diện cho hằng số hoặc chuỗi ký tự<br />
<br />
: Tên gợi nhớ của lệnh<br />
: Xác định dữ liệu sẽ được xử lý bởi lệnh<br />
Nếu có nhiều tác tố, cách nhau dấu phẩy,<br />
Nếu có 2 tác tố, có thứ tự: tác tố đích, tác tố nguồn<br />
: Sau dấu ; để giải thích ý nghĩa lệnh<br />
<br />
Cách viết số:<br />
mặc định thập phân (D/d), hexa (H/h), binary (B/b) 10h<br />
1011b<br />
Cách viết chuỗi:<br />
giữa 2 dấu nháy đơn hoặc nháy kép<br />
‘A’ “ABC”<br />
(các ký tự sẽ được chuyển thành mã ASCII tương ứng)<br />
<br />
2<br />
<br />
Định nghĩa vùng nhớ dữ liệu (biến):<br />
Nhãn DB Trị1, Trị2, ...<br />
Nhãn DW Trị1, Trị2, ...<br />
Nhãn là tên vùng nhớ (biến), được định nghĩa với kích thước<br />
là byte (DB) hoặc word (DW), được gán Trị...<br />
Không gán trị: ?<br />
Gán nhiều trị giống nhau: toán tử DUP<br />
<br />
B DB ?<br />
SCO DB 6 DUP (0)<br />
<br />
Định nghĩa hằng:<br />
Tên EQU Hằng<br />
CR EQU 0Dh<br />
; (ascii code) Carriage Return, về đầu dòng<br />
LF EQU 0Ah<br />
;<br />
Line Feed, sang dòng mới<br />
STR EQU ‘Du lieu nhap sai!!’<br />
MESS DB STR,CR,LF,’$’<br />
<br />
1.7 Một số lệnh đơn giản<br />
MOV<br />
Đích, Nguồn<br />
Sao chép dữ liệu (Nguồn) vào thanh ghi / vùng nhớ (Đích)<br />
Hai tác tố không đồng thời là vùng nhớ hoặc th/ghi đoạn<br />
XCHG Đích, Nguồn<br />
Hoán chuyển dữ liệu (không đồng thời là vùng nhớ)<br />
ADD<br />
Đích, Nguồn<br />
Cộng dồn Nguồn vào Đích. Hai tác tố khg đồng thời là vùng nhớ<br />
SUB<br />
Đích, Nguồn<br />
Trừ Đích cho Nguồn<br />
INC<br />
Đích<br />
Tăng Đích lên 1<br />
DEC<br />
Đích<br />
Giảm Đích đi 1<br />
NEG<br />
Đích<br />
Đổi dấu Đích<br />
<br />
Cấu trúc chương trình hợp ngữ:<br />
Khai báo kích thước chương trình<br />
.MODEL Kiểu<br />
; thường dùng SMALL ...<br />
Khai báo kích thước vùng ngăn xếp<br />
.STACK KíchThước ; thường 100h, mặc định 1024<br />
Khai báo dữ liệu bắt đầu bằng chỉ dẫn<br />
.DATA<br />
...<br />
Khai báo mã lệnh bắt đầu bằng chỉ dẫn<br />
.CODE<br />
...<br />
Kết thúc chương trình bằng chỉ dẫn<br />
END<br />
<br />
INT 21h<br />
Gọi trình con của hệ điều hành, chức năng tùy theo trị th/ghi AH<br />
AH = 1<br />
Nhận 1 ký tự từ bàn phím, mã ASCII chứa trong AL<br />
<br />
AH = 2<br />
Xuất 1 ký tự ra màn hình, ký tự chứa trong DL<br />
<br />
AH = 9<br />
Xuất chuỗi ký tự có địa chỉ offset trong DX (seg. trong DS)<br />
Chuỗi ký tự phải kết thúc bằng ‘$’<br />
.DATA<br />
MSG DB “Chuoi can hien thi$”<br />
.CODE<br />
MOV AX, @DATA<br />
; lấy địa chỉ seg dữ liệu (MOV AX, SEG DATA)<br />
MOV DS, AX<br />
; đưa vào DS<br />
MOV AH, 9<br />
LEA DX, MSG<br />
; đưa off MSG vào DX (MOV DX, OFFSET MSG)<br />
INT 21h<br />
<br />
AH = 4Ch<br />
Kết thúc chương trình và trả điều khiển về cho hệ điều hành<br />
<br />
3<br />
<br />