SlideShare a Scribd company logo
1 of 53
Bài 08: Kiến trúc x86-32bit
Phạm Tuấn Sơn
ptson@fit.hcmus.edu.vn
Lịch sử phát triển vi xử lý Intel
• Intel 4004 (1971)
– Vi xử lý đầu tiên của Intel
– 4-bit
• Intel 8080 (1972)
– Thanh ghi 8-bit
– Đường truyền dữ liệu 8-bit
– Đường truyền địa chỉ 16-bit (có thể truy xuất bộ nhớ RAM 64 KB)
– Được sử dụng trên máy tính cá nhân đầu tiên - Altair
• Intel 8086/8088 (1978)
– Thanh ghi 16-bit
– Đường truyền dữ liệu 16-bit (8088: 8-bit)
– Đường truyền địa chỉ 20-bit
– Được dùng trên máy tính cá nhân IBM PC đầu tiên
• Intel 80286 (1982)
– Có thể truy xuất bộ nhớ 16 MB
– Đường truyền địa chỉ 24-bit 2
Lịch sử phát triển vi xử lý Intel (tt)
• Kiến trúc x86-32bit (IA-32)
– Intel 80386/ i386 (1985)
• Thanh ghi 32 bit
• Đường truyền địa chỉ 32-bit
– Intel 80486/ i486 (1989)
• Kỹ thuật đường ống (pipelining)
– Pentium (1993)
• Đường truyền dữ liệu 64-bit
• Siêu vô hướng (2 đường ống song song)
– Pentium Pro (1995), II (1997), III (1999), IV (2000), M
(2003).
3
Lịch sử phát triển vi xử lý Intel (tt)
• Kiến trúc x86-64bit
– Athlon64 của AMD (2003)
• Bộ vi xử lý x86-64bit đầu tiên
– Pentium 4 Prescott (2004)
– Core 2 (2006), Core i3, i5, i7, Atom (2008)
– Intel Sandy Bridge (2010)
• Kiến trúc IA-64
– Itanium (2001)
4
Kiến trúc x86-32bit
• Chế độ hoạt động
• Tổ chức bộ nhớ
• Tập thanh ghi
• Tập lệnh
• Ngăn xếp
• Thủ tục
5
Chế độ hoạt động
• Chế độ thực
– 16 bit (8086)
– Truy xuất 1 MB bộ nhớ chính
– MS-DOS
• Chế độ bảo vệ
– 32 bit
– Truy xuất 4 GB bộ nhớ chính
– Windows, Linux
• Chế độ quản lý hệ thống
– Quản lý nguồn cung cấp
– Chẩn lỗi và bảo mật hệ thống 6
• Chế độ 8086 ảo
• Chế độ thực dưới sự quản lý của chế độ bảo vệ
• Cho phép hoạt động đồng thời ở 2 chế độ
RAM
…..
Physical
address
00000h
00001h
FFFFFh
0000Fh
00010h
00011h
0001Fh
00020h
00002h
…..
0FFFFh
10000h
…..
1000Fh
10010h
…..
1001Fh
10020h
…..
…..
Segment0000
Segment0001
16 bytes
…..
Segment0002
16 bytes
0000h:0020h
0001h:0010h
0002h:0000h
Segment : Offset
Vì mỗi ô nhớ có thể thuộc
nhiều segment khác nhau,
một địa chỉ vật lí 00020h có
thể ứng với nhiều địa chỉ
logic khác nhau, tùy vào việc
lựa chọn segment.
F0000h
…..
F000Fh
…..
FFFF0h
SegmentF000h
F0010h
SegmentF001h
SegmentFFFFh
Một số địa chỉ logic có
thể trở nên không hợp lệ.
Ví dụ, ở segment FFFFh,
chỉ có các offset từ
0000h đến 000Fh mới
tạo thành một địa chỉ hợp
lệ, bởi vì địa chỉ vật lí chỉ
có đến FFFFFh là hết
Logical
address
Tổ chức bộ nhớ
chế độ thực
7
Tại sao kích thước
mỗi đoạn là 64 KB ?
Tại sao các đoạn lại
cách nhau 16 byte ?
Tại sao các đoạn lại
nằm chồng lên nhau ?
Chuyển đổi địa chỉ ở chế độ thực
• Địa chỉ logic à địa chỉ vật lý
– Phy_address = segment * 10h + offset
– Vd: địa chỉ logic 1234h:0005h sẽ ứng với địa chỉ vật lí
1234h * 10h + 0005h = 12340h + 0005h = 12345h
• Địa chỉ vật lý à địa chỉ logic
– Do các đoạn gối đầu nhau nên mỗi ô nhớ có thể
thuộc một vài đoạn khác nhau. Vì vậy, một địa chỉ vật
lý có thể ứng với nhiều địa chỉ logic khác nhau.
– Vd: địa chỉ vật lý 12345h có thể ứng với các địa chỉ
logic sau:
1234h:0005h, 1230h:0045h
1200h:0345h, 1000h:2345h
1232h:0025h, … 8
Tổ chức bộ nhớ chế độ bảo vệ
• Bộ nhớ cũng được chia thành các đoạn. Tuy nhiên, kích
thước các đoạn không được định sẵn như chế độ thực.
• Do đó, để định vị một đoạn nào đó thì phải sử dụng một
bảng mô tả các đoạn.
• Để truy xuất vào một
ô nhớ trong bộ nhớ chính
thì cũng phải thực hiện
chuyển đổi từ địa chỉ
logic (segment, offset)
thành địa chỉ vật lý
9
3000
RAM
00003000
Local Descriptor Table
0002
00008000 000A
00026000 0010
base limit access
8000
26000
Chuyển đổi địa chỉ ở chế độ bảo vệ
• Thực hiện quá
trình chuyển đổi
địa chỉ một bước
hoặc hai bước
để chuyển đổi từ
địa chỉ logic
(segment, offset)
thành địa chỉ vật
lý
• Bước 1, kết hợp
segment và
offset thành địa
chỉ tuyến tính
(linear address)
10
Selector Offset
Logical address
Segment Descriptor
Descriptor table
+
GDTR/LDTR
(contains base address of
descriptor table)
Linear address
Chuyển đổi địa chỉ ở chế độ bảo vệ (tt)
• Bước 2, chuyển địa chỉ tuyến tính thành địa chỉ vật lý
(physical address)
11
Directory Table Offset
Directory Entry
CR3
Page Directory
Page-Table Entry
Page Table
Physical Address
Page Frame
Linear Address
10 10 12
32
Chương trình chạy trên hệ thống
• Chương trình chạy trên hệ thống thông thường chiếm 3
đoạn bộ nhớ
– Một đoạn dành cho mã lệnh (code segment)
– Một đoạn dành cho dữ liệu (data segment)
– Một đoạn ngăn xếp (stack segment) dành để lưu các giá trị trung
gian hoặc các địa chỉ trở về dùng khi gọi hàm
• Trên hệ thống x86, cần có các thanh ghi chứa địa chỉ
đoạn và địa chỉ ô để truy xuất bộ nhớ
12
bit
Tập thanh ghi
13
DS
FS
GS
eax ah ax al Tích lũy
ebx bh bx bl Chỉ mục cơ sở
ecx ch cx cl Đếm
edx dh dx dl Dữ liệu
esi si Chỉ mục nguồn
ES edi di Chỉ mục đích
SS
esp sp Con trỏ ngăn xếp
ebp bp Con trỏ cơ sở
code
data
stack
Khônggianđịachỉchươngtrình
Thanh
ghi
đoạn
(16 bit)
Các thanh ghi đa dụng (32 bit)
CS
31 16 15 8 7 0
Một số thanh ghi khác
• Thanh ghi chứa địa chỉ lệnh (EIP – 32 bit), kết hợp thanh
ghi đoạn CS – 16bit (CS:EIP)
• Thanh ghi cờ (EFLAGS – 32 bit)
– Carry: cờ tràn không dấu
– Overflow: cờ tràn có dấu
– Sign: cờ dấu
– Zero: cờ zero
– Auxiliary Carry: cờ nhớ từ bit 3 vào bit 4
– Parity: cờ chẵn lẻ
– …
Giá trị của từng cờ được thiết lập sau mỗi lệnh được thực thi
• Một số thanh ghi khác: IDTR (16bit), GDTR (48bit),
LDTR (48bit), TR (16bit), ... 14
…….
CFPFAFZFSFTFIFDFOFIO
PL
IO
PL
NTRFVM
32 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Cấu trúc lệnh
• Mặc dù trong cấu trúc lệnh có tổng cộng 16 byte nhưng
thực tế chỉ cho phép lệnh dài tối đa 15 byte
15
Tiền tố điều
khiển các
thành phần
còn lại của
lệnh
Mã thao tác có
kích thước 1 hoặc
2 byte tùy lệnh
Toán hạng thanh
ghi hoặc vùng nhớ
Kiểu
(2bit)
REG
(3bit)
R/M
(3bit)
Kiểu định vị xác định
kiểu định vị bộ nhớ
Độ dời
trong truy
xuất bộ nhớ
Toán hạng
Hằng số
SS
(2bit)
Index
(3bit)
Base
(3bit)
ADD CL, AL
• Lệnh này cộng dồn giá trị trong thanh ghi AL vào
thanh ghi CL: CL = CL + AL
16
0 0 1
Mã thao tác của
lệnh ADD là
000000
Giá trị 11
cho biết
trường R/M
là thanh ghi
Kiểu
0 0 0 00 0 1 1… … ………
Giá trị 0 cho biết
lệnh thực hiện
trên 2 giá trị 8-bit
s
d
Giá trị 0 cho biết
cộng dồn trường
REG vào trường R/M
REG
Giá trị 000 (kết
hợp với trường
d=0) cho biết
toán hạng
nguồn là thanh
ghi AL
R/M
Giá trị 001
(kết hợp với
trường d=0)
cho biết toán
hạng đích là
thanh ghi CL
0 0 00 0
ADD ECX, EAX
• Lệnh này cộng dồn giá trị trong thanh ghi EAX
vào thanh ghi ECX
17
0 1 0 0 1
Mã thao tác của
lệnh ADD là
000000
Giá trị 11
cho biết
trường R/M
là thanh ghi
Kiểu
0 0 00 0 0 00 0 1 1… … ………
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 0 cho biết
cộng dồn trường
REG vào trường R/M
REG
Giá trị 000 (kết
hợp với trường
d=0) cho biết
toán hạng
nguồn là thanh
ghi EAX
R/M
Giá trị 001
(kết hợp với
trường d=0)
cho biết toán
hạng đích là
thanh ghi ECX
ADD EDX, [2000]
• Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa
chỉ bắt đầu là DS:2000 vào thanh ghi EDX
18
1 1 1 0 1
Mã thao tác của
lệnh ADD là
000000
Giá trị 00 kết hợp với
trường R/M=101 cho
biết định vị bộ nhớ theo
độ dời
Kiểu
0 1 10 0 0 00 0 0 0… … ……
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 1 cho biết
cộng dồn trường
R/M vào trường REG
REG
Giá trị 011 (kết
hợp với trường
d=1) cho biết
toán hạng đích
là thanh ghi
EDX
R/M
Sử dụng 4
byte của
trường độ
dời biểu
diễn giá trị
2000
…
ADD EDI, [EBX]
• Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa
chỉ bắt đầu là DS:EBX vào thanh ghi EDI
19
0 1 1
Mã thao tác của
lệnh ADD là
000000
Giá trị 00
cho biết
không dùng
trường độ
dời
Kiểu
0 0 0 00 0 0 0… … ………
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 1 cho biết
cộng dồn trường
R/M vào trường REG
REG
Giá trị 111 (kết
hợp với trường
d=1) cho biết
toán hạng đích
là thanh ghi
EDI
R/M
Giá trị 011 cho
biết định vị bộ
nhớ [EBX]
1 1 11 1
ADD EAX, [ESI + 2]
• Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa
chỉ bắt đầu là DS:(ESI+2) vào thanh ghi EAX
20
1 1 1 1 0
Mã thao tác của
lệnh ADD là
000000
Giá trị 01
cho biết sử
dụng 1
byte độ dời
Kiểu
0 0 00 0 0 00 0 0 1… … ……
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 1 cho biết
cộng dồn trường
R/M vào trường REG
REG
Giá trị 000 (kết
hợp với trường
d=1) cho biết
toán hạng đích
là thanh ghi
EAX
R/M
Sử dụng 1
byte cao
của trường
độ dời biểu
diễn giá trị 2
…
Giá trị 110
cho biết
định vị bộ
nhớ [ESI]
ADD EBX, [EBP + 2000]
• Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ
bắt đầu là SS:(EBP+2000) vào thanh ghi EBX
21
1 1 1 0 1
Mã thao tác của
lệnh ADD là
000000
Giá trị 10
cho biết sử
dụng 4
byte độ dời
Kiểu
0 1 10 0 0 00 0 1 0… … ……
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 1 cho biết
cộng dồn trường
R/M vào trường REG
REG
Giá trị 011 (kết
hợp với trường
d=1) cho biết
toán hạng đích
là thanh ghi
EBX
R/M
Sử dụng 4
byte của
trường độ
dời biểu
diễn giá trị
2000
…
Giá trị 101
cho biết
định vị bộ
nhớ [EBP]
ADD EBP, [2000 + EAX×1]
• Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ
bắt đầu là DS:(EAX×1 + 2000) vào thanh ghi EBP
22
1 0 0
Mã thao tác
của lệnh
ADD là
000000
Giá trị 00 kết hợp
với trường
R/M=100 cho biết
định vị bộ nhớ SIB
[độ dời(4byte) + X]
Kiểu
0 0 0 00 0 0 0… … …
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 1 cho biết
cộng dồn trường
R/M vào trường REG
REG
Giá trị 101 (kết
hợp với trường
d=1) cho biết
toán hạng đích
là thanh ghi
EBP
R/M
Sử dụng
4 byte
của
trường
độ dời
biểu
diễn giá
trị 2000
…1 0 10 0 00 01 1
Giá trị 2
trường
SS=00 và
Index=000
cho biết là
X là
EAX×1
Giá trị 101
cho biết
định bộ nhớ
theo độ dời
1 0 1
ADD ECX, [EBX + EDI×4]
• Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ
bắt đầu là DS:(EDI×4 + EBX) vào thanh ghi ECX
23
1 0 0
Mã thao tác
của lệnh
ADD là
000000
Giá trị 00 kết hợp
với trường
R/M=100 cho biết
định vị bộ nhớ SIB
[độ dời(4byte) + X]
Kiểu
0 0 0 00 0 0 0… … …
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 1 cho biết
cộng dồn trường
R/M vào trường REG
REG
Giá trị 001 (kết
hợp với trường
d=1) cho biết
toán hạng đích
là thanh ghi
ECX
R/M
…0 1 11 1 11 01 1
Giá trị 2
trường
SS=10 và
Index=111
cho biết là
X là EDI×4
Giá trị 011
cho biết
định bộ nhớ
[EBX]
0 0 1
ADD ECX, 2000
• Lệnh này cộng dồn giá trị 2000 vào thanh ghi
ECX: ECX = ECX + 2000
24
0 0 1
Giá trị 100000 cho
biết là lệnh thao
tác với hằng số
Kiểu
0 0 0 01 0 1 1… … ……
Giá trị 1 cho biết
lệnh thực hiện
trên 2 giá trị 32-bit
s
d
Giá trị 0 cho biết kích
thước hằng số sẽ bằng
kích thước được chỉ
định trong bit s
REG
Phần mở rộng
của mã thao
tác, giá trị 000
cho biết đây là
thao tác cộng
với hằng số
R/M
Giá trị 11
cho biết
trường R/M
là thanh ghi
Giá trị 001 cho
biết toán hạng
đích là thanh
ghi ECX
Kết hợp
trường d=0
và s=1, nên
sử dụng 4
byte của
trường
hằng số
biểu diễn
giá trị 2000
…0 1 0 0 0
So sánh lệnh MIPS và x86 32 bit (1/3)
• MIPS: “Kiến trúc 3 toán hạng”
– 2 toán hạng nguồn và một toán hạng đích
add $s0,$s1,$s2 # s0=s1+s2
– Ưu điểm: ít lệnh hơn ⇒ Tốc độ xử lý nhanh hơn
• x86: “Kiến trúc 2 toán hạng”
– 1 toán hạng nguồn và 1 toán hạng đóng 2 vai trò toán
hạng đích và toán hạng nguồn
add EBX,EAX ; EBX=EBX+EAX
– Ưu điểm: lệnh ngắn hơn ⇒ Mã nguồn nhỏ hơn
25
So sánh lệnh MIPS và x86 32 bit (2/3)
• MIPS: “Kiến trúc nạp-lưu”
– Chỉ có lệnh Load/Store truy xuất bộ nhớ;các lệnh còn
lại thao tác trên thanh ghi, hằng số
lw $t0, 12($gp)
add $s0, $s0,$t0 # s0=s0+Mem[12+gp]
– Ưu điểm: Mạch xử lý đơn giản hơn ⇒ dễ nâng cao tốc
độ bằng cách sử dụng các kỹ thuật song song hóa
• x86: “Kiến trúc thanh ghi - bộ nhớ”
– Tất cả các lệnh đều có thể truy xuất bộ nhớ
ADD EAX,[ESI + 12] ;EAX=EAX+Mem[12+ESI]
– Ưu điểm: ít lệnh hơn ⇒ mã nguồn nhỏ hơn
26
So sánh lệnh MIPS và x86 32 bit (3/3)
• MIPS: “Các lệnh có chiều dài cố định”
– Tất cả các lệnh đều có kích thước 4 byte
– Mạch xử lý đơn giản hơn ⇒ Tốc độ xử lý nhanh hơn
– Lệnh nhảy: bội số của 4 byte
• x86: “Các lệnh có chiều dài thay đổi”
– Lệnh có kích thước thay đổi từ 1 byte tới 16 byte
⇒ Kích thước mã nguồn có thể nhỏ hơn (30% ?)
– Sử dụng bộ nhớ cache hiệu quả hơn
– Lệnh có thể có hằng số 8 bit hoặc 32 bit
27
Cú pháp lệnh hợp ngữ x86-32bit
• Hợp ngữ trên x86 có 2 cú pháp chính
– Cú pháp Intel
– Cú pháp AT&T
• <Tên lệnh> <toán hạng đích>, <toán hạng nguồn>
; Ghi chú
• Các loại toán hạng
– Thanh ghi: EAX, AX, AL,…
– Ô nhớ: [EBX], [EBX+ESI+7], biến, …
– Hằng số: 5, -24, 3Fh, 10001101b…
• Ví dụ
mov EAX, 2000 ; gán thanh ghi EAX = 2000
28
Các lệnh tính toán, tương tác bộ nhớ
• add…
• sub…
• nd…,or…, xor…
• nor
• sll, srl, sra
• lw
• sw
• lb
• lh
• add/addi
• lui
• x
• add
• sub
• and, or, xor
• not
• sal, shr, sar
• mov reg, mem
• mov mem, reg
• BYTE PTR
• WORD PTR
• mov reg, reg/imm
• x
• lea
lea esi, -4000000(ebp)
# esi = ebp - 4000000
30
Ví dụ
section .data
a DW 4321h
DW 8765h
b DW 0FFFFh
DW 0
section .code
; perform b = b + a
MOV AX, a
MOV BX, a+2
ADD b, AX ; 4320h with CF=1
ADC b+2,BX ; 8766h
; perform b = b + BX:AX
MOV AX, 5320h
MOV BX, 0
SUB b, AX ; F000h with CF=1
SBB b+2, BX ; 8765h
MOV CX, 128
; perform DX:AX = AX * CX
MOV AX, 0F000h ; 61440 dec
MUL CX ; DX:AX = 0078:0000
; (7864320=61440*128)
MOV AX, 0F000h ; -4096 dec
IMUL CX ; DX:AX = FFF8:0000
; (-524288=-4096*128)
; perform AX = DX:AX / CX
MOV AX, 0F000h ; 61440 dec
DIV CX ; AX = 01E0h
MOV AX, 0F000h ; -4096 dec ???
IDIV CX ; AX = ?
MOV AX, 0F000h ; -4096 dec
CWD
IDIV CX ; AX = FFE0h = -32
NEG AX ; 0020h = 32
31
Ví dụ
section .code
MOV AL, 36h
AND AL, 0Fh ; AL = 06h
; AL = 00000110b
AND AL, 00000010b ; AL = 00000010b = 02h
OR AL, 30h ; AL = 32h
XOR AL, AL ; AL = 0
NOT AL ; AL = FFh
MOV AX, 1234h
MOV CL, 4
SHR AX, CL ; 0123h
SHL AX, CL ; 1230h
MOV AL, -4 ; -4 = FCh = 11111100
SAR AL, 1 ; -2 = FEh = 11111110
MOV AL, -4 ; -4 = FCh = 11111100
SHR AL, 1 ; 126 = 7Eh = 01111110
MOV AL, 10101010b ; AAh
ROL AL, 1 ; 01010101 = 55h
MOV AL, 10101010b
STC ; CF = 1
RCR AL, 1 ; 11010101 = D5h CF = 0
32
Nhảy & lặp
• JMP
• J<cc>
– Nhảy theo cờ với kết quả không dấu
• JA(JNBE), JB(JNAE), JE(JZ), JNA(JBE), JNB(JAE), JNE(JNZ)
– Nhảy theo cờ với kết quả có dấu
• JG(JNLE), JL(JNGE), JE(JZ), JNG(JLE), JNL(JGE), JNE(JNZ)
– Nhảy theo trị của một cờ
• JC, JZ(JE), JS, JO, JNC, JNZ(JNE), JNS, JNO
• JCXZ
• LOOP
• LOOPE / LOOPNE, LOOPZ / LOOPNZ
• So sánh các thanh ghi
và thực hiện nhảy dựa
vào kết quả so sánh
– beq
– bne
– slt; beq
– slt; bne
• Thực hiện nhảy dựa vào
giá trị các cờ S, Z, C,
O,… Thường sử dụng
lệnh cmp trước các lệnh
nhảy để thay đổi giá trị
các cờ
– (cmp;) je
– (cmp;) jne
– (cmp;) jlt
– (cmp;) jge
33
So sánh lệnh nhảy trong MIPS và
x86-32bit
34
Rẽ nhánh (1/4)
Trong ngôn ngữ C
If (AX==0)
AX = AX + 1;
BX = AX;
If (AX<0)
AX = AX + 1;
Else
AX = AX – 1;
BX = AX;
Trong ASM (C2)
CMP AX, 0
JNE TIEP
INC AX
TIEP:
MOV BX, AX
CMP AX, 0
JNL LONHON
INC AX
JMP TIEP
LONHON:
DEC AX
TIEP:
MOV BX, AX
Trong ASM (C1)
CMP AX, 0
JE CONG
JMP TIEP
CONG:
INC AX
TIEP:
MOV BX, AX
CMP AX, 0
JL NHOHON
DEC AX
JMP TIEP
NHOHON:
INC AX
TIEP:
MOV BX, AX
35
Rẽ nhánh (2/4)
Trong ngôn ngữ C
If (AL==‘S’)
printf (“Chao buoi sang”);
else if (AL==‘T’)
printf (“Chao buoi trua”);
else if (AL==‘C’)
printf (“Chao buoi chiều”);
Trong ASM (C1)
CMP AL, 'S'
JE CHAO_BUOI_SANG
CMP AL, 'T'
JE CHAO_BUOI_TRUA
CMP AL, 'C'
JE CHAO_BUOI_CHIEU
JMP THOAT
CHAO_BUOI_SANG:
; xuất thông báo
; “Chao buoi sang”
;
JMP THOAT
CHAO_BUOI_TRUA:
; xuất thông báo
; “Chao buoi trua”
;
JMP THOAT
CHAO_BUOI_CHIEU:
; xuất thông báo
; “Chao buoi chieu”
;
THOAT:
Trong ASM (C2)
CMP AL, 'S'
JNE KP_SANG
; xuất thông báo
; “Chao buoi sang”
;
JMP THOAT
KP_SANG:
CMP AL, 'T'
JNE KP_TRUA
; xuất thông báo
; “Chao buoi trua”
;
JMP THOAT
KP_TRUA:
CMP AL, 'C'
JNE THOAT
; xuất thông báo
; “Chao buoi chieu”
;
THOAT:
36
Rẽ nhánh (3/4)
Trong ngôn ngữ C
If (AL>=‘a’ and AL<=‘z’)
AX = AX + 1;
else
AX = AX – 1;
BX = AX;
Trong ASM (C2)
CMP AL, ‘a’
JB KPTHUONG
CMP AL, ‘z’
JA KPTHUONG
INC AX
JMP TIEP
KPTHUONG:
DEC AX
TIEP:
MOV BX, AX
Trong ASM (C3)
CMP AL, ‘a’
JB KPTHUONG
CMP AL, ‘z’
JBE THUONG
KPTHUONG:
DEC AX
JMP TIEP
THUONG:
INC AX
TIEP:
MOV BX, AX
SAI
Trong ASM (C1)
CMP AL, ‘a’
JAE THUONG
CMP AL, ‘z’
JBE THUONG
DEC AX
JMP TIEP
THUONG:
INC AX
TIEP:
MOV BX, AX
37
Rẽ nhánh (3/4)
Trong ngôn ngữ C
If (AL>=‘a’ and AL<=‘z’)
AX = AX + 1;
else
AX = AX – 1;
BX = AX;
Trong ASM (C2)
CMP AL, ‘a’
JB KPTHUONG
CMP AL, ‘z’
JA KPTHUONG
INC AX
JMP TIEP
KPTHUONG:
DEC AX
TIEP:
MOV BX, AX
Trong ASM (C3)
CMP AL, ‘a’
JB KPTHUONG
CMP AL, ‘z’
JBE THUONG
KPTHUONG:
DEC AX
JMP TIEP
THUONG:
INC AX
TIEP:
MOV BX, AX
Trong ASM (C1)
CMP AL, 'a'
JAE CTTHUONG
DEC AX
JMP TIEP
CTTHUONG:
CMP AL, 'z'
JBE THUONG
DEC AX
JMP TIEP
THUONG:
INC AX
TIEP:
MOV BX, AX
SAI
38
Rẽ nhánh (4/4)
Trong ngôn ngữ C
If (AL>=‘A’ and AL<=‘Z’)
printf (“La ky tu hoa”);
else if (AL>=‘0’ and AL<=‘9’)
printf (“La ky tu so”);
else
printf (“La ky tu khac”);
Trong ASM (C2)
CMP AL, ‘A'
JB XETSO
CMP AL, ‘Z'
JA KHAC
; xuất thông báo
; “La ky tu hoa”
;
JMP THOAT
XETSO:
CMP AL, ‘0'
JB KHAC
CMP AL, ‘9'
JA KHAC
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
KHAC:
; xuất thông báo
; “La ky tu khac”
;
THOAT:
Trong ASM (C1)
CMP AL, 'A'
JAE LAHOA
CMP AL, 'Z'
JBE LAHOA
CMP AL, '0'
JAE LASO
CMP AL, '9'
JBE LASO
KHAC:
; xuất thông báo
; “La ky tu khac”
;
JMP THOAT
LAHOA:
; xuất thông báo
; “La ky tu hoa”
;
JMP THOAT
LASO:
; xuất thông báo
; “La ky tu so”
;
THOAT:
Trong ASM (C3)
CMP AL, '0'
JB KHAC
CMP AL, '9'
JBE LASO
CMP AL, 'A'
JB KHAC
CMP AL, 'Z'
JBE LAHOA
KHAC:
; xuất thông báo
; “La ky tu khac”
;
JMP THOAT
LASO:
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
LAHOA:
; xuất thông báo
; “La ky tu hoa”
;
THOAT:
SAI
39
Rẽ nhánh (4/4)
Trong ngôn ngữ C
If (AL>=‘A’ and AL<=‘Z’)
printf (“La ky tu hoa”);
else if (AL>=‘0’ and AL<=‘9’)
printf (“La ky tu so”);
else
printf (“La ky tu khac”);
Trong ASM (C2)
CMP AL, ‘A'
JB XETSO
CMP AL, ‘Z'
JA KHAC
; xuất thông báo
; “La ky tu hoa”
;
JMP THOAT
XETSO:
CMP AL, ‘0'
JB KHAC
CMP AL, ‘9'
JA KHAC
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
KHAC:
; xuất thông báo
; “La ky tu khac”
;
THOAT:
Trong ASM (C3)
CMP AL, '0'
JB KHAC
CMP AL, '9'
JBE LASO
CMP AL, 'A'
JB KHAC
CMP AL, 'Z'
JBE LAHOA
KHAC:
; xuất thông báo
; “La ky tu khac”
;
JMP THOAT
LASO:
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
LAHOA:
; xuất thông báo
; “La ky tu hoa”
;
THOAT:
Trong ASM (C1)
CMP AL, 'A'
JAE CTLAHOA
JMP KHAC
CTLAHOA:
CMP AL, 'Z'
JBE LAHOA
CMP AL, '0'
JAE CTLASO
JMP KHAC
CTLASO:
CMP AL, '9'
JBE LASO
JMP KHAC
LAHOA:
; xuất thông báo
; “La ky tu hoa”
;
JMP THOAT
LASO:
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
KHAC:
; xuất thông báo
; “La ky tu khac”
;
JMP THOAT
THOAT:
40
Rẽ nhánh (4/4)
Trong ngôn ngữ C
If (AL>=‘A’ and AL<=‘Z’)
printf (“La ky tu hoa”);
else if (AL>=‘0’ and AL<=‘9’)
printf (“La ky tu so”);
else
printf (“La ky tu khac”);
Trong ASM (C2)
CMP AL, ‘A'
JB XETSO
CMP AL, ‘Z'
JA KHAC
; xuất thông báo
; “La ky tu hoa”
;
JMP THOAT
XETSO:
CMP AL, ‘0'
JB KHAC
CMP AL, ‘9'
JA KHAC
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
KHAC:
; xuất thông báo
; “La ky tu khac”
;
THOAT:
Trong ASM (C3)
CMP AL, '0'
JB KHAC
CMP AL, '9'
JBE LASO
CMP AL, 'A'
JB KHAC
CMP AL, 'Z'
JBE LAHOA
KHAC:
; xuất thông báo
; “La ky tu khac”
;
JMP THOAT
LASO:
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
LAHOA:
; xuất thông báo
; “La ky tu hoa”
;
THOAT:
Trong ASM (C1)
CMP AL, '0'
JAE CTLASO
JMP KHAC
CTLASO:
CMP AL, '9'
JBE LASO
CMP AL, 'A'
JAE CTLAHOA
JMP KHAC
CTLAHOA:
CMP AL, 'Z'
JBE LAHOA
JMP KHAC
LASO:
; xuất thông báo
; “La ky tu so”
;
JMP THOAT
LAHOA:
; xuất thông báo
; “La ky tu hoa”
;
JMP THOAT
KHAC:
; xuất thông báo
; “La ky tu khac”
;
JMP THOAT
THOAT:
41
Một vài lưu ý về rẽ nhánh
• Thường dùng cách (2) hoặc cách (3) để thực hiện rẽ nhánh
– Cách (3) dễ hiểu đối với người đọc
– Cách (2) hơi khó hiểu hơn nhưng ánh xạ tương ứng với mã
ngôn ngữ C
• Cách (1) ít được sử dụng
– Chỉ nên sử dụng trong trường hợp so sánh bằng
– Khi điều kiện so sách phức tạp thì việc quản lý rẽ nhánh sẽ trở
nên rất phức tạp và khó kiểm soát
• … …
JMP TEST ß THỪA J<cc> TEST ß SAI
TEST: TEST:
… …
42
Cách diễn đạt (1/2)
mov ax, bl ???
s db 12h, 34h, 56h, 78h, 90h
mov al, s[0]
mov s[1], ax
mov s[3], 5
lea si, s
mov al, [si]
mov [si+1], ax
mov [si+3], 5
s dw 0123h, 0456h, 0789h ???
mov al, bl hoặc mov al, bl
cbw mov ah, 0
; al = 12
; lỗi à mov word ptr s[1], ax
; s = 12, 12, 00, 05, 90
; al = 12
; s = 12, 12, 00, 78, 90
; lỗi à mov byte ptr [si+3], 5
; s = 12, 12, 00, 05, 90
43
Cách diễn đạt (2/2)
Trong ngôn ngữ C
a = b;
x = y*z;
Trong ASM:
mov AX, b
mov a, AX
mov AX, y
imul z
mov x, AX
Tại sao không có imul z,x,y ? mov a,b ?
44
Ngăn xếp (Stack)
• Ngăn xếp là một vùng nhớ
– Hoạt động theo cơ chế LIFO (Last In First Out)
– Được sử dụng theo chiều giảm của địa chỉ (khác với các
vùng nhớ thông thường được sử dụng theo chiều tăng
của địa chỉ)
• Cặp thanh ghi SS:ESP chứa địa chỉ segment:offset
của của đỉnh ngăn xếp
• Lệnh PUSH <toán hạng>
– Toán hạng có thể là thanh ghi/vùng nhớ/hằng số 4 byte
– Giảm ESP đi 4
– Đưa giá trị của toán hạng vào ô nhớ có địa chỉ SS:ESP.
• Lệnh POP <toán hạng>
– Toán hạng có thể là thanh ghi/vùng nhớ 4 byte
– Đưa giá trị từ ô nhớ có địa chỉ SS:ESP vào toán hạng
– Tăng ESP lên 4
45
Ví dụ lệnh PUSH
EAX có giá trị 3412h
Trước thao tác PUSH EAX Sau thao tác PUSH EAX
46
Ví dụ lệnh POP
04h
03h
SS:0000h
SS:00F7h
…..
SS:00F8h
ESP = 00FDh
SS:00F6h
…..
SS:00F5h
SS:00F9h
01h
01h
02h
SS:00FAh
SS:00FBh
SS:00FCh
SS:00FDh
Trước thao tác POP EBX Sau thao tác POP EBX
EBX có giá trị 01020304h
47
Thủ tục (Procedure)
• Lệnh CALL <Tên thủ tục>
– Sử dụng stack để lưu trữ (PUSH) địa chỉ của lệnh tiếp ngay sau
lệnh CALL (nơi cần quay lại)
– Ghi vào thanh ghi con trỏ lệnh EIP địa chỉ của lệnh đầu tiên của
chương trình con.
• Khai báo thủ tục
• Lệnh RET
– Lấy (POP) giá trị từ đỉnh ngăn xếp và ghi vào thanh ghi con trỏ
lệnh EIP, làm cho lệnh tiếp theo được thực hiện chính là lệnh
ngay sau lệnh CALL.
<Tên thủ tục> PROC
.
.
ret
<Tên thủ tục> ENDP
sample PROC
.
.
ret
sample ENDP
48
Ví dụ gọi thủ tục
49
Diễn giải lời gọi thủ tục ToUpper thứ 1
Trước CALL Sau CALL Sau RET
50
Diễn giải lời gọi thủ tục ToUpper thứ 2
0Bh
00h
00h
00h01FFh
0200h
01FEh
01FDh
01FCh
…….
Stack
segment
0010hEIP
0200hESP
13h
00h
00h
00h01FFh
0200h
01FEh
01FDh
01FCh
…….
Stack
segment
0045hEIP
01FChESP
13h
00h
00h
00h01FFh
0200h
01FEh
01FDh
01FCh
…….
Stack
segment
0013hEIP
0200hESP
ESP
ESP
ESP
Trước CALL Sau CALL Sau RET
51
Ví dụ gọi thủ tục
lồng nhau
52
Diễn giải gọi thủ tục lồng nhau
Trước
CALL Upcase
Sau
CALL Upcase
Sau
CALL ToUpper
Sau
RET ToUpper
Sau
CALL Upcase
53
Một số lưu ý về sử dụng Thủ tục
khi lập trình hợp ngữ x86
• Khai báo thủ tục sau lời gọi thủ tục thoát
• Không nên có lệnh nhảy ra ngoài thủ tục
• Lời gọi thủ tục thao tác với ngăn xếp một cách
không tường minh
• Nếu trong thân thủ tục có thao tác với ngăn xếp,
nhớ lưu lại địa chỉ trả về của thủ tục
• Truyền tham số cho thủ tục
– Thanh ghi
– Biến toàn cục
– Ngăn xếp

