Kiến trúc máy tính phần ii hợp ngữ - chương 1
Nội dung • Giới thiệuvềhợp ngữ •Lập trìnhvớihợp ngữ • Vídụmẫu • Bàitập
Bạn đang xem trước 20 trang tài liệu Kiến trúc máy tính phần ii hợp ngữ - chương 1, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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
5601:0102
5601:0105
B4.02
80.C2.30
50
MOV AH, 2
ADD DL,30
PUSH AX
Hợp ngữ
• Ngôn ngữ lập trình cấp thấp, 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]
- 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
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
AF: Auxiliary Flag
ZF: Zero Flag
OF: Overflow Flag
SF: Signed Flag
PF: Parity Flag
DF: Direction Flag
TF: Trap Flag
IF: Interupt Enable 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:
db
songuyen db 10
a db ?
• Biến từ (word)
dw
• Biến từ gấp đôi (double word)
dd
Khai báo biến (t.t)
• Biến mảng:
tên db/dw pt1,pt2,pt3,…
tên db/dw DUP()
mang db 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
.code
org 100h
:
Int 20h
end
Dạng
COM
nạp ở
địa chỉ
100h
Gọi ngắt
20h để
kết thúc
chương
trình
COM
Ví dụ: HelloC.ASM
.model tiny
.code
org 100h
batdau :
Mov dx, offset loichao
Mov ah, 9
Int 21h
Int 20h
loichao db ‘Hello Assembly! $’
end batdau
Gọi ngắt
21h/AH=9
Xuất chuỗi ra
màn hình
Chuỗi kết thúc
bởi $
Chương trình 16bit dạng EXE
.model small
.stack
.data
<khai báo biến,
hằng>
.code
:
Mov Ah,4Ch
Int 21h
end
Qui mô bộ
nhớ:
small/
medium/
compact/
large/
huge
Khai báo
kích thước
stack sử
dụng
Khai báo
đoạn dữ liệu
Khai báo
đoạn chương
trình
Gọi ngắt
21h/AH=4C
h để kết thúc
chương trình
EXE
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 :
Mov ax,@data
Mov ds,ax
Mov dx, offset loichao
Mov ah, 9
Int 21h
Mov ah,4ch
Int 21h
end batdau
Trỏ thanh ghi DS
vào đoạn data
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