Định dạng lệnh - Instruction Formatmod reg r/m optional optional optional optional 0 7 low addr high addr Low Displacement or Immediate High Displacement or Immediate Low Immediate Hi
Trang 1Chương 3: Tập lệnh của
Vi Xử Lý
Phạm Thế Duy ptduy@yahoo.com
Trang 2Khái niệm lệnh
Là chuỗi bit 0, 1 cung cấp để vi xử lý thực
hiện một chức năng cơ bản.
Bao gồm hai phần:
OP CODE: chọn chức năng thực hiện.
Operand: Chọn dữ liệu cho lệnh.
Trang 3Định dạng lệnh - Instruction Format
mod reg r/m
optional optional optional optional
0 7
low addr
high addr
Low Displacement or Immediate High Displacement or Immediate Low Immediate
High Immediate
opcode 6-bit chỉ thị loại lệnh sẽ thực hiện
d (destination): d=1 chỉ thị toán hạng thanh ghi Reg là toán hạng đích
d=0 chỉ thị toán hạng thanh ghi Reg là toán hạng nguồn
w (word): w=1 toán hạng trong lệnh bao gồm hai byte
w=0 toán hạng trong lệnh bao gồm 01 byte
Trang 4opcode d w mod reg r/m
optional optional optional optional
0 7
low addr
high addr
Low Displacement or Immediate High Displacement or Immediate Low Immediate
High Immediate
mod is 2-bit chỉ thị chế độ địa chỉ (tuỳ theo giá trị của r/m)
reg là 3-bit chỉ thị toán hạng thanh ghi (bảng kế)
r/m là 3-bit chỉ thị vị trí của toán hạng là trong thanh ghi hay
Trang 5Định dạng lệnh - Instruction Format
Mod
W=0 W=1
000 001 010 011 100 101 110 111
[BX]+[SI] + d16 [BX]+[DI] + d16 [BP]+[SI] + d16 [BP]+[DI] + d16 [SI] + d16 [DI] + d16 [BP] + d16 [Bx] + d16
AL CL DL BL AH CH DH BH
AX CX DX BX SP BP SI DI
Trang 6opcode d w mod reg r/m
optional optional optional optional
0 7
low addr
high addr
Low Displacement or Immediate High Displacement or Immediate Low Immediate
High Immediate
Displacement có thể 8 hoặc 16 bit
- Là giá trị Hex được mã hoá trong lệnh.
- Sử dụng để tính toán giá trị địa chỉ của toán hạng
Immediate có thể 8, 16 hoặc 32 bit
Định dạng lệnh - Instruction Format
Trang 7opcode d w mod reg r/m
optional optional optional optional
0 7
low addr
high addr
Low Displacement or Immediate High Displacement or Immediate Low Immediate
High Immediate
Ví dụ xét lệnh: mov ax, bx
Mã lệnh sẽ là: 8B C3 = 100010 1 1 11 000 011
d là: 1 thanh ghi là toán hạng đích
w là: 1 toán hạng đích là 1 word
mod là: 11 chỉ thị giá trị r/m trỏ tới a thanh ghi
reg là: 000 thanh ghi toán hạng đích là ax
r/m là: 011 thanh ghi toán hạng nguồn là bx
Định dạng lệnh - Instruction Format
Trang 8Các loại toán hạng -Operand types
1) Register - Được mã hoá trong lệnh
• Lệnh thực hiện nhanh
• Không có truy cập Bus (in instr queue)
• Chiều dài lệnh ngắn
2) Immediate - Hằng số mã hoá trong lệnh
• 8 hoặc 16 bit
• Không truy cập BUS (in instr queue)
• Chỉ có thể là toán hạng nguồn3) Memory – Nằm trong bộ nhớ, yêu cầu truy cập BUS
• Có thể cần tính toán địa chỉ
• Địa chỉ của toán hạng trong lệnh là địa chỉ Offset hay: EFFECTIVE ADDRESS
Trang 9Effective Address
• Tính toán bởi EU
• Thông thường, Effective address =
displacement + [base register]+ [index register]
(if any) (if any) (if any)
• Có thể tính toán từ 03 giá trị
– Có trong một số chế độ địa chỉ khác nhau:
• Displacement
– 8 hoặc 16 bit là hằng số trong lệnh
– Thanh ghi cơ sở “base register” cần là BX hoặcBP
– Thanh ghi chỉ số “index register” cần là SI hoặc DI
Trang 10Các chế độ địa chỉ- addressing mode
Tức thời (Immediate)
Thanh ghi (Register)
Trực tiếp (Direct)
Gián tiếp thanh ghi (Indirect register)
Tương đối Cơ sở (Based relative)
Tương đối Chỉ số (Indexed Relative)
Cơ sở chỉ số (Based Index)
Trang 11Chế độ địa chỉ tức thời – Immediate
Trang 12Chế độ địa chỉ thanh ghi - Register
Mov ax,bx
Mov al,ah
Dữ liệu nằm trong thanh ghi.
Trang 13Chế độ địa chỉ trực tiếp
prefix byte
- longer instruction
- more fetch time
Trang 14Chế độ địa chỉ trực tiếp Direct
Addressing
Dữ liệu nằm trong bộ nhớ, lệnh chỉ thị địa chỉ
offset của ô nhớ.
Trang 15Chế độ địa chỉ gián tiếp thanh ghi
Register Indirect Addressing
mov al, [bp] ;al gets 8 bits at SS:BP mov ah, [bx] ;ah gets 8 bits at DS:BX mov ax, [di] ;ax gets 16 bits at DS:SI mov eax, [si] ;eax gets 32 bits at DS:SI
BX
effective address
BP SI DI
Trang 16Chế độ địa chỉ tương đối cơ sở Based Relative Addressingmov al, [bp+2] ;al gets 8 bits at SS:BP+2 mov ah, [bx-4] ;ah gets 8 bits at DS:BX-4
Trang 17Chế độ địa chỉ chỉ số tương đối Indexed Relative Addressing
mov ax, [si+1000h] ;ax gets 16 bits at DS:SI+1000h mov eax, [si+300h] ;eax gets 32 bits at DS:SI+300h Mov [di+100h], al ;DS:DI+100h gets 8 bits in al
Trang 18Chế độ địa chỉ cơ sở chỉ số tương đối Based Indexed Relative Addressing
mov ax, [bp+di] ;ax gets 16 bits at SS:BP+DI
mov ax, [di+bp] ;ax gets 16 bits at DS:BP+DI
mov eax, [bx+si+10h] ;eax gets 32 bits at DS:BX+SI+10h mov cx, [bp+si-7] ;cx gets 16 bits at SS:BP+SI-7
Trang 19Ví dụ về các chế độ địa chỉ
Addressing Mode Examples
mov al, bl ;8-bit register addressing
mov di, bp ;16-bit register addressing
mov eax, eax ;32-bit register addressing
mov al, 12 ;8-bit immediate, al<-0ch
mov cx, 0faceh ;16-bit immediate, cx<-64,206
mov ebx, 2h ;32-bit immediate, ebx<-00000002h
mov al, LIST ;al<-8 bits stored at label LIST
mov ch, DATA ;ch<-8 bits stored at label DATA
mov ds, DATA2 ;ds<-16 bits stored at label DATA2
mov al, [bp] ;al<-8 bits stored at SS:BP
mov ah, [bx] ;ah<-8 bits stored at DS:BX
mov ax, [bp] ;ax<-16 bits stored at SS:BP
mov eax, [bx] ;eax<-32 bits stored at DS:BX
mov al, [bp+2] ;al<-8 bits stored at SS:(BP+2)
mov ax, [bx-4] ;ax<-16 bits stored at DS:(BX-4)
mov al, LIST[bp] ;al<-8 bits stored at SS:(BP+LIST)
mov bx, LIST[bx] ;bx<-16 bits stored at DS:(BX+LIST)
mov al, LIST[bp+2] ;al<-8 bits stored at SS:(BP+2+LIST)
mov ax, LIST[bx-12h] ;ax<-16 bits stored at
18+LIST)
Register Immediate
Direct
Based
Trang 20mov al, [si] ;al<-8 bits stored at DS:SI
mov ah, [di] ;ah<-8 bits stored at DS:DI
mov ax, [si] ;ax<-16 bits stored at DS:SI
mov eax, [di] ;eax<-32 bits stored at DS:DI
mov ax, es:[di] ;ax<-16 bits stored at ES:DI
mov al, [si+2] ;al<-8 bits stored at DS:(SI+2)
mov ax, [di-4] ;ax<-16 bits stored at DS:(DI-4)
mov al, LIST[si] ;al<-8 bits stored at DS:(SI+LIST)
mov bx, LIST[di] ;bx<-16 bits stored at DS:(DI+LIST)
mov al, LIST[si+2] ;al<-8 bits stored at DS:(SI+2+LIST)
mov ax, LIST[di-12h] ;ax<-16 bits stored at DS:(DI-18+LIST)
mov al, [bp+di] ;al<-8 bits from SS:(BP+DI)
mov ah, ds:[bp+si] ;ah<-8 bits from DS:(BP+SI)
mov ax, [bx+si] ;ax<-16 bits from DS:(BX+SI)
mov eax, es:[bx+di] ;eax<-32 bits from ES:(BX+DI)
mov al, LIST[bp+di] ;al<-8 bits from SS:(BP+DI+LIST)
mov ax, LIST[bx+si] ;ax<-16 bits from DS:(BX+SI+LIST)
Indexed
Based Indexed
Based Indexed Relative
Ví dụ về các chế độ địa chỉ
Addressing Mode Examples
Trang 21Chế độ địa chỉ cổng I/O Port Addressing
Họ x86 quản lý 65,536 địa chỉ cổng vào ra
Mỗi địa chỉ cổng (giống như bộ nhớ)
Truy cập tới một cổng duy nhất
Địa chỉ I/O có thể 1 byte hoặc 2 byte
Với 386+ có thể là 4 byte
Có hai chế độ địa chỉ cổng
1) Chế độ địa chỉ cổng tức thời
- Chỉ có thể là địa chỉ 1 byte
- Giá trị trong khoảng từ 00 tới ffH 2) địa chỉ cổng giữ trong DX
- có thể mang các giá trị trong khoảng từ 0000h tới ffffh
Chỉ có thể sử dụng thanh ghi DX để giữ địa chỉ cổng
Chỉ có thể sử dụng các thanh ghi AL,AX,EAX cho dữ liệu cổng
Trang 22Tập lệnh của 80286
Các lệnh truyền dữ liệu.
Các lệnh xử lý dữ liệu.
Các lệnh số học
Các lệnh logic
Các lệnh quay dịch
Các lệnh điều khiển chương trình.
Các lệnh nhảy.
Các lệnh chương trình con.
Các lệnh xử lý chuỗi dữ liệu.
Trang 23Các lệnh truyền dữ liệu - MOVE
Dữ liệu được chép từ toán hạng nguồn (Source) tới toán hạng
đích (Dest) Chú ý lệnh không làm thay đổi toán hạng nguồn, chỉ làm thay đổi toán hạng đích
Chú ý một số trường hợp không sử dụng được trong lệnh này
bao gồm:
Không chuyển dữ liệu trực tiếp giữa hai ô nhớ.
Không nên chuyển giá trị tức thời (Imm) vào thanh ghi đoạn.
Không chuyển dữ liệu giữa hai thanh ghi đoạn.
Không dùng thanh ghi CS làm toán hạng đích.
Trang 24Các toán hạng sử dụng trong lệnh MOV
MOV AH,BHMOV CL,[1000H]MOV DH,10
MOV Table,BXMOV X1,25HMOV DS,AXMOV ES,X2
Trang 25Các lệnh truyền dữ liệu - EXCHANGE
- Cú pháp: XCHG Dest,Source
- Thực hiện: Dest ↔ Source
Dữ liệu được chuyển đổi giữa hai toán hạng
đích và nguồn, tức là sau khi thực hiện cả
toán hạng đích và toán hạng nguồn đều thay đổi.
Trang 26Các lệnh truyền dữ liệu
Lệnh lấy dữ trong bảng vào AL.
Lấy giá trị thứ n trong bảng dữ liệu vào thanh ghi AL, với BX giữ
địa chỉ đầu bảng, AL giữ khoảng cách từ đầu bảng tới giá trị cần lấy.
Ví dụ: Tính bình phương một số bảng cách tra bảng:
Bphuong DB 0 ,1,4,8,16,25,36,49,64 …; định nghĩa bảng dữ liệu bình phương.
LEA BX,Bphuong : Lấy địa chỉ offset đầu bảng vào BX
MOV AL,03 ; AL chứa số cần tính bình phương.
Trang 27Các lệnh truyền dữ liệu
Lệnh nạp địa chỉ tác động vào thanh ghi.(Load Effective
Address to Register)
- Cú pháp: LEA Reg16,X1 ;X1 là tên biến cần lấy địa chỉ.
- Thực hiện: Reg16 ← Địa chỉ tác động của biến X1.
Lấy địa chỉ offset của biến X1 vào một thanh ghi 16 bit.
Nạp con trỏ bộ nhớ vào thanh ghi DS (Load Pointer to DS).
Lấy địa chỉ đoạn của biến X vào thanh ghi DS và lấy địa chỉ tác
động vào thanh ghi 16 bit.
Lệnh nạp con trỏ bộ nhớ vào thanh ghi ES:
- Cú pháp: LES Reg16,Var
Trang 28Các lệnh truyền dữ liệu- PUSH, POP
Lệnh cất dữ liệu vào ngăn xếp.
- Cú pháp: PUSH Source
Toán hạng Source trong lệnh có thể là một biến bộ nhớ hoặc một biến thanh ghi
Cất thanh ghi cờ vào đỉnh ngăn xếp sử dụng lệnh PUSHF.
- Thực hiện: Cất dữ liệu chỉ thị bởi toán hạng nguồn vào đỉnh ngăn xếp và tự động
giảm con trỏ ngăn xếp tuỳ theo số byte của toán hạng nguồn.
Ví dụ : PUSH AX sẽ thực hiện các thao tác sau (với 8088)
Lệnh lấy dữ liệu ra khỏi ngăn xếp.
- Cú pháp: POP Dest
Toán hạng đích trong lệnh cũng có thể là một toán hạng bộ nhớ hoặc một thanh ghi
Phục hồi thanh ghi cờ từ đỉnh ngăn xếp sử dụng lệnh POPF.
- Thực hiện: Lấy dữ liệu từ đỉnh ngăn xếp ra toán hạng đích và tăng giá trị của SP
lên một lượng tương ứng với số byte chứa được trong toán hạng đích.
Trang 29Các lệnh truyền dữ liệu- IN, OUT
Lệnh nhập (input):
Với: Port là địa chỉ cổng vào ra truy xuất dữ liệu.
[DX] là toán hạng gián tiếp thanh ghi chứa địa chỉ cổng.
Acc là thanh ghi chứa (AX nếu truy xuất từ, AL nếu truy xuất
byte).
Ví dụ: IN AL,80H ; Lấy vào AL dữ liệu tại cổng 80H
Trang 30TỔNG KẾT CÁC LỆNH TRUYỀN DỮ
Trang 31CÁC LỆNH XỬ LÝ DỮ LIỆU
Các lệnh số học
Các lệnh logic
Biến đổi dữ liệu theo phép toán thực hiện.
Tác động lên các cờ trạng thái: CF, ZF, OF, SF,PF
và AF.
Các lệnh quay dịch
Trang 32Các lệnh số học và logic Arithmetic/Logic Instructions
• Các lệnh toán học cơ bản
– Chỉ thực hiện với số nguyên có dấu và không dấu
– Mặc định là số bù 2.
– Tính ra kết quả và tác động tới các cờ
• Các lệnh Logic - Logic Instructions
– Tác động từng bit tương ứng - Bit Level
– Mức từ - Word Level
– Tính ra kết quả và tác động tới các cờ.
Trang 33Các lệnh số học Arithmetic Instruction Summary
add ax, bx ;axax+bx and set flags
adc ax, bx ;axax+bx+CF(lsb) and set flags
inc ax ;axax+1 and set flags
aaa ;ASCII Adjust after Addition
daa ;Decimal (BCD) Adjust after Addition sub ax, bx ;axax-bx and set flags
sbb ax, bx ;ax(ax-CF)-bx and set flags
dec ax ;axax-1
neg ax ;ax(-1)*(ax) 2’s Complement
cmp ax, bx ;Flags are set according to ax-bx
das ;Decimal (BCD) Adjust after Subtraction aas ;ASCII Adjust after Subtraction
mul cx ;dx:ax ax * cx (unsigned)
imul cx ;dx:ax ax * cx (2’s complement)
aam ;ASCII Adjust after Multiplication
div cl ;alax/cl Quot AND ahax/cl Rem.
idiv cx ;ax(dx:ax)/cx Quot AND dx Rem.
aad ;ASCII Adjust after Division
Trang 34Các lệnh cộng Addition Instruction Types
add ax, bx ;axax+bx and set flags
adc ax, bx ;axax+bx+CF(lsb) and set flags inc ax ;axax+1 and set flags
aaa ;ASCII Adjust after Addition
daa ;Decimal (BCD) Adjust after
Addition
add al, bl ;alal+bl and set flags
add bx, 35afh ;bxbx+35afh
add [bx], al ;ds:(bx)ds:(bx)+al
add cl, [bp] ;clcl+ss:(bp)
add al, [ebx] ;alal+ds:(ebx)
add bx, TEMP[di] ;bxbx+ds:(TEMP+di)
add bx, [eax+2*ecx] ;bxbx+ds:(eax+(2*ecx))
Scaled Index Addressing: 386+
Trang 35Các lệnh cộng – ADD
Cộng (Add):
Các toán hạng sử dụng trong lệnh:
Dest Source Ví dụ
Reg Reg Mem Reg Mem
Reg Mem Reg Imm Imm
ADD AX,BX ADD BX,VAR ADD SUM,DX ADD CL,09 ADD SUM,10
Trang 36Các lệnh cộng Cộng có nhớ – ADC (Add with Carry)
Các toán hạng sử dụng trong lệnh:
Dest Source Ví dụ
Reg Reg Mem Reg Mem
Reg Mem Reg Imm Imm
ADD AX,BX ADD BX,VAR ADD SUM,DX ADD CL,09 ADD SUM,10
Trang 37Ví dụ: ADC - Add with Carry
add ax, cx ;axax+cx and flags set
adc bx, dx ;bxbx+dx+CF(lsb) and flags set
33-bit Sum Present in CF:bx:ax
BX DX
AX CX
1 1
0 1 CF=1
CF
Trang 38Các lệnh số học – Tăng
Lệnh tăng (Increment).
- Toán hạng đích sử dụng trong lệnh có thể là một thanh
ghi hoặc một ô nhớ
Trang 39Ví dụ về lệnh tăng - Increment Examples
inc bl ;blbl+1 tác động các cờ inc BYTE PTR [bx] ;Byte at ds:(bx)ds:(bx)+1
New MASM Directive: BYTE POINTER
Trang 40Các lệnh số học – Chỉnh thập phân cho
phép cộng (DAA)
Chỉnh thập phân cho lệnh cộng (Decimal Adjust for Add)
- Thực hiện: kết quả của lệnh cộng đặt ngay trước lệnh chỉnh
thập phân sẽ được điều chỉnh từ dạng nhị phân thông thường thành dạng BCD nén Giá trị tràn khỏi thanh chứa sẽ lưu trong cờ C.
Để có kết quả đúng, các toán hạng sử dụng trong lệnh cộng trước
DAA phải ở dạng thập phân nén.
Trang 41Chỉnh thập phân Decimal Adjust after Addition
• Chỉ sử dụng cho các phép tính số học với số BCD
• Chỉnh đúng lại kết quả - “Corrects” Result
01106 +01117
110113→c ần kết quả là 0001 0011
(1101 không phải là số BCD)
•2 số trong một byte gọi là “Packed Decimal”
•Lệnh DAA sử dụng toán hạng hiểu ngầm
trong thanh ghi AL
•Đặt sau các lệnh add, adc để hiệu chỉnh “Adjust”
Trang 42Ví dụ về lệnh DAA Decimal Adjust after Addition Example
mov dx, 1234h ;dx1234 BCD
mov bx, 3099h ;bx3099 BCD
mov al, bl ;al99 BCD
add al, dl ;alcdh không phải là số BCD, cần
34+99=133
daa ;al33h (33 BCD) và CF=1
mov cl, al ;cl33 BCD
mov al, bh ;al30 BCD
adc al, dh ;al30h+12h+1=43h
daa ;al43h (43 BCD)
mov ch, al ;cx=4333h BCD for 1234+3099
Trang 43Các lệnh số học – Chỉnh ASCII cho
phép cộng (AAA)
Chỉnh ASCII cho lệnh cộng (ASCII Adjust for Add).
- Thực hiện: Điều chỉnh lại giá trị ASCII cho lệnh cộng
ngay phía trước Để có kết quả đúng, các toán hạng của lệnh cộng phải dưới dạng mã ASCII