
1
Bài 1
Đại cương về Hợp ngữ
Mục tiêu
zTìm hiểu cấu trúc tổng quát của PC
zTổ chức bộ nhớ
zTổ chức các thanh ghi
zTìm hiểu khái quát về Hợp ngữ
zCấu trúc lệnh
zCấu trúc chương trình hợp ngữ
zMột số lệnh cơ bản
1.1 Tổ chức PC 1.2 CPU
1.3 Tổ chức bộ nhớ
zĐịa chỉ tuyệt đối:
zXác định vị trí của từng byte trong bộ nhớ
z(8086) dài 20 bit, bộ nhớ 1MB
zĐịa chỉ tương đối:
zChế độ thực, truy cập bộ nhớ theo dạng
Segment:Offset ( Đoạn : Ô )
zSegment, Offset: địa chỉ 16 bit (lưu trong thanh ghi)
zSegment: địa chỉ tuyệt đối bắt đầu đoạn (chia cho 16)
Ví dụ: 11340h Æ1134h
zOffset: vịtrí của byte trong đoạn
zCác đoạn có thể chồng lên, nối tiếp, cách xa nhau
zChỉ đề cập đến chế độ thực và bộ lệnh 8086
Segment
1134h
12363h
11340h
Offset
1023h

2
1.4 Tổ chức thanh ghi
zThanh ghi là nơi lưu trữ dữ liệu trong CPU
zGồm 16 thanh ghi, mỗi thanh dài 16 (hoặc 32 bit)
zNgười dùng chỉ dùng địa chỉ tương đối
zCPU sẽ chuyển thành đ/chỉ tuyệt đối và truy xuất bộ nhớ
zNhóm thanh ghi đoạn (Segment Register)
(chứa địa chỉ đoạn các ô nhớ cần truy xuất)
zCS (Code Seg.) chứa địa chỉ đoạn vùng mã lệnh
zDS (Data Seg.) dữ liệu
zSS (Stack Seg.) ngăn xếp
zES (Extra Seg.) kèm thêm với DS
zNhóm thanh ghi đa dụng:
zAX, BX, CX, DX
zXem như 1 thanh ghi 16 bit (ví dụ: AX)
hoặc 2 thanh ghi 8 bit (ví dụ: AH (high), AL (low))
zChứa dữ liệu, nhưng trong mỗi lệnh sẽ có ý nghĩa riêng
zNhóm thanh ghi con trỏ và chỉ số (Pointer, Index Reg)
(chứa địa chỉ offset các vùng dữ liệu)
zSI (Source Index) và
DI (Destination Index) ứng với địa chỉ seg. trong DS, ES
zSP (Stack Pointer) và
BP (Base Point.) ứng với địa chỉ segment trong SS
zNhóm thanh ghi cờ và con trỏ lệnh
zFLAGS: ghi nhận thông tin điều khiển và trạng thái CPU
(sẽ nói kỹ ở bài sau)
zIP (Instruction Pointer) địa chỉ offset của lệnh tiếp,
ứng với địa chỉ segment trong CS
z(Các thanh ghi sắp xếp theo chức năng)
1.5 Ngôn ngữ máy – Hợp ngữ
zNgôn ngữ máy:
zDạng nhị phân
zThực hiện nhanh, chiếm ít chỗ trong bộ nhớ
zKhó viết, khó nhớ
zHợp ngữ:
zDùng một số ký hiệu dễ nhớ
zCần có ch/trình chuyển hợp ngữ sang ng/ngữ máy
1.6 Cách viết lệnh hợp ngữ
zChương trình hợp ngữ gồm nhiều lệnh, mỗi lệnh viết trên 1 dòng
zGồm 2 loại: chỉ thị (lệnh) và chĩ dẫn (hướng dẫn hợp dịch)
zCú pháp: <Tên> <TácTử> <TácTố> <;GhiChú>
z<Tên>: Là chuỗi gồm các ký tự, ký số, ? , ., @ , _, $, %
Nhãn: vị trí trong chương trình (theo sau :), tên thủ tục, tên biến
Ký hiệu: đại diện cho hằng số hoặc chuỗi ký tự
z<TácTử>: Tên gợi nhớ của lệnh
z<TácTố>: Xác định dữ liệu sẽ được xử lý bởi lệnh
Nếu có nhiều tác tố, cách nhau dấu phẩy,
Nếu có 2 tác tố, có thứ tự: tác tố đích, tác tố nguồn
z<;GhiChú>: Sau dấu ; để giải thích ý nghĩa lệnh
zCách viết số:
zmặc định thập phân (D/d), hexa (H/h), binary (B/b) 10h
1011b
zCách viết chuỗi:
zgiữa 2 dấu nháy đơn hoặc nháy kép ‘A’ “ABC”
z(các ký tự sẽ được chuyển thành mã ASCII tương ứng)