More Related Content

What's hot

Bo de toan roi rac (on thi cao hoc khmt)
Bo de toan roi rac (on thi cao hoc khmt)Bo de toan roi rac (on thi cao hoc khmt)
Bo de toan roi rac (on thi cao hoc khmt)lieu_lamlam
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngHuyen Pham
 
Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02Nhóc Nhóc
 
Các phương pháp đếm nâng cao
Các phương pháp đếm nâng caoCác phương pháp đếm nâng cao
Các phương pháp đếm nâng caoThế Giới Tinh Hoa
 
Kiến trúc máy tính và hợp ngữ bài 03
Kiến trúc máy tính và hợp ngữ bài 03Kiến trúc máy tính và hợp ngữ bài 03
Kiến trúc máy tính và hợp ngữ bài 03Nhóc Nhóc
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Nhóc Nhóc
 
Các cấu trúc lệnh trong C
Các cấu trúc lệnh trong CCác cấu trúc lệnh trong C
Các cấu trúc lệnh trong Cpnanhvn
 
BGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic sốBGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic sốCao Toa
 
Đại số boolean và mạch logic
Đại số boolean và mạch logicĐại số boolean và mạch logic
Đại số boolean và mạch logicwww. mientayvn.com
 
91684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-291684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-2tranquanthien
 
Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768
Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768
Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768nataliej4
 
