Professional Documents
Culture Documents
Phần Ii: Hợp Ngữ
Phần Ii: Hợp Ngữ
Phần Ii: Hợp Ngữ
HỢP NGỮ
Chương 5
TỔNG QUAN VỀ HỢP NGỮ
Nội dung
• Giới thiệu về hợp ngữ
• Lập trình với hợp ngữ
• Ví dụ mẫu
• Bài tập
I.Giới thiệu
• Hợp ngữ - Assembly
• Trình dịch hợp ngữ - Assembler
• So sánh ngôn ngữ máy và hợp ngữ
- Chú thích
- Các toán hạng, ngăn
cách bởi dấu ,
• Các đơn vị
Tổ chức thanh ghi
• CPU16bit và CPU 32bit
Thanh ghi của CPU 8086
• Gồm 14 thanh ghi, mỗi thanh ghi 16 bit
• Chia làm 5 nhóm:
– Nhóm thanh ghi đoạn
– Nhóm thanh ghi đa dụng
– Nhóm thanh ghi con trỏ và chỉ mục
– Thanh ghi con trỏ lệnh
– Thanh ghi cờ hiệu
Nhóm 1: các thanh ghi đoạn
• Segment registers
• Chứa địa chỉ đoạn (segment)
• 4 thanh ghi:
– CS (Code segment register)
– DS (Data segment register)
– ES (Extra data segment register)
– SS (Stack segment register)
Quản lý bộ nhớ với thanh ghi đoạn
Nhóm 2: các thanh ghi đa
dụng
• General purpose registers
• Chứa các toán hạng, dữ liệu
• Gồm 4 thanh ghi 16 bit
– AX (Accumulator Register)
– BX (Base Register)
– CX (Count Register)
– DX (Data Register)
Nhóm thanh ghi đa dụng (t.t)
• Mỗi thanh ghi đa dụng 16bit có thể được sử
dụng như 1 cặp thanh ghi 8bit
Thanh ghi 16bit 8bit cao 8 bit thấp
AX AH AL
BX BH BL
CX CH CL
DX DH DL
Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
AX
AH AL
Nhóm 3: Các thanh ghi con trỏ và chỉ
mục
• Gồm 4 thanh ghi
– SI (Source Indexed register)
– DI (Destination Indexed register)
– SP (Stack Pointer register)
– BP (Base Pointer register)
Nhóm 4: Thanh ghi con trỏ chương trình
10 5 h e l l o
INT 21h/AH=2
• Hiển thị ký tự có mã ASCII chứa trong DL ra
màn hình
• Gọi với: AH=2
DL = Mã ASCII của ký tự muốn
xuất INT 21h
• Trị trả về: không có
INT 21h/AH=9
• Xuất một chuỗi ký tự ra màn hình. Chuỗi phải
kết thúc bằng ký tự ‘$’
• Gọi với: AH=9
DS:DX = Địa chỉ của chuỗi cần
xuất INT 21h
• Trị trả về: không có
Các dạng hằng trong hợp
ngữ
• Nhị phân:
– Gồm một dãy các chữ số 0 và 1, kết thúc bởi ký tự
B hoặc b
– Ví dụ:
0100 0101B : 8bit
1111000011110000b : 16bit
Các dạng hằng (t.t)
• Thập phân:
– Gồm một dãy các chữ số từ 0 đến 9, có thể thêm
các ký tự + , - để biểu thị dấu.
– có thể kết thúc bằng ký tự D hoặc không cần
– Ví dụ:
9871d hay 9871
Các dạng hằng (t.t)
• Thập lục phân(hệ 16 hay hex):
– Gồm một dãy các chữ số từ 0 đến 9 và các ký tự từ
A-F (a-f), kết thúc bằng ký tự H
– Nếu ký tự bắt đầu không phải là số thì phải thêm 0
vào đầu.
– Ví dụ:
45h số hex 8bit
5AF8H số hex 16 bit
0A28FH bắt đầu bằng A nên phải thêm 0 vào đầu
Các dạng hằng (t.t)
• Dạng chuỗi:
– Gồm một dãy các ký tự nằm giữa 2 dấu ‘ hay “
– Ví dụ:
“Hello Assembly”
‘Xin chao!’
Dữ liệu cho chương trình
• Khai báo hằng:
– Cú pháp:
tên hằng EQU giá trị biểu thức
– Ví dụ:
MAX EQU 100
loichao EQU ‘Hello!$’
mark EQU 01001110b
Khai báo biến
• Biến byte:
<tên biến> db <giá trị khởi đầu>
songuyen db 10
a db ?
• Biến từ (word)
<tên biến> dw <giá trị khởi đầu>
• Biến từ gấp đôi (double word)
<tên biến> dd <giá trị khởi đầu>
Khai báo biến (t.t)
• Biến mảng:
tên db/dw pt1,pt2,pt3,…
tên db/dw <số pt> DUP(<gt khởi đầu>)
mangdb 5,3,0,2,1,7
mang2 dw 100 DUP (0)
• Kiểu chuỗi
str db ‘chuoi ki tu’
Kiểu mảng
• Thực chất là một loạt các byte hay từ nhớ liên
tiếp nhau truy xuất địa chỉ thông qua tên biến
• Ví dụ: vùng nhớ B_ARRAY chiều dài 3 byte
b_array DB 10h,20h,30h
thì:
b_array là tên gán cho byte đầu tiên
b_array+1 là tên của byte thứ hai
b_array+2 là tên của byte thứ ba
Kiểu mảng (t.t)
• Nếu B_ARRAY được gán địa chỉ offset 0200h
thì nội dung bộ nhớ như sau :