Định dạng lệnh - Instruction Formatoptional optional optional optional 0 7 low addr high addr Low Displacement or Immediate High Displacement or Immediate Low Immediate High Immediate
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
hiện một chức năng cơ bả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
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
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
bộ nhớ (r/m : register/memory)
Trang 5Định dạng lệnh - Instruction Format
Mod
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
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
- là số hex
Định dạng lệnh - Instruction Format
Trang 7opcode d w
optional optional optional optional
0 7
low addr
high addr
Low Displacement or Immediate High Displacement or Immediate Low Immediate
High Immediate
mod là: 11 chỉ thị giá trị r/m trỏ tới a thanh ghi
Đị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
Trang 11Chế độ địa chỉ tức thời – Immediate
Trang 12Chế độ địa chỉ thanh ghi - Register
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
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 Addressing
Trang 17Chế độ địa chỉ chỉ số tương đối Indexed Relative Addressing
Trang 18Chế độ địa chỉ cơ sở chỉ số tương đối Based Indexed Relative Addressing
mov eax, [bx+si+10h] ;eax gets 32 bits at DS:BX+SI+10h
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)
mov al, LIST[bp+di-10h] ;al<-8 bits from SS:(BP+DI-16+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 số học
Các lệnh logic
Các lệnh quay dịch
Các lệnh nhảy.
Các lệnh chương trình con.
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 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
đí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.
- Cú pháp: XLAT
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,9,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.
XLAT ; AL bằng bình phương của 3
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).
- Cú pháp: LDS Reg16,X
- Thực hiện: DS Seg.X
Reg16 Off.X
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
- Thực hiện: ES Seg.Var
Reg16 Off.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ấ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.
Lệnh lấy dữ liệu ra khỏi ngăn xếp.
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
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.
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 Complements 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 Complements 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 35
Các lệnh cộng – ADD
Các toán hạng sử dụng trong lệnh:
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ú pháp: ADC Dest,Source
Các toán hạng sử dụng trong lệnh:
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
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)
- Cú pháp: DAA
- 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
+01117
1101 13c ầ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
Trang 44Chỉnh ASCII sau lệnh cộng ASCII Adjust after Addition
• Để cộng các số được mã hoá ASCII
30h tới 39h mã hoá cho các số ‘0’s Complement tới ‘9’s Complement
• ax được mặc định là toán hạng nguồn cho lệnh AAA
31h ‘1’s Complement +39h ‘9’s Complement 6ah ‘10’s Complement cần phải là 3130h
(6ah không đúng đây là mã ASCII của kí tự ‘j’)
mov ax, 31h ;ax0031h=‘1’s Complement
add al, 39h ;ax31h+39h=006ah=‘<nul>j’s Complement
add ax, 3030h ;đổi từ BCD thành ASCII
Trang 45Các lệnh trừ
Subtraction Instruction Types
sub ax, bx ;axax-bx tác động tới các cờ
sbb ax, bx ;ax(ax-CF)-bx và tác động tới các cờ dec ax ;axax-1
neg ax ;ax(-1)*(ax) = 0 – ax = Lấy bù 2
cmp ax, bx ;tác động các cờ tuỳ thuộc vào kết quả
;ax-bx chú ý ax không thay đổi
Trang 46Các toán hạng sử dụng trong các lệnh cộng trừ
Allowable Operands for add, sub
Gen Reg
Gen Reg Mem Loc Immediate
+-
Gen Reg Mem Loc
Immediate
+-
Destination – Đích Source - Nguồn
Trang 47Trừ có nhớ
Subtract with Borrow, sbb
sub ax, di ;axax-di và CF chứa bit nhớ sbb bx, si ;bx(bx-CF(lsb))-si lập các cờ
32-bit kết quả chứa trong bx:ax
CF =1 nếu kết quả là âm
BX SI
AX DI
CF
CF
Trang 48Lệnh nhân - Multiplication
• 8086/8088 là một trong các bộ vi xử lý đầu tiên có các lệnh nhân chia
(mul/div)
• Cho phép các toán hạng: Bytes, Words, DoubleWords
•Cho các kết quả: Words, DoubleWords, QuadWords
•OF, CF Cung cấp các thông tin hữu dụng
•AF, PF, ZF, SF thay đồi theo vào kết quả nhưng không dự đoán trước
được.
•Toán hạng bị nhân luôn nằm trong các thanh ghi al, ax, eax
•mul - Unsigned Mnemonic