Bai02 he thong quan ly tap tin
Bai02   he thong quan ly tap tinBai02   he thong quan ly tap tin
Bai02 he thong quan ly tap tinVũ Sang
 
Chuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop nguChuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop ngumituan
 
Bài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhBài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhCao Toa
 
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIRThe Nguyen Manh
 
Hệ phương trình vi phân tuyến tính
Hệ phương trình vi phân tuyến tínhHệ phương trình vi phân tuyến tính
Hệ phương trình vi phân tuyến tínhThế Giới Tinh Hoa
 
Bai07 bo nho
Bai07   bo nhoBai07   bo nho
Bai07 bo nhoVũ Sang
 

What's hot (20)

Bo de toan roi rac (on thi cao hoc khmt)
Bo de toan roi rac (on thi cao hoc khmt)Bo de toan roi rac (on thi cao hoc khmt)
Bo de toan roi rac (on thi cao hoc khmt)
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
 
Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02
 
Các phương pháp đếm nâng cao
Các phương pháp đếm nâng caoCác phương pháp đếm nâng cao
Các phương pháp đếm nâng cao
 
Kiến trúc máy tính và hợp ngữ bài 03
Kiến trúc máy tính và hợp ngữ bài 03Kiến trúc máy tính và hợp ngữ bài 03
Kiến trúc máy tính và hợp ngữ bài 03
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05
 
