Phần Ii: Hợp Ngữ

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 52

PHẦN II

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ữ

Ngôn ngữ máy Hợp ngữ


5601:0100 B4.02 MOV AH, 2
5601:0102 80.C2.30 ADD DL,30
5601:0105 50 PUSH AX
Ngôn ngữ máy
Là loại ngôn ngữ lập trình thế hệ đầu tiên
Đặc điểm:
-Khó đọc, khó sử dụng.
-Thực thi nhanh :là ngôn ngữ duy nhất mà bộ xử
lý có thể nhận biết và thực thi một cách trực tiếp
Hợp ngữ
• Ngôn ngữ lập trình cấp thấp để viết chương
trình máy tính, dùng dạng gợi nhớ của tập lệnh
mnemonic [operand1 [,operand2]
• Các đặc điểm:
– Thực thi nhanh
– Kích thước nhỏ
– Xử lý trực tiếp hệ thống
– Có thể viết trên mọi hệ điều hành, mọi CPU
– Khó viết
Cú pháp của lệnh hợp ngữ
• Bộ ký tự
– Chữ cái latinh: A..Z, a..z
– Chữ số thập phân: 0..9
– Các ký tự đặc biệt: ? @ _ $ : . [ ] ( ) < > …
– Các ký tự cách: SP, Tab
• Từ vựng:
– Từ khóa (keyword)
– Tên (Symbol, name)
Từ 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ử
–…
Đặt tên
• Tên hằng, tên biến, tên nhãn… do người lập
trì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ự
Cú pháp của một lệnh hợp
ngữ
[label:] mnemonic [operand1 [,operand2]] [; comment]

- Từ gợi nhớ xác định


hành động của câu lệnh
- Tra trong tập lệnh

- Chú thích
- Các toán hạng, ngăn
cách bởi dấu ,

- Nhãn thay thế địa chỉ


câu lệnh.
- Người lập trình tự đặt
Chương trình hợp ngữ
• Bao gồm các phát biểu hợp ngữ
(assembly language instruction)
• Lệnh hợp ngữ
– >lệnh nhị phân/mã máy
• 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
Tổ chức bộ nhớ
• Địa chỉ ô nhớ

• 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

• IP (Instruction Pointer register)


• Lệnh kế tiếp sẽ thực hiện ở địa chỉ:
CS:IP
Nhóm 5: Thanh ghi cờ hiệu
• Flag register
• Gồm các cờ hiệu
CF: Carry Flag DF: Direction Flag
AF: Auxiliary Flag TF: Trap Flag
ZF: Zero Flag IF: Interupt Enable Flag
OF: Overflow Flag
SF: Signed Flag
PF: Parity Flag
Tổ chức ngắt
• Ngắt cứng: (hard interupt)
IRQ0: timer IRQ4: COM1
IRQ1: keyboard IRQ5: Hard disk
IRQ2: cho máy AT IRQ6: Floppy disk
IRQ3: COM2 IRQ7: Parallel port
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ớ
Tổ 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
Bả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
Sử 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ác
chươ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
Mộ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ím
khô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àn
hình
• INT 21h/AH=0Ah: Nhập 1 chuỗi ký tự từ
bàn phím
 tham khảo tài liệu “The x86 interupts’ list”
Gọ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
INT 21h/AH=1
• Nhập một ký tự từ bàn phím và có hiển thị ký
tự này ra màn hình
• Gọi với: AH=1
INT 21h
• Trị trả về:AL = mã ASCII của ký tự vừa nhập
INT 21h/AH=8
• Nhập một ký tự từ bàn phím nhưng không hiển
thị ký tự này ra màn hình
• Gọi với:
AH=8
INT 21h
• Trị trả về: AL = mã ASCII của ký tự vừa nhập
INT 21h/AH=0Ah
• Nhập một chuỗi ký tự từ bàn phím với chiều
dà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=0Ah
DS:DX = địa chỉ của vùng đệm lưu chuỗi
INT 21h
• Trị trả về: không có
INT 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
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 :

SYMBOL ADDRESS CONTENTS


b_array 200h 10h
b_array+1 201h 20h
b_array+2 202h 30h
Mả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 CONTENTS
W_ARRAY 300h 1000d
W_ARRAY+2 302h 40d
W_ARRAY+4 304h 29887d
W_ARRAY+6 306h 329d
Chương trình 16 bit dạng
COM
.model tiny Dạng
COM
.code nạp ở địa
chỉ 100h
org 100h
<label> :
<chương trình> Gọi ngắt
20h để
kết thúc
chương
Int 20h trình
COM
end <label>
Ví dụ: HelloC.ASM
.model tiny
.code
Gọi ngắt
org 100h 21h/AH=9
Xuất chuỗi ra
batdau : màn hình
Mov dx, offset loichao
Mov ah, 9
Int 21h
Chuỗi kết thúc
Int 20h bởi $
loichao db ‘Hello Assembly! $’
end batdau
Chương trình 16bit dạng EXE
Khai báo .model small Qui mô bộ
kích thước
stack sử dụng .stack nhớ:
small/
.data medium/
compact/
<khai báo biến, large/
hằng> huge

Khai báo .code


đoạn dữ liệu
<label> :
<chương trình> Gọi ngắt
21h/AH=4Ch
để kết thúc
chương trình
Khai báo Mov Ah,4Ch EXE
đoạn chương
trình Int 21h
end <label>
Các kiểu kích thước bộ nhớ cho
chương trình hợp ngữ
Ví dụ: HelloE.ASM
.model small
.data
loichao db ‘Hello Assembly! $’
.code
batdau :
Trỏ thanh ghi DS
Mov ax,@data vào đoạn data
Mov ds,ax
Mov dx, offset loichao
Mov ah, 9
Int 21h
Mov ah,4ch
Int 21h
end batdau
Dịch và thực thi
• Bộ dịch hợp ngữ:
– MASM – Microsoft
– TASM – Borland (Turbo Assembler)
– MASM32 – www.masm32.com
– NASM – www.sourceforge.net/projects/nasm
– Emu8086
Vào Chương Trình DOS Trên
Win 7/8.
- Dùng phần mềm DosBox.
- Mount c: c:\tasm
- C:
- Cd tasm
Biên Dịch Chương Trình
Cú pháp đơn giản để dịch chương trình là
MASM tên_file[.asm]
hoặc
TASM tên_file[.asm]
Cú pháp đơn giản để liên kết là
LINKtên_file[.obj] (đối với MASM)
TLINKtên_file[.obj] (đối với TASM)
Chạy thử :tên_file[.exe]

You might also like