Bài giảng Kỹ thuật vi xử lý - Chương 3: Vi xử lý 8088-Intel

Tóm tắt Bài giảng Kỹ thuật vi xử lý - Chương 3: Vi xử lý 8088-Intel: ...34h] Base Rel Plus Index DISP16 C7 81 34 12 78 56Move immediate value 5678h to memory location BX + DI + 1234h MOV word [BX + DI + 1234h], 5678h Base Rel Plus Index Mã máy Một lệnh có thể dài từ1 đến 6 byte • Byte 1 gồm: – Opcode (6 bit) xác định phép toán cần thực hiện – Bit D xác định...ro – result is 0 • Sign – result is negative • Overflow – signed overflow occurred during add or subtract (Signed) Overflow • Can only occur when adding numbers of the same sign (subtracting with different signs) • Detected when carry into MSB is not equal to carry out of MSB – Easi... – Có gần 40 menmonic khác nhau • Các lệnh nhảy điều kiện đơn: phụ thuộc vào giá trị của 1 cờ. • JNZ/JNE - Nhảy nếu cờ ZF = 0, nghĩa là kết quả của phép toán trước đó khác không • JC - Nhảy nếu CF = 1, nghĩa là câu lệnh trước đó lập cờ carry • JZ/JE • JNC Các lệnh nhảy có điều kiện • T...