Các cấu trúc lệnh trong C
Các cấu trúc lệnh trong CCác cấu trúc lệnh trong C
Các cấu trúc lệnh trong C
 
Ktmt chuong 3
Ktmt chuong 3Ktmt chuong 3
Ktmt chuong 3
 
BGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic sốBGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic số
 
Đại số boolean và mạch logic
Đại số boolean và mạch logicĐại số boolean và mạch logic
Đại số boolean và mạch logic
 
91684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-291684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-2
 
Bài giảng Assembly
Bài giảng AssemblyBài giảng Assembly
Bài giảng Assembly
 
Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768
Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768
Ngân hàng đề môn điện tử số kỹ thuật số ( có đáp án) 4797768
 
Bai02 he thong quan ly tap tin
Bai02   he thong quan ly tap tinBai02   he thong quan ly tap tin
Bai02 he thong quan ly tap tin
 
Chuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop nguChuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop ngu
 
Hop ngu mips
Hop ngu mipsHop ngu mips
Hop ngu mips
 
Bài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhBài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tính
 
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
 
Hệ phương trình vi phân tuyến tính
Hệ phương trình vi phân tuyến tínhHệ phương trình vi phân tuyến tính
Hệ phương trình vi phân tuyến tính
 
Bai07 bo nho
Bai07   bo nhoBai07   bo nho
Bai07 bo nho
 

Similar to Kiến trúc máy tính và hợp ngữ bài 08

Tim hieu thanh ghi in asm
Tim hieu thanh ghi in asmTim hieu thanh ghi in asm
Tim hieu thanh ghi in asmMy Đá
 
kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...
kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...
kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...ME8M
 
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdfCHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdfTriuPhm15
 
Kien truc bo_lenh_mips
Kien truc bo_lenh_mipsKien truc bo_lenh_mips
Kien truc bo_lenh_mipsVN Phan
 
Microprocessor final ver1_part2
Microprocessor final ver1_part2Microprocessor final ver1_part2
Microprocessor final ver1_part2Mit Rin
 
Bài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTUBài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTUNgô Doãn Tình
 
Slide c2 + c3
Slide   c2 + c3Slide   c2 + c3
Slide c2 + c3Huynh MVT
 
Họ vi xử lí 8086 intel
Họ vi xử lí 8086 intelHọ vi xử lí 8086 intel
Họ vi xử lí 8086 inteldark_valley
 
Sinh vienit.net --sinhvienit.net--tracnghiemktmt
Sinh vienit.net --sinhvienit.net--tracnghiemktmtSinh vienit.net --sinhvienit.net--tracnghiemktmt
Sinh vienit.net --sinhvienit.net--tracnghiemktmtkieutrinh0994
 
Nhập môn Mạch số, Hà Lê Hoài Trung
Nhập môn Mạch số, Hà Lê Hoài TrungNhập môn Mạch số, Hà Lê Hoài Trung
Nhập môn Mạch số, Hà Lê Hoài TrungMan_Ebook
 
vxl.vdk.TranThanhPhong
vxl.vdk.TranThanhPhongvxl.vdk.TranThanhPhong
vxl.vdk.TranThanhPhongLong Tran Huy
 
Chương 2 CPU và tập lệnh máy tính.ppt
Chương 2 CPU và tập lệnh máy tính.pptChương 2 CPU và tập lệnh máy tính.ppt
Chương 2 CPU và tập lệnh máy tính.pptDuongTranTrong
 
