Đặt tên• Tên hằng, tên biến, tên nhãn… do người lậptrình đặt ra • Bắt đầu của tên không là số • Tên không được trùng với từ khóa • Tên tối đa 31 ký tự... - Người lập trình tự đặt - Từ gợ
Trang 1PHẦN II
HỢP NGỮ
Trang 2Chương 5 TỔNG QUAN VỀ HỢP NGỮ
Trang 4MOV AH, 2 ADD DL,30 PUSH AX
Trang 5Hợp ngữ
• Ngôn ngữ lập trình cấp thấp, dùng dạng gợinhớ của tập lệnh
mnemonic [operand1 [,operand2]
Trang 8Từ khóa
• Tên dành riêng của hợp ngữ
– Tên các thanh ghi
– Tên gợi nhớ
– Tên toán tử
– …
Trang 9Đặt tên
• Tên hằng, tên biến, tên nhãn… do người lậptrình đặt ra
• Bắt đầu của tên không là số
• Tên không được trùng với từ khóa
• Tên tối đa 31 ký tự
Trang 10Cú pháp của một lệnh hợp
ngữ
[label:] mnemonic [operand1 [,operand2]] [; comment]
- Nhãn thay thế địa chỉ câu lệnh.
- Người lập trình tự đặt
- Từ gợi nhớ xác định hành động của câu lệnh
- Tra trong tập lệnh
- Các toán hạng, ngăn cách bởi dấu ,
- Chú thích
Trang 11• Chỉ dẫn biên dịch (assembler directive)
– >không có lệnh nhị phân tương ứng
– >Tuân theo cú pháp của assembler
Trang 12Tổ chức bộ nhớ
• Địa chỉ ô nhớ
• Các đơn vị
Trang 13Tổ chức thanh ghi
• CPU16bit và CPU 32bit
Trang 14Thanh 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
Trang 15Nhó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)
Trang 16Quản lý bộ nhớ với thanh ghi
đoạn
Trang 17Nhó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)
Trang 18Nhó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
Trang 19Nhó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)
Trang 20Nhóm 4: Thanh ghi con trỏ chương trình
• IP (Instruction Pointer register)
• Lệnh kế tiếp sẽ thực hiện ở địa chỉ:
CS:IP
Trang 21Nhóm 5: Thanh ghi cờ hiệu
IF: Interupt Enable Flag
Trang 22Tổ chức ngắt
• Ngắt cứng: (hard interupt)
àcác ngắt này có thể chắn được bởi lệnh CLI
• Ngắt không chắn được NMI
– độ ưu tiên cao nhất
– báo sự nguy hiểm như sụt áp hay hư hỏng bộ nhớ
Trang 23Tổ chức ngắt (t.t)
• Ngắt nội bộ (internal interupt)
– phát sinh bởi CPU
– “divide by zero”, “overflow”, “trap”
• Ngắt mềm (soft interupt)
– gọi 1 chương trình con có sẳn trong ROM hay RAM
Trang 24Bảng vector ngắt
• bảng chiều dài 1KB nằm trong bộ nhớ bắt đầu
từ 0000:0000 đến 0000:03FF
• gồm 256 phần tử, mỗi phần tử chiếm 4 byte
chứa giá trị segment và offset của chương trình
xử lý ngắt
00h ÷ 1Fh : ngắt trong ROM
20h ÷ 2Fh: ngắt mềm của DOS
30h ÷ FFh: ngắt mềm do người dùng định nghĩa
Trang 25Sử dụng ngắt mềm 21h cho các thao
tác xuất nhập
• Sử dụng các lệnh IN / OUT cho các thao tác
xuất nhập các thiết bị ngoại vi ?
– đòi hỏi người lập trình phải am hiểu phần cứng
– tùy theo các loại máy tính mà số hiệu cổng của các thiết bị ngoại vi có thể khác
• Các nhà sản xuất máy tính đã cung cấp sẳn cácchương trình phục vụ vào ra cơ bản
– người lập trình sẽ gọi thông qua lời gọi ngắt:
INT số_hiệu_ngắt
Trang 26Một số hàm xuất/nhập đơn giản
qua ngắt 21h
• INT 21h/AH=1: Nhập 1 ký tự từ bàn phím
• INT 21h/AH=2: Xuất 1 ký tự ra màn hình
• INT 21h/AH=8: Nhập 1 ký tự từ bàn phímkhông hiển thị ký tự này lên màn hình
• INT 21h/AH=9: Xuất 1 chuỗi ký tự ra mànhình
• INT 21h/AH=0Ah: Nhập 1 chuỗi ký tự từ bànphím
è tham khảo tài liệu “The x86 interupts’ list”
Trang 27Gọi ngắt 21h
• Gán AH là số hiệu hàm muốn gọi
Ví dụ: MOV AH,9 ; gọi hàm xuất chuỗi
• Gán các tham số khác nếu cần thiết
Ví dụ: MOV DX, offset chuoikitu
• Gọi ngắt 21h
INT 21h
Trang 29• Trị trả về: AL = mã ASCII của ký tự vừanhập
Trang 30INT 21h/AH=0Ah
• Nhập một chuỗi ký tự từ bàn phím với chiềudài tối đa 255, dùng phím BACKSPACE đểsửa ký tự, ENTER để kết thúc việc nhập
• Gọi với:
AH=0AhDS:DX = địa chỉ của vùng đệm lưu chuỗiINT 21h
• Trị trả về: không có
Trang 31INT 21h/AH=0Ah (t.t)
• Vùng đệm lưu chuỗi phải có dạng sau:
– Byte đầu tiên: kích thước của vùng đệm, thể hiện
số byte tối đa cần đọc
• cần phải gán trước khi gọi hàm
– Byte thứ hai: số byte thực sự đọc
• được trả về sau khi gọi hàm
– Các byte tiếp theo: lưu các ký tự đã nhập vào
• được gán sau khi gọi hàm
10 ? 10 bytes vùng đệm chứa chuỗi nhập
10 5 h e l l o
Trang 32INT 21h/AH=2
• Hiển thị ký tự có mã ASCII chứa trong DL ramàn hình
• Gọi với: AH=2
DL = Mã ASCII của ký tự muốn xuấtINT 21h
• Trị trả về: không có
Trang 33INT 21h/AH=9
• Xuất một chuỗi ký tự ra màn hình Chuỗi phảikết thúc bằng ký tự ‘$’
• Gọi với: AH=9
DS:DX = Địa chỉ của chuỗi cần xuấtINT 21h
• Trị trả về: không có
Trang 35Cá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
Trang 36Cá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
Trang 38Dữ liệu cho chương trình
Trang 39Khai báo biến
<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>
Trang 40Khai báo biến (t.t)
Trang 41b_array là tên gán cho byte đầu tiênb_array+1 là tên của byte thứ hai
b_array+2 là tên của byte thứ ba
Trang 43Mảng (t.t)
• Ví dụ mảng W_ARRAY 4 phần tử
W_ARRAY DW 1000,40,29887,329
• • Giả sử mảng bắt đầu tại 0300h:
SYMBOL ADDRESS CONTENTSW_ARRAY 300h 1000d
W_ARRAY+2 302h 40d
W_ARRAY+4 304h 29887d
W_ARRAY+6 306h 329d
Trang 44Gọi ngắt 20h để kết thúc chương trình COM
Trang 45Chuỗi kết thúc
bởi $
Trang 46Chương trình 16bit dạng EXE
small/
medium/ compact/ large/
h để kết thúc chương trình EXE
Trang 47Các kiểu kích thước bộ nhớ cho
chương trình hợp ngữ
Trang 48Ví dụ: HelloE.ASM.model small
end batdau
Trỏ thanh ghi DS vào đoạn data