pdf122 trang | Chia sẻ: havih72 | Lượt xem: 101 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Kỹ thuật vi xử lý - Chương 3: Vi xử lý 8088-Intel, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
0 and R/M=101 modes is 
[DI+2233h]
Example
• Instruction 8A15h
• 1000 1010 0001 0101
• Opcode 100010 -> MOV 
• D=1, data flows from R/M to REG
• W=0, 8-bit argument
• MOD=00 (no displacement)
• REG=010 (DL)
• REG=101 ([DI] addressing mode)
• MOV DL, [DI]
Code W=0 W=1 W=1
000 AL AX EAX
001 CL CX ECX
010 DL DX EDX
011 BL BX EBX
100 AH SP ESP
101 CH BP EBP
110 DH SI ESI
111 BH DI EDI
R/M Code Function
000 DS:BX+SI
001 DS:BX+DI
010 SS:BP+SI
011 SS:BP+DI
100 DS:SI
101 DS:DI
110 SS:BP
111 DS:BX
Direct Addressing Mode
• MOD is always 00
• R/M is always 110
• REG encodes the register to/from we take 
data as usual
• Third byte contains the lower-order bytes 
of the displacement, fourth byte contains the 
high order byte of the displacement
Direct Addressing
• Example: 8816 00 10
• 1000 1000 0001 0110 0000 0000 0001 0000
• Opcode 100010 -> MOV
• W=0 (byte-sized data)
• D=0 data flows from REG
• MOD 00, REG=010 (DL), R/M=110
• Low-order byte of displacement 00
• High-order byte of displacement 10
• MOV [1000h], DL
Code W=0 W=1 W=1
000 AL AX EAX
001 CL CX ECX
010 DL DX EDX
011 BL BX EBX
100 AH SP ESP
101 CH BP EBP
110 DH SI ESI
111 BH DI EDI
Segment MOV instructions
• Different opcode 100011
• Segments are selected by setting the REG 
field
REG Code Segment reg.
000 ES
001 CS
010 SS
011 DS
100 FS
101 GS
Example MOV BX, CS
Opcode 10001100
MOD=11 (register addressing)
REG=001 (CS)
R/M=011 (BX)
8CCB
Mã máy
REG xác định thanh ghi cho toán hạng thứ nhất
Mã máy
MOD và R/M cùng nhau xác định toán hạng thứ hai
Mã máy
MOD và R/M cùng nhau xác định toán hạng thứ hai
Ví dụ
Mã hoá lệnh MOV BL,AL
• Opcode đối với MOV là 100010
• Ta mã hoá AL sao cho AL là toán hạng nguồn:
– D = 0 (AL là toán hạng nguồn)
• W bit = 0 (8-bit)
• MOD = 11 (register mode)
• REG = 000 (mã của AL)
• R/M = 011 (mã của BL)
Kết quả:: 10001000 11000011 = 88 C3
Nhóm lệnh Số học
• Bên cạnh tác dụng, cần chú ý đến ảnh hưởng của 
lệnh đối với các cờ trạng thái
• Các lệnh số học th/thường: ADD, SUB, 
• Các lệnh số học khác: CMP. NEG, INC, DEC, 
• Ảnh hưởng đến các cờ trạng thái
– CF 
– OF Phụ thuộc vào quá trình thực hiện phép toán
– AF
– ZF = 1 nếu Kết quả bằng 0
– SF = 1 nếu MSB của Kết quả = 1
– PF = 1 nếu byte thấp của kết quả có Parity chẳn
Arithmetic Instructions - ADD
Khuôn dạng: ADD Đích,Nguồn
- Tác dụng: (Đích) Å (Đích)+(Nguồn)
- Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp
nhau)
- Nguồn: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL 
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp 
nhau)
3. Một giá trị cụ thể
Ảnh hưởng của ADD
– ZF = 1 nếu Kết quả bằng 0
– SF = 1 nếu MSB của Kết quả = 1
– PF = 1 nếu byte thấp của kết quả có Parity chẳn
• CF được lập nếu tràn không dấu (có nhớ từ
MSB)
• OF được lập nếu tràn có dấu:
- Có nhớ từ MSB, Không có nhớ vào MSB
- Có nhớ vào MSB, Không có nhớ từ MSB
• AF được lập nếu có nhớ từ nibble thấp vào 
nibble cao (từ bit 3 vào bit 4)
Các cờ trên thanh ghi cờ
• Các bit nhất định trên thanh ghi cờ điều 
khiển hoạt động hoặc phản ánh trạng thái 
của vi xử lý
– Các cờ điều khiển (TF, IF, DF)
• Quyết định cách đáp ứng của vi xử lý trong các tình 
huống nhất định
– Các cở trạng thái (CF, PF, AF, ZF, SF, OF)
• Bị ảnh hưởng bởi các phép toán nhất định
• Phục vụ cho các lệnh có điều kiện
Các cờ điều khiển
• DF - Direction flag (Cờ hướng)
– DF = 1: huớng xuống
– DF = 0: hướng lên
• IF – Interrupt flag (Cờ ngắt)
– IF = 1: cho phép ngắt ngoài
– IF = 0: cấm ngắt ngoài (đối với ngắt che được)
• TF - Trace flag
– TF = 1: vi xử lý thực hiện từng lệnh một
Các cờ trạng thái
• Carry
– carry or borrow at 
MSB in add or subtract
– last bit shifted out
• Parity
– low byte of result has 
even parity
• Auxiliary
– carry or borrow at bit 3
• Zero
– result is 0
• Sign
– result is negative
• Overflow
– signed overflow 
occurred during add or 
subtract
(Signed) Overflow
• Can only occur when adding numbers of the 
same sign (subtracting with different signs)
• Detected when carry into MSB is not equal 
to carry out of MSB
– Easily detected because this implies the result 
has a different sign than the sign of the 
operands
• Programs can ignore the Flags!
Signed Overflow Example
10010110
+ 10100011
00111001
Carry in = 0, Carry out = 1
Neg+Neg=Pos
Signed overflow occurred
OF = 1 (set)
00110110
+ 01100011
10011001
Carry in = 1, Carry out = 0
Pos+Pos=Neg
Signed overflow occurred
OF = 1 (set)
Examples of No Signed 
Overflow
10010110
+ 01100011
11111001
Carry in = 0, Carry out = 0
Neg+Pos=Neg
No Signed overflow occurred
OF = 0 (clear)
10010110
+ 11110011
10001001
Carry in = 1, Carry out = 1
Neg+Neg=Neg
No Signed overflow occurred
OF = 0 (clear)
Unsigned Overflow
• The carry flag is used 
to indicate if an 
unsigned operation 
overflowed
• The processor only 
adds or subtracts - it 
does not care if the 
data is signed or 
unsigned!
10010110
+ 11110011
10001001
Carry out = 1
Unsigned overflow occurred
CF = 1 (set)
DEBUG's Register Display
-R
000 SP=0010 BP=0000 SI=0000 DI=0000
00F IP=004F NV UP DI PL NZ NA PO NC
• The state of the Flags are shown in line 2
• OV/NV: (no)oVerflow DN/UP: direction
• EI/DI: En(Dis)abled Interrupts
• NG/PL: sign ZR/NZ: (not)Zero
• AC/NA: (no)Auxiliary PE/PO: Even/Odd
• CY/NC: (no)Carry (set/clear)
Arithmetic Instructions - SUB
Khuôn dạng: SUB Đích,Nguồn
- Tác dụng: (Đích) Å (Đích)-(Nguồn)
- Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp
nhau)
- Nguồn: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL 
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp 
nhau)
3. Một giá trị cụ thể
Ảnh hưởng của SUB
– ZF = 1 nếu Kết quả bằng 0
– SF = 1 nếu MSB của Kết quả = 1
– PF = 1 nếu byte thấp của kết quả có Parity chẳn
• CF được lập nếu tràn không dấu (có mượn vào
MSB)
• OF được lập nếu tràn có dấu:
- Có mượn từ MSB, Không có mượn từMSB
- Có mượn từMSB, Không có mượn vào MSB
• AF được lập nếu có mượn từ nibble cao vào 
nibble thấp (từ bit 4 vào bit 3)
Arithmetic Instructions - CMP
Khuôn dạng: CMP Đích,Nguồn
- Tác dụng: (Đích)-(Nguồn)
- Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp
nhau)
- Nguồn: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL 
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp 
nhau)
3. Một giá trị cụ thể
Arithmetic Instructions – INC, DEC, NEG
• INC T/h
• Trong đó: T/h có thể là các thanh ghi hoặc vị trí nhớ
• Tác dụng: (T/h) Å (T/h)+1
• DEC T/h
• Trong đó: T/h có thể là các thanh ghi hoặc vị trí nhớ
• Tác dụng: (T/h) Å (T/h)-1
• Lưu ý: Các lệnh INC và DEC không ảnh hưởng đến cờ CF
• Lệnh NEG T/h: Đảo dấu của T/h (Lấy bù 2)
• Lệnh NEG sẽ lập cờ OF nếu giá trị của T/h là giá trị âm 
nhất trong dải giá trị của các số có dấu tương ứng
Nhóm lệnh Logic
• Cần chú ý đến ảnh hưởng của lệnh đối với các cờ 
trạng thái
• Các lệnh logic th/thường: NOT, AND, OR, XOR
NOT A: ~A
AND A,B: A &= B
OR A,B : A |= B
XOR A,B: A ^= B
• NOT không ảnh huởng đến các cờ trạng thái.
• Các lệnh khác:
– CF = 0
– OF = 0
– ZF = 1 nếu Kết quả bằng 0
– SF = 1 nếu MSB của Kết quả = 1
– PF = 1 nếu byte thấp của kết quả có Parity chẳn
– AF không xác định
Một số ví dụ
1100 1010
NOT AL
AL
0011 0101AL
AL
BL
0011 0101
0110 1101
AND AL, BL
0010 0101AL
AL
BL
0011 0101
0110 1101
OR AL, BL
0111 1101AL
AL
BL
0011 0101
0110 1101
XOR AL, BL
0101 1000AL
AL
BL
0011 0101
0000 1111
AND AL, BL
0000 0101AL
AL
BL
0011 0101
0000 1111
OR AL, BL
0011 1111AL
Một số ứng dụng
• Bài toán Xoá bit: Xoá một bit nào đó của 
một toán hạng mà không làm ảnh hưởng đến 
các bit còn lại của toán hạng đó
• Bài toán Kiểm tra bit: Xác định một bit nào 
đó của một toán hạng là bằng 0 hay 1 (thông
qua giá trị của một cờ trạng thái)
• Bài toán Lập bit: Lập một bit nào đó của 
một toán hạng mà không làm ảnh hưởng đến 
các bit còn lại của toán hạng đó
Nhóm lệnh logic
• Các lệnh logic khác: Lệnh TEST, Các lệnh dịch 
(Shift) và Các lệnh quay (Rotate)
• Lệnh TEST chỉ khác lệnh AND là không giữ lại 
kết quả của phép toán
• Các lệnh dịch và Các lệnh quay đều có hai khuôn 
dạng:
Khuôn dạng 1: Mnemonic Toán hạng,1
Khuôn dạng 2: Mnemonic Toán hạng,CL
• Tác dụng của một câu lệnh theo khuôn dang 2 
giống như tác dụng liên tiếp của N câu lệnh tương 
ứng theo khuôn dạng 1, với N là giá trị của thanh 
ghi CL 
Các lệnh Dịch trái: SHL, SAL
0
RegisterCF
Shift right SHR
Register CF
0
Shift right SAR
Register CF
Rotate through Carry L/R
(Quay trái/phải thông qua carry)
RCL
RCR
Rotate left/right 
(Quay trái/phải không qua carry)
ROL
ROR
Nhóm lệnh rẽ nhánh
• Làm thay đổi trật tự thực hiện lệnh bình thường 
của vi xử lý
• Lệnh nhảy không điều kiện: JMP
• Các lệnh nhảy có điều kiện: Jxxx
• Lệnh lặp: LOOP và các biến thể của nó
• Các lệnh có liên quan đến Chương trình con:
- CALL (gọi chương trình con)
- RET (trở về chương trình gọi)
• Các lệnh có liên quan đến Chương trình con phục vụ ngắt
- INT (gọi chương trình con phục vụ ngắt - Gọi ngắt)
- IRET (quay về chương trình gọi ngắt)
Lệnh nhảy không điều kiện
• JMP nhãn
– Nhảy gần: E9 xx xx (3 byte)
– Nhảy ngắn: EB xx (2 byte)
– Nhảy xa: EA xx xx xx xx (5 byte)
• Nhãn: tên do ngườI lập trình tự đặt ra theo qui tắc đặt tên 
của Assembler và có thể đặt vào trước một câu lệnh bất kỳ 
trong chương trình cùng với dấu :
nhãn: Câu lệnh cần thực hiện
• Nhãn sẽ được dịch thành địa chỉ
• Khoảng cách nhảy: Khoảng cách đại số (có dấu) từ lệnh 
nhảy đến lệnh cần thực hiện
Cơ chế thực hiện lệnh nhảy
• Các lệnh nhảy ngắn và gần chỉ làm thay đổi 
giá trị của thanh ghi IP
– Lệnh nhảy ngắn cộng khoảng cách nhảy 8-bit có dấu
vào giá trị hiện thời của IP
– Lệnh nhảy gần cộng khoảng cách nhảy 16-bit có dấu
vào giá trị hiện thời của IP
• Lệnh nhảy xa làm thay đổi cả CS và IP
– Gán cho CS và IP các giá trị mới
Mã máy của lệnh nhảy
1106:0100 EB2A JMP 012C
• 012C-0102=002A
1106:0102 EBFC JMP 0100
• 0100-0104=FFFC
1106:0104 E97F00 JMP 0186
• 0186-0106=0080 (too far for short!)
• 0186-0107=007F
1106:0107 E9F5FE JMP FFFF
• FFFF-010A=FEF5
Các lệnh nhảy có điều kiện
• Jxxx nhãn
– Có gần 40 menmonic khác nhau
• Các lệnh nhảy điều kiện đơn: phụ thuộc vào giá trị 
của 1 cờ.
• JNZ/JNE - Nhảy nếu cờ ZF = 0, nghĩa là kết quả 
của phép toán trước đó khác không
• JC - Nhảy nếu CF = 1, nghĩa là câu lệnh trước đó 
lập cờ carry
• JZ/JE
• JNC
Các lệnh nhảy có điều kiện
• Tất cả các lệnh nhảy có điều kiện phải là nhảy 
ngắn
– khoảng cách nhảy: -128 to +127 bytes
• Tổ hợp với lệnh nhảy không điều kiện để có thể 
vượt qua giới hạn này.
• Các lệnh nhảy điều kiện kép: phụ thuộc vào giá 
trị của nhiều cờ
• JB/JNAE
• JNL/JGE
ứng dụng của các lệnh nhảy có điều kiện
• Kết hợp với JMP để xây dựng các cấu trúc lập 
trình cơ bản:
- Cấu trúc điều kiện
- Cấu trúc lặp
• Các lệnh nhảy thường theo sau các lệnh làm thay 
đổi giá trị của các cờ trạng thái:
– CMP 
– TEST 
Cấu trúc điều kiện
mov ax,n
cmp ax,7
jz nhan1
lệnh 1
jmp nhan2 
nhan1:lệnh 2
nhan2:lệnh 3
Cấu trúc lặp
mov ax,n
nhan1: cmp ax,0
jz nhan2
lệnhi
sub ax,2
jmp nhan1
nhan2: lệnhk 
Cấu trúc điều kiện - AND
char n; int w,x;
if (n>='A' && w==x)
whatever();
;if(n>='A'&&w==x)
mov ah,n
cmp ah,'A'
jl nogo
mov ax,w
cmp ax,x
jne no_go
;then-part
call whatever
nogo:
Cấu trúc điều kiện - OR
char n,k; unsigned int w;
if (nk || w<=10)
whatever();
;if(nk||w<=10)
mov ah,n
cmp ah,k
jne then_
cmp w,10
ja end_if
then_:
call whatever
end_if:
Lệnh LOOP
• LOOP nhan
– Giảm CX đi 1
– Nếu (CX) 0 thì
JMP nhan. Nếu không 
thì tiếp tục thực hiện 
lệnh theo trật tự bình 
thường
mov cx,9
nhan: lệnh 1
lệnh 2
lệnh 3 
loop nhan
LOOPZ/E và LOOPNZ/E
• Các biến thể của
LOOP
• Giá trị của cờ ZF có 
thể làm kết thúc sớm 
vòng lặp
• Loop while ZF/equal 
&& CX!=0
• Loop while (NZ/ not 
equal) && CX!=0
• Lưu ý: LOOP giảm
CX nhưng không ảnh 
huởng đến các cờ
• LOOPZ == LOOPE
• LOOPNZ==LOOPNE
• Các lệnh trong vòng 
lặp có thể tác động đến 
cờ ZF (CMP ?) 
Chương trình con
• Chương trình con trong ngôn ngữ Assembly 
được gọi là Thủ tục (Procedure)
• Một thủ tục có thể được thực hiện nhiều lần
• Có liên quan đến stack:
- lưu giữ Địa chỉ quay về
- lưu giữ giá trị của các thanh ghi của vi xử 
lý
Stack ?
• Cấu trúc dữ liệu LIFO ở RWM
- PUSH : ghi dữ liệu vào stack, 
- POP: đọc dữ liệu từ stack 
• (SS:SP) trỏ đến đỉnh của stack
• (SS:BP) truy cập stack ngẫu nhiên (không
theo LIFO)
Stack Initialization
• The .stack directive hides an array 
allocation statement that looks like this
– The_Stack DB Stack_Size dup (?)
• On program load
– SS is set to a segment address containing this 
array (usually The_Stack starts at offset 0)
– SP is set to the offset of The_Stack+Stack_Size 
which is one byte past the end of the stack array
• This is the condition for an empty stack
Initial Stack Configuration
.stack 12 ;Reserve space for the stack
• Loader determines actual segment address 
for the start of the stack
– This is an empty stack
SP:000CSP:000CSS:0340SS:0340
Stack Size: 000C
How Does The Stack Work?
• The stack grows backwards through 
memory towards the start of the stack 
segment
• Push decrements stack pointer
Pop increments stack pointer
SP:0008SP:0008SS:0340SS:0340
Stack Size: 000C
PUSH
• PUSH nguồn
– Push nguồn vào stack
• PUSHF
– Push thanh ghi cờ vào stack
• Lệnh PUSH trước hết sẽ giảm SP đi 2 rồi 
lưu giá trị của nguồn vào vị trị nhớ được trỏ 
bởi (SS:SP)
Ví dụ PUSH
PUSH AX
3C 09 A4 40 2C FF A2 43 2A 09 46
SP:0008SP:0008
07 06 4C
SS:0340SS:0340
Stack Size: 000C
3C 09 A4 40 2C FF A2 23 2A 09 46
SP:0006SP:0006
01 06 4C
SS:0340SS:0340
AX: 0123AX: 0123
POP
• POP đích
– Pop dữ liệu từ đỉnh stack vào đích
• POPF
– Pop dữ liệu từ đỉnh stack vào thanh ghi cờ
• Lệnh POP trước hết copy dữ liệu được trỏ
bởi (SS:SP) đến đích rồi tăng SP lên 2
Ví dụ POP
POP ES
3C 09 A4 40 2C FF A2 23 2A 09 46
SP:0008SP:0008
01 06 4C
SS:0340SS:0340
3C 09 A4 40 2C FF A2 23 2A 09 46
SP:0006SP:0006
01 06 4C
SS:0340SS:0340
ES: 0123ES: 0123
Tràn stack!
• Stack Overflow
• Stack Underflow
SP:000DSP:000DSS:0340SS:0340
Stack Size: 000C
SP:FFFESP:FFFESS:0340SS:0340
Stack Size: 000C
Thủ tục
Tên_Thủ_tục PROC kiểu
;thân của thủ tục
RET ;quay về chuơng trình gọi
Tên_Thủ_tục ENDP
• kiểu là NEAR hoặc FAR
– ngầm định là NEAR
• Một thủ tục có thể có nhiều lệnh RET
Lệnh CALL và RET
• Gọi một thủ tục (NEAR)
CALL Tên_Thủ_tục
– push IP vào stack
– copy địa chỉ của Tên_Thủ_tục vào IP
• Trở về từ một thủ tục (NEAR)
RET
– pop giá trị ở đỉnh stack vào IP
Thủ tục Far
• Gọi thủ tục (FAR)
CALL Tên_thủ_tục
– lần lượt push CS và IP vào stack
– copy địa chỉ của Tên_thủ_tục vào CS và IP
• Trở về từ thủ tục (FAR)
RET
– pop giá trị từ đỉnh stack lần lượt vào IP và CS
Gọi ngắt
• Gọi ngắt là một lời gọi thủ tục đặc biêt
– FAR
– Thanh ghi cờ phải được bảo toàn
• INT Số ngắt
– Thanh ghi cờ được push, TF và IF bị xoá
– CS và rồI IP được push
– Địa chỉ của một chương trình con phục vụ ngắt (Vector 
ngắt) tương ứng với Số ngắt được copy vào CS và IP 
Trở về từ ngắt
• IRET
• Tác dụng của lênh:
– Giá trị ở đỉnh của stack được pop vào IP
– Giá trị ở đỉnh của stack được pop vào CS
– Giá trị ở đỉnh của stack được pop vào thanh ghi cờ
• Chương trình bị ngắt tiếp tục thực hiện dường như 
không có chuyện gì xảy ra
Xuất ký tự ra màn hình PC
• Ngắt 21h
– Ngắt này hỗ trợ rất nhiều dịch vụ trên PC
– Nhận dạng dịch vụ bằng số dịch vụ (số hàm). Số dịch 
vụ cần được nạp voà thanh ghi AH
– Tuỳ theo từng dịch vụ, có thể cần thêm một số đối số 
khác được nạp vào các thanh ghi xác định
• AH = 2, DL = Mã ASCII của ký tự cần xuất
– Ký tự được hiển thị tại vị trí hiện thờI của con trỏ
Xuất xâu ký tự ra màn hình PC
• Dịch vụ 09h của ngắt 21h
– DX = Địa chỉ Offset của xâu (trong đoạn dữ liệu)
– DS = Địa chỉ segment của xâu
– Xâu ký tự phải kết thúc bằng ký tự '$' 
• Để nạp địa chỉ offset của xâu vào DX, có thể:
– LEA DX, Tênxâu 
– MOV DX, OFFSET Tên xâu
Nhập 1 ký tự từ bàn phím PC
• Dịch vụ 01h của ngắt 21h
• Khi NSD gõ một ký tự từ bàn phím:
– Ký tự sẽ hiện trên màn hình 
– AL sẽ chứa mã ASCII của ký tự đó
• AL=0 nếu ký tự được nhập là ký tự điều khiển
Nhóm lệnh thao tác string
• Chúng ta hiểu: string là một mảng byte hoặc 
từ nằm trong bộ nhớ
• Các thao tác string:
– Sao chép
– Tìm kiếm
– Lưu trữ
– So sánh
Các đặc điểm
• Nguồn: (DS:SI), Đích: (ES:DI)
– DS, ES chứa Địa chỉ Segment của string
– SI, DI chứa Địa chỉ Offset của string
• Cờ hướng DF (0 = Up, 1 = Down)
– DF = 0 - Tăng địa chỉ (trái qua phải)
– DF = 1 - Giảm địa chỉ (phảI qua trái) 
Chuyển (Sao chép)
• MOVSB, MOVSW
– Chuyển 1 byte hoặc 1 word từ vị trí nhớ này 
sang vị trí nhớ khác
– Tác dụng của lệnh:
• Sao chép byte/word từ (DS:SI) đến (ES:DI)
• Tăng/Giảm SI và DI 1 hoặc 2 giá trị
– Nếu CX chứa một giá trị khác không:
• REP MOVSB hoặc REP MOVSW sẽ tự động sao 
chép (CX) lần và CX sẽ về không 
Ví dụ:Sao chép mảng
; Sao chép 10 byte từ mảng a sang mảng b, giả sử (DS) = (ES)
mov cx, 10 
mov di, offset b
mov si, offset a
cld ;xoá cờ DF
rep movsb
Ví dụ: Tịnh tiến các ô nhớ
mov cx, 7 
mov di, offset a+9
mov si, offset a+6
std ;lập cờ DF
rep movsb DI
a
SI
Ví dụ
pattern db "!@#*"
db 96 dup (?)
mov cx,96
mov si, offset pattern
mov di, offset pattern+4
cld
rep movsb
! @ # *
DI
a
SI
Lưu trữ string
STOSB, STOSW
• Copy AL hoặc AX 
vào một mảng byte 
hoặc word
– Đích (ES:DI)
• Tăng hoặc Giảm DI
– phụ thuộc DF
• Thường được sử dụng 
có tiền tố REP và số 
lần lặp trong CX
Ví dụ:
arr dw 200 dup (?)
mov ax,50A0h
mov di,offset arr
mov cx,200
cld
rep stosw
A050A050
arr
50A0AX
DI
Nạp String
• LODSB, LODSW
– Byte hoặc word tại (DS:SI) được copy vào AL 
hoặc AX
– SI tăng hoặc giảm 1 hoặc 2 giá trị phụ thuộc DF
• Thường được dùng với STOSx trong một 
vòng lặp để xử lý từng phần tử trong một 
mảng
Ví dụ:
mov di, offset b
mov si, offset a
mov cx,30
cld
lp:
lodsb
and al,0DFh
stosb
loop lp
Quét String
SCASB, SCASW
• So sánh AL hoặc AX với byte hoặc word 
tạI (ES:DI) và tự động tăng hoặc giảm DI
• Lệnh này ảnh hưởng đến các cờ trạng thái
– Tuỳ theo kết quả so sánh
– Dùng trong một vòng lặp REPs
• REPZ, REPE, REPNZ, REPNE
Ví dụ
arr db 'abcdefghijklmnopqrstuvwxyz'
mov di, offset arr
mov cx,26
cld
mov al,target
repne scasb
jne nomatch
So sánh String
CMPSB, CMPSW
• So sánh byte hoặc word tại (DS:SI) với byte 
hoặc word tạI (ES:DI), tác động đến các cờ 
và tăng hoặc giảm SI và DI
• Thường dùng để so sánh hai mảng với nhau
Ví dụ
mov si, offset str1
mov di, offset str2
cld
mov cx, 12
repe cmpsb 
jl str1smaller
jg str2smaller
;the strings are equal - so far
;if sizes different, shorter string is less
Nhóm lệnh hỗn hợp
- Các lệnh Lập/Xoá trực tiếp các cờ: 
STC, CLCSTD, CLDSTI, CLI
- Lệnh NOP (No Operation): Không làm gì!!!
- Lệnh NOP thường được dùng trong các vòng lặp tạo trễ (delay)bằng phần mềm
- Các lệnh Nhập/Xuất dữ liệu đối với các cổng I/OINOUT
Lệnh IN
- Nếu Địa chỉ của cổng Nhỏ hơn hoặc bằng FFh: 
IN Acc, Địa chỉ cổng
- Trong đó: Acc có thể là AL hoặc AX
- Nhập dữ liệu từ cổng vào Acc
- Nếu Địa chỉ của cổng Lớn hơn FFh: 
MOV DX, Địa chỉ cổngIN Acc, DX
- Trong đó: Acc có thể là AL hoặc AX
- Nhập dữ liệu từ cổng vào Acc
Lệnh OUT
- Nếu Địa chỉ của cổng Nhỏ hơn hoặc bằng FFh: 
OUT Địa chỉ cổng, Acc
- Trong đó: Acc có thể là AL hoặc AX
- Xuất dữ liệu từ Acc ra cổng
- Nếu Địa chỉ của cổng Lớn hơn FFh: 
MOV DX, Địa chỉ cổngOUT DX, Acc
- Trong đó: Acc có thể là AL hoặc AX
- Xuất dữ liệu từ Acc ra cổng
Tóm tắt chương
- Tính tương thích về Cấu trúc thanh ghi của các vi xử lý họ x86
- Tính tương thích về Tập lệnh của các vi xử lý họ x86

File đính kèm:

  • pdfbai_giang_ky_thuat_vi_xu_ly_chuong_3_vi_xu_ly_8088_intel.pdf