đề Cương ôn tập
đề Cương ôn tậpđề Cương ôn tập
đề Cương ôn tậphuynguyenvan19
 
Tự học PLC CP1L
Tự học PLC CP1LTự học PLC CP1L
Tự học PLC CP1Lquanglocbp
 

Similar to Kiến trúc máy tính và hợp ngữ bài 08 (20)

Tim hieu thanh ghi in asm
Tim hieu thanh ghi in asmTim hieu thanh ghi in asm
Tim hieu thanh ghi in asm
 
ghsx.pdf
ghsx.pdfghsx.pdf
ghsx.pdf
 
kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...
kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...
kien-truc-may-tinh-va-hop-ngu_pham-tuan-son_bai05_kien_truc_mips - [cuuduongt...
 
Assembly
AssemblyAssembly
Assembly
 
Chuong2
Chuong2Chuong2
Chuong2
 
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdfCHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
 
Vi si ly
Vi si lyVi si ly
Vi si ly
 
Assembly v1.0
Assembly v1.0Assembly v1.0
Assembly v1.0
 
Kien truc bo_lenh_mips
Kien truc bo_lenh_mipsKien truc bo_lenh_mips
Kien truc bo_lenh_mips
 
Microprocessor final ver1_part2
Microprocessor final ver1_part2Microprocessor final ver1_part2
Microprocessor final ver1_part2
 
Bài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTUBài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTU
 
Slide c2 + c3
Slide   c2 + c3Slide   c2 + c3
Slide c2 + c3
 
Họ vi xử lí 8086 intel
Họ vi xử lí 8086 intelHọ vi xử lí 8086 intel
Họ vi xử lí 8086 intel
 
Trac nghiemctmt
Trac nghiemctmtTrac nghiemctmt
Trac nghiemctmt
 
Sinh vienit.net --sinhvienit.net--tracnghiemktmt
Sinh vienit.net --sinhvienit.net--tracnghiemktmtSinh vienit.net --sinhvienit.net--tracnghiemktmt
Sinh vienit.net --sinhvienit.net--tracnghiemktmt
 
Nhập môn Mạch số, Hà Lê Hoài Trung
Nhập môn Mạch số, Hà Lê Hoài TrungNhập môn Mạch số, Hà Lê Hoài Trung
Nhập môn Mạch số, Hà Lê Hoài Trung
 
vxl.vdk.TranThanhPhong
vxl.vdk.TranThanhPhongvxl.vdk.TranThanhPhong
vxl.vdk.TranThanhPhong
 
Chương 2 CPU và tập lệnh máy tính.ppt
Chương 2 CPU và tập lệnh máy tính.pptChương 2 CPU và tập lệnh máy tính.ppt
Chương 2 CPU và tập lệnh máy tính.ppt
 
đề Cương ôn tập
đề Cương ôn tậpđề Cương ôn tập
đề Cương ôn tập
 
Tự học PLC CP1L
Tự học PLC CP1LTự học PLC CP1L
Tự học PLC CP1L
 

More from Nhóc Nhóc

Hướng dẫn giải bài tập Đại Số Tuyến Tính
Hướng dẫn giải bài tập Đại Số Tuyến TínhHướng dẫn giải bài tập Đại Số Tuyến Tính
Hướng dẫn giải bài tập Đại Số Tuyến TínhNhóc Nhóc
 
Pc magazine january 2015 usa
Pc magazine   january 2015  usaPc magazine   january 2015  usa
Pc magazine january 2015 usaNhóc Nhóc
 
Teach yourself photoshop 2014
Teach yourself photoshop   2014Teach yourself photoshop   2014
Teach yourself photoshop 2014Nhóc Nhóc
 
Kiến trúc máy tính và hợp ngữ bài 06
Kiến trúc máy tính và hợp ngữ bài 06Kiến trúc máy tính và hợp ngữ bài 06
Kiến trúc máy tính và hợp ngữ bài 06Nhóc Nhóc
 
Kiến trúc máy tính và hợp ngữ bài 01
Kiến trúc máy tính và hợp ngữ bài 01Kiến trúc máy tính và hợp ngữ bài 01
Kiến trúc máy tính và hợp ngữ bài 01Nhóc Nhóc
 
kiến trúc máy tính và hợp ngữ Bài 00
kiến trúc máy tính và hợp ngữ Bài 00kiến trúc máy tính và hợp ngữ Bài 00
kiến trúc máy tính và hợp ngữ Bài 00Nhóc Nhóc
 
Lập trình web - HTML cơ bản
Lập trình web - HTML cơ bảnLập trình web - HTML cơ bản
Lập trình web - HTML cơ bảnNhóc Nhóc
 
Cơ bản về tcp ip
Cơ bản về tcp ipCơ bản về tcp ip
Cơ bản về tcp ipNhóc Nhóc
 
10 Command Line quan trọng để giao tiếp với Cisco IOs
10 Command Line quan trọng để giao tiếp với Cisco IOs10 Command Line quan trọng để giao tiếp với Cisco IOs
10 Command Line quan trọng để giao tiếp với Cisco IOsNhóc Nhóc
 
Computer World - April 21 2014
Computer World - April 21 2014Computer World - April 21 2014
Computer World - April 21 2014Nhóc Nhóc
 

More from Nhóc Nhóc (10)

Hướng dẫn giải bài tập Đại Số Tuyến Tính
Hướng dẫn giải bài tập Đại Số Tuyến TínhHướng dẫn giải bài tập Đại Số Tuyến Tính
Hướng dẫn giải bài tập Đại Số Tuyến Tính
 
Pc magazine january 2015 usa
Pc magazine   january 2015  usaPc magazine   january 2015  usa
Pc magazine january 2015 usa
 
Teach yourself photoshop 2014
Teach yourself photoshop   2014Teach yourself photoshop   2014
Teach yourself photoshop 2014
 
Kiến trúc máy tính và hợp ngữ bài 06
Kiến trúc máy tính và hợp ngữ bài 06Kiến trúc máy tính và hợp ngữ bài 06
Kiến trúc máy tính và hợp ngữ bài 06
 
Kiến trúc máy tính và hợp ngữ bài 01
Kiến trúc máy tính và hợp ngữ bài 01Kiến trúc máy tính và hợp ngữ bài 01
Kiến trúc máy tính và hợp ngữ bài 01
 
kiến trúc máy tính và hợp ngữ Bài 00
kiến trúc máy tính và hợp ngữ Bài 00kiến trúc máy tính và hợp ngữ Bài 00
kiến trúc máy tính và hợp ngữ Bài 00
 
Lập trình web - HTML cơ bản
Lập trình web - HTML cơ bảnLập trình web - HTML cơ bản
Lập trình web - HTML cơ bản
 
Cơ bản về tcp ip
Cơ bản về tcp ipCơ bản về tcp ip
Cơ bản về tcp ip
 
10 Command Line quan trọng để giao tiếp với Cisco IOs
10 Command Line quan trọng để giao tiếp với Cisco IOs10 Command Line quan trọng để giao tiếp với Cisco IOs
10 Command Line quan trọng để giao tiếp với Cisco IOs
 
Computer World - April 21 2014
Computer World - April 21 2014Computer World - April 21 2014
Computer World - April 21 2014
 

Kiến trúc máy tính và hợp ngữ bài 08

  • 1. Bài 08: Kiến trúc x86-32bit Phạm Tuấn Sơn ptson@fit.hcmus.edu.vn
  • 2. Lịch sử phát triển vi xử lý Intel • Intel 4004 (1971) – Vi xử lý đầu tiên của Intel – 4-bit • Intel 8080 (1972) – Thanh ghi 8-bit – Đường truyền dữ liệu 8-bit – Đường truyền địa chỉ 16-bit (có thể truy xuất bộ nhớ RAM 64 KB) – Được sử dụng trên máy tính cá nhân đầu tiên - Altair • Intel 8086/8088 (1978) – Thanh ghi 16-bit – Đường truyền dữ liệu 16-bit (8088: 8-bit) – Đường truyền địa chỉ 20-bit – Được dùng trên máy tính cá nhân IBM PC đầu tiên • Intel 80286 (1982) – Có thể truy xuất bộ nhớ 16 MB – Đường truyền địa chỉ 24-bit 2
  • 3. Lịch sử phát triển vi xử lý Intel (tt) • Kiến trúc x86-32bit (IA-32) – Intel 80386/ i386 (1985) • Thanh ghi 32 bit • Đường truyền địa chỉ 32-bit – Intel 80486/ i486 (1989) • Kỹ thuật đường ống (pipelining) – Pentium (1993) • Đường truyền dữ liệu 64-bit • Siêu vô hướng (2 đường ống song song) – Pentium Pro (1995), II (1997), III (1999), IV (2000), M (2003). 3
  • 4. Lịch sử phát triển vi xử lý Intel (tt) • Kiến trúc x86-64bit – Athlon64 của AMD (2003) • Bộ vi xử lý x86-64bit đầu tiên – Pentium 4 Prescott (2004) – Core 2 (2006), Core i3, i5, i7, Atom (2008) – Intel Sandy Bridge (2010) • Kiến trúc IA-64 – Itanium (2001) 4
  • 5. Kiến trúc x86-32bit • Chế độ hoạt động • Tổ chức bộ nhớ • Tập thanh ghi • Tập lệnh • Ngăn xếp • Thủ tục 5
  • 6. Chế độ hoạt động • Chế độ thực – 16 bit (8086) – Truy xuất 1 MB bộ nhớ chính – MS-DOS • Chế độ bảo vệ – 32 bit – Truy xuất 4 GB bộ nhớ chính – Windows, Linux • Chế độ quản lý hệ thống – Quản lý nguồn cung cấp – Chẩn lỗi và bảo mật hệ thống 6 • Chế độ 8086 ảo • Chế độ thực dưới sự quản lý của chế độ bảo vệ • Cho phép hoạt động đồng thời ở 2 chế độ
  • 7. RAM ….. Physical address 00000h 00001h FFFFFh 0000Fh 00010h 00011h 0001Fh 00020h 00002h ….. 0FFFFh 10000h ….. 1000Fh 10010h ….. 1001Fh 10020h ….. ….. Segment0000 Segment0001 16 bytes ….. Segment0002 16 bytes 0000h:0020h 0001h:0010h 0002h:0000h Segment : Offset Vì mỗi ô nhớ có thể thuộc nhiều segment khác nhau, một địa chỉ vật lí 00020h có thể ứng với nhiều địa chỉ logic khác nhau, tùy vào việc lựa chọn segment. F0000h ….. F000Fh ….. FFFF0h SegmentF000h F0010h SegmentF001h SegmentFFFFh Một số địa chỉ logic có thể trở nên không hợp lệ. Ví dụ, ở segment FFFFh, chỉ có các offset từ 0000h đến 000Fh mới tạo thành một địa chỉ hợp lệ, bởi vì địa chỉ vật lí chỉ có đến FFFFFh là hết Logical address Tổ chức bộ nhớ chế độ thực 7 Tại sao kích thước mỗi đoạn là 64 KB ? Tại sao các đoạn lại cách nhau 16 byte ? Tại sao các đoạn lại nằm chồng lên nhau ?
  • 8. Chuyển đổi địa chỉ ở chế độ thực • Địa chỉ logic à địa chỉ vật lý – Phy_address = segment * 10h + offset – Vd: địa chỉ logic 1234h:0005h sẽ ứng với địa chỉ vật lí 1234h * 10h + 0005h = 12340h + 0005h = 12345h • Địa chỉ vật lý à địa chỉ logic – Do các đoạn gối đầu nhau nên mỗi ô nhớ có thể thuộc một vài đoạn khác nhau. Vì vậy, một địa chỉ vật lý có thể ứng với nhiều địa chỉ logic khác nhau. – Vd: địa chỉ vật lý 12345h có thể ứng với các địa chỉ logic sau: 1234h:0005h, 1230h:0045h 1200h:0345h, 1000h:2345h 1232h:0025h, … 8
  • 9. Tổ chức bộ nhớ chế độ bảo vệ • Bộ nhớ cũng được chia thành các đoạn. Tuy nhiên, kích thước các đoạn không được định sẵn như chế độ thực. • Do đó, để định vị một đoạn nào đó thì phải sử dụng một bảng mô tả các đoạn. • Để truy xuất vào một ô nhớ trong bộ nhớ chính thì cũng phải thực hiện chuyển đổi từ địa chỉ logic (segment, offset) thành địa chỉ vật lý 9 3000 RAM 00003000 Local Descriptor Table 0002 00008000 000A 00026000 0010 base limit access 8000 26000
  • 10. Chuyển đổi địa chỉ ở chế độ bảo vệ • Thực hiện quá trình chuyển đổi địa chỉ một bước hoặc hai bước để chuyển đổi từ địa chỉ logic (segment, offset) thành địa chỉ vật lý • Bước 1, kết hợp segment và offset thành địa chỉ tuyến tính (linear address) 10 Selector Offset Logical address Segment Descriptor Descriptor table + GDTR/LDTR (contains base address of descriptor table) Linear address
  • 11. Chuyển đổi địa chỉ ở chế độ bảo vệ (tt) • Bước 2, chuyển địa chỉ tuyến tính thành địa chỉ vật lý (physical address) 11 Directory Table Offset Directory Entry CR3 Page Directory Page-Table Entry Page Table Physical Address Page Frame Linear Address 10 10 12 32
  • 12. Chương trình chạy trên hệ thống • Chương trình chạy trên hệ thống thông thường chiếm 3 đoạn bộ nhớ – Một đoạn dành cho mã lệnh (code segment) – Một đoạn dành cho dữ liệu (data segment) – Một đoạn ngăn xếp (stack segment) dành để lưu các giá trị trung gian hoặc các địa chỉ trở về dùng khi gọi hàm • Trên hệ thống x86, cần có các thanh ghi chứa địa chỉ đoạn và địa chỉ ô để truy xuất bộ nhớ 12
  • 13. bit Tập thanh ghi 13 DS FS GS eax ah ax al Tích lũy ebx bh bx bl Chỉ mục cơ sở ecx ch cx cl Đếm edx dh dx dl Dữ liệu esi si Chỉ mục nguồn ES edi di Chỉ mục đích SS esp sp Con trỏ ngăn xếp ebp bp Con trỏ cơ sở code data stack Khônggianđịachỉchươngtrình Thanh ghi đoạn (16 bit) Các thanh ghi đa dụng (32 bit) CS 31 16 15 8 7 0
  • 14. Một số thanh ghi khác • Thanh ghi chứa địa chỉ lệnh (EIP – 32 bit), kết hợp thanh ghi đoạn CS – 16bit (CS:EIP) • Thanh ghi cờ (EFLAGS – 32 bit) – Carry: cờ tràn không dấu – Overflow: cờ tràn có dấu – Sign: cờ dấu – Zero: cờ zero – Auxiliary Carry: cờ nhớ từ bit 3 vào bit 4 – Parity: cờ chẵn lẻ – … Giá trị của từng cờ được thiết lập sau mỗi lệnh được thực thi • Một số thanh ghi khác: IDTR (16bit), GDTR (48bit), LDTR (48bit), TR (16bit), ... 14 ……. CFPFAFZFSFTFIFDFOFIO PL IO PL NTRFVM 32 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  • 15. Cấu trúc lệnh • Mặc dù trong cấu trúc lệnh có tổng cộng 16 byte nhưng thực tế chỉ cho phép lệnh dài tối đa 15 byte 15 Tiền tố điều khiển các thành phần còn lại của lệnh Mã thao tác có kích thước 1 hoặc 2 byte tùy lệnh Toán hạng thanh ghi hoặc vùng nhớ Kiểu (2bit) REG (3bit) R/M (3bit) Kiểu định vị xác định kiểu định vị bộ nhớ Độ dời trong truy xuất bộ nhớ Toán hạng Hằng số SS (2bit) Index (3bit) Base (3bit)
  • 16. ADD CL, AL • Lệnh này cộng dồn giá trị trong thanh ghi AL vào thanh ghi CL: CL = CL + AL 16 0 0 1 Mã thao tác của lệnh ADD là 000000 Giá trị 11 cho biết trường R/M là thanh ghi Kiểu 0 0 0 00 0 1 1… … ……… Giá trị 0 cho biết lệnh thực hiện trên 2 giá trị 8-bit s d Giá trị 0 cho biết cộng dồn trường REG vào trường R/M REG Giá trị 000 (kết hợp với trường d=0) cho biết toán hạng nguồn là thanh ghi AL R/M Giá trị 001 (kết hợp với trường d=0) cho biết toán hạng đích là thanh ghi CL 0 0 00 0
  • 17. ADD ECX, EAX • Lệnh này cộng dồn giá trị trong thanh ghi EAX vào thanh ghi ECX 17 0 1 0 0 1 Mã thao tác của lệnh ADD là 000000 Giá trị 11 cho biết trường R/M là thanh ghi Kiểu 0 0 00 0 0 00 0 1 1… … ……… Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 0 cho biết cộng dồn trường REG vào trường R/M REG Giá trị 000 (kết hợp với trường d=0) cho biết toán hạng nguồn là thanh ghi EAX R/M Giá trị 001 (kết hợp với trường d=0) cho biết toán hạng đích là thanh ghi ECX
  • 18. ADD EDX, [2000] • Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ bắt đầu là DS:2000 vào thanh ghi EDX 18 1 1 1 0 1 Mã thao tác của lệnh ADD là 000000 Giá trị 00 kết hợp với trường R/M=101 cho biết định vị bộ nhớ theo độ dời Kiểu 0 1 10 0 0 00 0 0 0… … …… Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 1 cho biết cộng dồn trường R/M vào trường REG REG Giá trị 011 (kết hợp với trường d=1) cho biết toán hạng đích là thanh ghi EDX R/M Sử dụng 4 byte của trường độ dời biểu diễn giá trị 2000 …
  • 19. ADD EDI, [EBX] • Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ bắt đầu là DS:EBX vào thanh ghi EDI 19 0 1 1 Mã thao tác của lệnh ADD là 000000 Giá trị 00 cho biết không dùng trường độ dời Kiểu 0 0 0 00 0 0 0… … ……… Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 1 cho biết cộng dồn trường R/M vào trường REG REG Giá trị 111 (kết hợp với trường d=1) cho biết toán hạng đích là thanh ghi EDI R/M Giá trị 011 cho biết định vị bộ nhớ [EBX] 1 1 11 1
  • 20. ADD EAX, [ESI + 2] • Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ bắt đầu là DS:(ESI+2) vào thanh ghi EAX 20 1 1 1 1 0 Mã thao tác của lệnh ADD là 000000 Giá trị 01 cho biết sử dụng 1 byte độ dời Kiểu 0 0 00 0 0 00 0 0 1… … …… Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 1 cho biết cộng dồn trường R/M vào trường REG REG Giá trị 000 (kết hợp với trường d=1) cho biết toán hạng đích là thanh ghi EAX R/M Sử dụng 1 byte cao của trường độ dời biểu diễn giá trị 2 … Giá trị 110 cho biết định vị bộ nhớ [ESI]
  • 21. ADD EBX, [EBP + 2000] • Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ bắt đầu là SS:(EBP+2000) vào thanh ghi EBX 21 1 1 1 0 1 Mã thao tác của lệnh ADD là 000000 Giá trị 10 cho biết sử dụng 4 byte độ dời Kiểu 0 1 10 0 0 00 0 1 0… … …… Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 1 cho biết cộng dồn trường R/M vào trường REG REG Giá trị 011 (kết hợp với trường d=1) cho biết toán hạng đích là thanh ghi EBX R/M Sử dụng 4 byte của trường độ dời biểu diễn giá trị 2000 … Giá trị 101 cho biết định vị bộ nhớ [EBP]
  • 22. ADD EBP, [2000 + EAX×1] • Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ bắt đầu là DS:(EAX×1 + 2000) vào thanh ghi EBP 22 1 0 0 Mã thao tác của lệnh ADD là 000000 Giá trị 00 kết hợp với trường R/M=100 cho biết định vị bộ nhớ SIB [độ dời(4byte) + X] Kiểu 0 0 0 00 0 0 0… … … Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 1 cho biết cộng dồn trường R/M vào trường REG REG Giá trị 101 (kết hợp với trường d=1) cho biết toán hạng đích là thanh ghi EBP R/M Sử dụng 4 byte của trường độ dời biểu diễn giá trị 2000 …1 0 10 0 00 01 1 Giá trị 2 trường SS=00 và Index=000 cho biết là X là EAX×1 Giá trị 101 cho biết định bộ nhớ theo độ dời 1 0 1
  • 23. ADD ECX, [EBX + EDI×4] • Lệnh này cộng dồn giá trị từ nhớ 4 byte có địa chỉ bắt đầu là DS:(EDI×4 + EBX) vào thanh ghi ECX 23 1 0 0 Mã thao tác của lệnh ADD là 000000 Giá trị 00 kết hợp với trường R/M=100 cho biết định vị bộ nhớ SIB [độ dời(4byte) + X] Kiểu 0 0 0 00 0 0 0… … … Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 1 cho biết cộng dồn trường R/M vào trường REG REG Giá trị 001 (kết hợp với trường d=1) cho biết toán hạng đích là thanh ghi ECX R/M …0 1 11 1 11 01 1 Giá trị 2 trường SS=10 và Index=111 cho biết là X là EDI×4 Giá trị 011 cho biết định bộ nhớ [EBX] 0 0 1
  • 24. ADD ECX, 2000 • Lệnh này cộng dồn giá trị 2000 vào thanh ghi ECX: ECX = ECX + 2000 24 0 0 1 Giá trị 100000 cho biết là lệnh thao tác với hằng số Kiểu 0 0 0 01 0 1 1… … …… Giá trị 1 cho biết lệnh thực hiện trên 2 giá trị 32-bit s d Giá trị 0 cho biết kích thước hằng số sẽ bằng kích thước được chỉ định trong bit s REG Phần mở rộng của mã thao tác, giá trị 000 cho biết đây là thao tác cộng với hằng số R/M Giá trị 11 cho biết trường R/M là thanh ghi Giá trị 001 cho biết toán hạng đích là thanh ghi ECX Kết hợp trường d=0 và s=1, nên sử dụng 4 byte của trường hằng số biểu diễn giá trị 2000 …0 1 0 0 0
  • 25. So sánh lệnh MIPS và x86 32 bit (1/3) • MIPS: “Kiến trúc 3 toán hạng” – 2 toán hạng nguồn và một toán hạng đích add $s0,$s1,$s2 # s0=s1+s2 – Ưu điểm: ít lệnh hơn ⇒ Tốc độ xử lý nhanh hơn • x86: “Kiến trúc 2 toán hạng” – 1 toán hạng nguồn và 1 toán hạng đóng 2 vai trò toán hạng đích và toán hạng nguồn add EBX,EAX ; EBX=EBX+EAX – Ưu điểm: lệnh ngắn hơn ⇒ Mã nguồn nhỏ hơn 25
  • 26. So sánh lệnh MIPS và x86 32 bit (2/3) • MIPS: “Kiến trúc nạp-lưu” – Chỉ có lệnh Load/Store truy xuất bộ nhớ;các lệnh còn lại thao tác trên thanh ghi, hằng số lw $t0, 12($gp) add $s0, $s0,$t0 # s0=s0+Mem[12+gp] – Ưu điểm: Mạch xử lý đơn giản hơn ⇒ dễ nâng cao tốc độ bằng cách sử dụng các kỹ thuật song song hóa • x86: “Kiến trúc thanh ghi - bộ nhớ” – Tất cả các lệnh đều có thể truy xuất bộ nhớ ADD EAX,[ESI + 12] ;EAX=EAX+Mem[12+ESI] – Ưu điểm: ít lệnh hơn ⇒ mã nguồn nhỏ hơn 26
  • 27. So sánh lệnh MIPS và x86 32 bit (3/3) • MIPS: “Các lệnh có chiều dài cố định” – Tất cả các lệnh đều có kích thước 4 byte – Mạch xử lý đơn giản hơn ⇒ Tốc độ xử lý nhanh hơn – Lệnh nhảy: bội số của 4 byte • x86: “Các lệnh có chiều dài thay đổi” – Lệnh có kích thước thay đổi từ 1 byte tới 16 byte ⇒ Kích thước mã nguồn có thể nhỏ hơn (30% ?) – Sử dụng bộ nhớ cache hiệu quả hơn – Lệnh có thể có hằng số 8 bit hoặc 32 bit 27
  • 28. Cú pháp lệnh hợp ngữ x86-32bit • Hợp ngữ trên x86 có 2 cú pháp chính – Cú pháp Intel – Cú pháp AT&T • <Tên lệnh> <toán hạng đích>, <toán hạng nguồn> ; Ghi chú • Các loại toán hạng – Thanh ghi: EAX, AX, AL,… – Ô nhớ: [EBX], [EBX+ESI+7], biến, … – Hằng số: 5, -24, 3Fh, 10001101b… • Ví dụ mov EAX, 2000 ; gán thanh ghi EAX = 2000 28
  • 29. Các lệnh tính toán, tương tác bộ nhớ • add… • sub… • nd…,or…, xor… • nor • sll, srl, sra • lw • sw • lb • lh • add/addi • lui • x • add • sub • and, or, xor • not • sal, shr, sar • mov reg, mem • mov mem, reg • BYTE PTR • WORD PTR • mov reg, reg/imm • x • lea lea esi, -4000000(ebp) # esi = ebp - 4000000
  • 30. 30 Ví dụ section .data a DW 4321h DW 8765h b DW 0FFFFh DW 0 section .code ; perform b = b + a MOV AX, a MOV BX, a+2 ADD b, AX ; 4320h with CF=1 ADC b+2,BX ; 8766h ; perform b = b + BX:AX MOV AX, 5320h MOV BX, 0 SUB b, AX ; F000h with CF=1 SBB b+2, BX ; 8765h MOV CX, 128 ; perform DX:AX = AX * CX MOV AX, 0F000h ; 61440 dec MUL CX ; DX:AX = 0078:0000 ; (7864320=61440*128) MOV AX, 0F000h ; -4096 dec IMUL CX ; DX:AX = FFF8:0000 ; (-524288=-4096*128) ; perform AX = DX:AX / CX MOV AX, 0F000h ; 61440 dec DIV CX ; AX = 01E0h MOV AX, 0F000h ; -4096 dec ??? IDIV CX ; AX = ? MOV AX, 0F000h ; -4096 dec CWD IDIV CX ; AX = FFE0h = -32 NEG AX ; 0020h = 32
  • 31. 31 Ví dụ section .code MOV AL, 36h AND AL, 0Fh ; AL = 06h ; AL = 00000110b AND AL, 00000010b ; AL = 00000010b = 02h OR AL, 30h ; AL = 32h XOR AL, AL ; AL = 0 NOT AL ; AL = FFh MOV AX, 1234h MOV CL, 4 SHR AX, CL ; 0123h SHL AX, CL ; 1230h MOV AL, -4 ; -4 = FCh = 11111100 SAR AL, 1 ; -2 = FEh = 11111110 MOV AL, -4 ; -4 = FCh = 11111100 SHR AL, 1 ; 126 = 7Eh = 01111110 MOV AL, 10101010b ; AAh ROL AL, 1 ; 01010101 = 55h MOV AL, 10101010b STC ; CF = 1 RCR AL, 1 ; 11010101 = D5h CF = 0
  • 32. 32 Nhảy & lặp • JMP • J<cc> – Nhảy theo cờ với kết quả không dấu • JA(JNBE), JB(JNAE), JE(JZ), JNA(JBE), JNB(JAE), JNE(JNZ) – Nhảy theo cờ với kết quả có dấu • JG(JNLE), JL(JNGE), JE(JZ), JNG(JLE), JNL(JGE), JNE(JNZ) – Nhảy theo trị của một cờ • JC, JZ(JE), JS, JO, JNC, JNZ(JNE), JNS, JNO • JCXZ • LOOP • LOOPE / LOOPNE, LOOPZ / LOOPNZ
  • 33. • So sánh các thanh ghi và thực hiện nhảy dựa vào kết quả so sánh – beq – bne – slt; beq – slt; bne • Thực hiện nhảy dựa vào giá trị các cờ S, Z, C, O,… Thường sử dụng lệnh cmp trước các lệnh nhảy để thay đổi giá trị các cờ – (cmp;) je – (cmp;) jne – (cmp;) jlt – (cmp;) jge 33 So sánh lệnh nhảy trong MIPS và x86-32bit
  • 34. 34 Rẽ nhánh (1/4) Trong ngôn ngữ C If (AX==0) AX = AX + 1; BX = AX; If (AX<0) AX = AX + 1; Else AX = AX – 1; BX = AX; Trong ASM (C2) CMP AX, 0 JNE TIEP INC AX TIEP: MOV BX, AX CMP AX, 0 JNL LONHON INC AX JMP TIEP LONHON: DEC AX TIEP: MOV BX, AX Trong ASM (C1) CMP AX, 0 JE CONG JMP TIEP CONG: INC AX TIEP: MOV BX, AX CMP AX, 0 JL NHOHON DEC AX JMP TIEP NHOHON: INC AX TIEP: MOV BX, AX
  • 35. 35 Rẽ nhánh (2/4) Trong ngôn ngữ C If (AL==‘S’) printf (“Chao buoi sang”); else if (AL==‘T’) printf (“Chao buoi trua”); else if (AL==‘C’) printf (“Chao buoi chiều”); Trong ASM (C1) CMP AL, 'S' JE CHAO_BUOI_SANG CMP AL, 'T' JE CHAO_BUOI_TRUA CMP AL, 'C' JE CHAO_BUOI_CHIEU JMP THOAT CHAO_BUOI_SANG: ; xuất thông báo ; “Chao buoi sang” ; JMP THOAT CHAO_BUOI_TRUA: ; xuất thông báo ; “Chao buoi trua” ; JMP THOAT CHAO_BUOI_CHIEU: ; xuất thông báo ; “Chao buoi chieu” ; THOAT: Trong ASM (C2) CMP AL, 'S' JNE KP_SANG ; xuất thông báo ; “Chao buoi sang” ; JMP THOAT KP_SANG: CMP AL, 'T' JNE KP_TRUA ; xuất thông báo ; “Chao buoi trua” ; JMP THOAT KP_TRUA: CMP AL, 'C' JNE THOAT ; xuất thông báo ; “Chao buoi chieu” ; THOAT:
  • 36. 36 Rẽ nhánh (3/4) Trong ngôn ngữ C If (AL>=‘a’ and AL<=‘z’) AX = AX + 1; else AX = AX – 1; BX = AX; Trong ASM (C2) CMP AL, ‘a’ JB KPTHUONG CMP AL, ‘z’ JA KPTHUONG INC AX JMP TIEP KPTHUONG: DEC AX TIEP: MOV BX, AX Trong ASM (C3) CMP AL, ‘a’ JB KPTHUONG CMP AL, ‘z’ JBE THUONG KPTHUONG: DEC AX JMP TIEP THUONG: INC AX TIEP: MOV BX, AX SAI Trong ASM (C1) CMP AL, ‘a’ JAE THUONG CMP AL, ‘z’ JBE THUONG DEC AX JMP TIEP THUONG: INC AX TIEP: MOV BX, AX
  • 37. 37 Rẽ nhánh (3/4) Trong ngôn ngữ C If (AL>=‘a’ and AL<=‘z’) AX = AX + 1; else AX = AX – 1; BX = AX; Trong ASM (C2) CMP AL, ‘a’ JB KPTHUONG CMP AL, ‘z’ JA KPTHUONG INC AX JMP TIEP KPTHUONG: DEC AX TIEP: MOV BX, AX Trong ASM (C3) CMP AL, ‘a’ JB KPTHUONG CMP AL, ‘z’ JBE THUONG KPTHUONG: DEC AX JMP TIEP THUONG: INC AX TIEP: MOV BX, AX Trong ASM (C1) CMP AL, 'a' JAE CTTHUONG DEC AX JMP TIEP CTTHUONG: CMP AL, 'z' JBE THUONG DEC AX JMP TIEP THUONG: INC AX TIEP: MOV BX, AX
  • 38. SAI 38 Rẽ nhánh (4/4) Trong ngôn ngữ C If (AL>=‘A’ and AL<=‘Z’) printf (“La ky tu hoa”); else if (AL>=‘0’ and AL<=‘9’) printf (“La ky tu so”); else printf (“La ky tu khac”); Trong ASM (C2) CMP AL, ‘A' JB XETSO CMP AL, ‘Z' JA KHAC ; xuất thông báo ; “La ky tu hoa” ; JMP THOAT XETSO: CMP AL, ‘0' JB KHAC CMP AL, ‘9' JA KHAC ; xuất thông báo ; “La ky tu so” ; JMP THOAT KHAC: ; xuất thông báo ; “La ky tu khac” ; THOAT: Trong ASM (C1) CMP AL, 'A' JAE LAHOA CMP AL, 'Z' JBE LAHOA CMP AL, '0' JAE LASO CMP AL, '9' JBE LASO KHAC: ; xuất thông báo ; “La ky tu khac” ; JMP THOAT LAHOA: ; xuất thông báo ; “La ky tu hoa” ; JMP THOAT LASO: ; xuất thông báo ; “La ky tu so” ; THOAT: Trong ASM (C3) CMP AL, '0' JB KHAC CMP AL, '9' JBE LASO CMP AL, 'A' JB KHAC CMP AL, 'Z' JBE LAHOA KHAC: ; xuất thông báo ; “La ky tu khac” ; JMP THOAT LASO: ; xuất thông báo ; “La ky tu so” ; JMP THOAT LAHOA: ; xuất thông báo ; “La ky tu hoa” ; THOAT:
  • 39. SAI 39 Rẽ nhánh (4/4) Trong ngôn ngữ C If (AL>=‘A’ and AL<=‘Z’) printf (“La ky tu hoa”); else if (AL>=‘0’ and AL<=‘9’) printf (“La ky tu so”); else printf (“La ky tu khac”); Trong ASM (C2) CMP AL, ‘A' JB XETSO CMP AL, ‘Z' JA KHAC ; xuất thông báo ; “La ky tu hoa” ; JMP THOAT XETSO: CMP AL, ‘0' JB KHAC CMP AL, ‘9' JA KHAC ; xuất thông báo ; “La ky tu so” ; JMP THOAT KHAC: ; xuất thông báo ; “La ky tu khac” ; THOAT: Trong ASM (C3) CMP AL, '0' JB KHAC CMP AL, '9' JBE LASO CMP AL, 'A' JB KHAC CMP AL, 'Z' JBE LAHOA KHAC: ; xuất thông báo ; “La ky tu khac” ; JMP THOAT LASO: ; xuất thông báo ; “La ky tu so” ; JMP THOAT LAHOA: ; xuất thông báo ; “La ky tu hoa” ; THOAT: Trong ASM (C1) CMP AL, 'A' JAE CTLAHOA JMP KHAC CTLAHOA: CMP AL, 'Z' JBE LAHOA CMP AL, '0' JAE CTLASO JMP KHAC CTLASO: CMP AL, '9' JBE LASO JMP KHAC LAHOA: ; xuất thông báo ; “La ky tu hoa” ; JMP THOAT LASO: ; xuất thông báo ; “La ky tu so” ; JMP THOAT KHAC: ; xuất thông báo ; “La ky tu khac” ; JMP THOAT THOAT:
  • 40. 40 Rẽ nhánh (4/4) Trong ngôn ngữ C If (AL>=‘A’ and AL<=‘Z’) printf (“La ky tu hoa”); else if (AL>=‘0’ and AL<=‘9’) printf (“La ky tu so”); else printf (“La ky tu khac”); Trong ASM (C2) CMP AL, ‘A' JB XETSO CMP AL, ‘Z' JA KHAC ; xuất thông báo ; “La ky tu hoa” ; JMP THOAT XETSO: CMP AL, ‘0' JB KHAC CMP AL, ‘9' JA KHAC ; xuất thông báo ; “La ky tu so” ; JMP THOAT KHAC: ; xuất thông báo ; “La ky tu khac” ; THOAT: Trong ASM (C3) CMP AL, '0' JB KHAC CMP AL, '9' JBE LASO CMP AL, 'A' JB KHAC CMP AL, 'Z' JBE LAHOA KHAC: ; xuất thông báo ; “La ky tu khac” ; JMP THOAT LASO: ; xuất thông báo ; “La ky tu so” ; JMP THOAT LAHOA: ; xuất thông báo ; “La ky tu hoa” ; THOAT: Trong ASM (C1) CMP AL, '0' JAE CTLASO JMP KHAC CTLASO: CMP AL, '9' JBE LASO CMP AL, 'A' JAE CTLAHOA JMP KHAC CTLAHOA: CMP AL, 'Z' JBE LAHOA JMP KHAC LASO: ; xuất thông báo ; “La ky tu so” ; JMP THOAT LAHOA: ; xuất thông báo ; “La ky tu hoa” ; JMP THOAT KHAC: ; xuất thông báo ; “La ky tu khac” ; JMP THOAT THOAT:
  • 41. 41 Một vài lưu ý về rẽ nhánh • Thường dùng cách (2) hoặc cách (3) để thực hiện rẽ nhánh – Cách (3) dễ hiểu đối với người đọc – Cách (2) hơi khó hiểu hơn nhưng ánh xạ tương ứng với mã ngôn ngữ C • Cách (1) ít được sử dụng – Chỉ nên sử dụng trong trường hợp so sánh bằng – Khi điều kiện so sách phức tạp thì việc quản lý rẽ nhánh sẽ trở nên rất phức tạp và khó kiểm soát • … … JMP TEST ß THỪA J<cc> TEST ß SAI TEST: TEST: … …
  • 42. 42 Cách diễn đạt (1/2) mov ax, bl ??? s db 12h, 34h, 56h, 78h, 90h mov al, s[0] mov s[1], ax mov s[3], 5 lea si, s mov al, [si] mov [si+1], ax mov [si+3], 5 s dw 0123h, 0456h, 0789h ??? mov al, bl hoặc mov al, bl cbw mov ah, 0 ; al = 12 ; lỗi à mov word ptr s[1], ax ; s = 12, 12, 00, 05, 90 ; al = 12 ; s = 12, 12, 00, 78, 90 ; lỗi à mov byte ptr [si+3], 5 ; s = 12, 12, 00, 05, 90
  • 43. 43 Cách diễn đạt (2/2) Trong ngôn ngữ C a = b; x = y*z; Trong ASM: mov AX, b mov a, AX mov AX, y imul z mov x, AX Tại sao không có imul z,x,y ? mov a,b ?
  • 44. 44 Ngăn xếp (Stack) • Ngăn xếp là một vùng nhớ – Hoạt động theo cơ chế LIFO (Last In First Out) – Được sử dụng theo chiều giảm của địa chỉ (khác với các vùng nhớ thông thường được sử dụng theo chiều tăng của địa chỉ) • Cặp thanh ghi SS:ESP chứa địa chỉ segment:offset của của đỉnh ngăn xếp • Lệnh PUSH <toán hạng> – Toán hạng có thể là thanh ghi/vùng nhớ/hằng số 4 byte – Giảm ESP đi 4 – Đưa giá trị của toán hạng vào ô nhớ có địa chỉ SS:ESP. • Lệnh POP <toán hạng> – Toán hạng có thể là thanh ghi/vùng nhớ 4 byte – Đưa giá trị từ ô nhớ có địa chỉ SS:ESP vào toán hạng – Tăng ESP lên 4
  • 45. 45 Ví dụ lệnh PUSH EAX có giá trị 3412h Trước thao tác PUSH EAX Sau thao tác PUSH EAX
  • 46. 46 Ví dụ lệnh POP 04h 03h SS:0000h SS:00F7h ….. SS:00F8h ESP = 00FDh SS:00F6h ….. SS:00F5h SS:00F9h 01h 01h 02h SS:00FAh SS:00FBh SS:00FCh SS:00FDh Trước thao tác POP EBX Sau thao tác POP EBX EBX có giá trị 01020304h
  • 47. 47 Thủ tục (Procedure) • Lệnh CALL <Tên thủ tục> – Sử dụng stack để lưu trữ (PUSH) địa chỉ của lệnh tiếp ngay sau lệnh CALL (nơi cần quay lại) – Ghi vào thanh ghi con trỏ lệnh EIP địa chỉ của lệnh đầu tiên của chương trình con. • Khai báo thủ tục • Lệnh RET – Lấy (POP) giá trị từ đỉnh ngăn xếp và ghi vào thanh ghi con trỏ lệnh EIP, làm cho lệnh tiếp theo được thực hiện chính là lệnh ngay sau lệnh CALL. <Tên thủ tục> PROC . . ret <Tên thủ tục> ENDP sample PROC . . ret sample ENDP
  • 48. 48 Ví dụ gọi thủ tục
  • 49. 49 Diễn giải lời gọi thủ tục ToUpper thứ 1 Trước CALL Sau CALL Sau RET
  • 50. 50 Diễn giải lời gọi thủ tục ToUpper thứ 2 0Bh 00h 00h 00h01FFh 0200h 01FEh 01FDh 01FCh ……. Stack segment 0010hEIP 0200hESP 13h 00h 00h 00h01FFh 0200h 01FEh 01FDh 01FCh ……. Stack segment 0045hEIP 01FChESP 13h 00h 00h 00h01FFh 0200h 01FEh 01FDh 01FCh ……. Stack segment 0013hEIP 0200hESP ESP ESP ESP Trước CALL Sau CALL Sau RET
  • 51. 51 Ví dụ gọi thủ tục lồng nhau
  • 52. 52 Diễn giải gọi thủ tục lồng nhau Trước CALL Upcase Sau CALL Upcase Sau CALL ToUpper Sau RET ToUpper Sau CALL Upcase
  • 53. 53 Một số lưu ý về sử dụng Thủ tục khi lập trình hợp ngữ x86 • Khai báo thủ tục sau lời gọi thủ tục thoát • Không nên có lệnh nhảy ra ngoài thủ tục • Lời gọi thủ tục thao tác với ngăn xếp một cách không tường minh • Nếu trong thân thủ tục có thao tác với ngăn xếp, nhớ lưu lại địa chỉ trả về của thủ tục • Truyền tham số cho thủ tục – Thanh ghi – Biến toàn cục – Ngăn xếp