3
zĐịnh nghĩa vùng nhớ dữ liệu (biến):
zNhãn DB Trị1, Trị2, ...
zNhãn DW Trị1, Trị2, ...
Nhãn là tên vùng nhớ (biến), được định nghĩa với kích thước
là byte (DB) hoặc word (DW), được gán Trị...
Không gán trị: ? B DB ?
Gán nhiều trị giống nhau: toán tử DUP SCO DB 6 DUP (0)
zĐịnh nghĩa hằng:
zTên EQU Hằng
CR EQU 0Dh ; (ascii code) Carriage Return, về đầu dòng
LF EQU 0Ah ; Line Feed, sang dòng mới
STR EQU ‘Du lieu nhap sai!!’
MESS DB STR,CR,LF,’$’
zCấu trúc chương trình hợp ngữ:
zKhai báo kích thước chương trình
.MODEL Kiểu; thường dùng SMALL ...
zKhai báo kích thước vùng ngăn xếp
.STACK KíchThước ; thường 100h, mặc định 1024
zKhai báo dữ liệu bắt đầu bằng chỉ dẫn
.DATA
...
zKhai báo mã lệnh bắt đầu bằng chỉ dẫn
.CODE
...
zKết thúc chương trình bằng chỉ dẫn
END
1.7 Một số lệnh đơn giản
zMOV Đích, Nguồn
zSao chép dữ liệu (Nguồn) vào thanh ghi / vùng nhớ (Đích)
zHai tác tố không đồng thời là vùng nhớ hoặc th/ghi đoạn
zXCHG Đích, Nguồn
zHoán chuyển dữ liệu (không đồng thời là vùng nhớ)
zADD Đích, Nguồn
zCộng dồn Nguồn vào Đích. Hai tác tố khg đồng thời là vùng nhớ
zSUB Đích, Nguồn
zTrừ Đích cho Nguồn
zINC Đích
zTăng Đích lên 1
zDEC Đích
zGiảm Đích đi 1
zNEG Đích
zĐổi dấu Đích
zINT 21h
Gọi trình con của hệ điều hành, chức năng tùy theo trị th/ghi AH
zAH = 1
Nhận 1 ký tự từ bàn phím, mã ASCII chứa trong AL
zAH = 2
Xuất 1 ký tự ra màn hình, ký tự chứa trong DL
zAH = 9
Xuất chuỗi ký tự có địa chỉ offset trong DX (seg. trong DS)
Chuỗi ký tự phải kết thúc bằng ‘$’
.DATA
MSG DB “Chuoi can hien thi$”
.CODE
MOV AX, @DATA ; lấy địa chỉ seg dữ liệu (MOV AX, SEG DATA)
MOV DS, AX ; đưa vào DS
MOV AH, 9
LEA DX, MSG ; đưa off MSG vào DX (MOV DX, OFFSET MSG)
INT 21h
zAH = 4Ch
Kết thúc chương trình và trả điều khiển về cho hệ điều hành

