Các kiểu định địa chỉ họ MSC-51 Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ GV: Trương Công Dung Nghi Các kiểu định địa chỉ • Có 8 kiểu định địa chỉ trong 8051: 1. Thanh ghi (register) dùng trong trường hợp dữ liệu chứa trong thanh ghi (register data). 2. Tức thời (immediate) dùng cho dữ liệu hằng số (constant data). 3. Trực tiếp (direct) dùng cho dữ liệu chứa trong RAM (RAM data). 4. Gián tiếp (register indirect) dùng cho dữ liệu chứa trong RAM (RAM data). 5. Chỉ số (indexed) dùng cho dữ liệu chứa trong ROM (ROM data). 6. Tương đối (relative) 7. Tuyệt đối (absolute) 8. Dài (long) 2 GV: Trương Công Dung Nghi Các kiểu định địa chỉ 3 GV: Trương Công Dung Nghi Các kiểu định địa chỉ 1. Định địa chỉ thanh ghi (register) : ‣ Cả toán hạng nguồn và toán hạng đích đều có thể là một trong các thanh ghi của CPU. ‣ Các thanh ghi trong 8051 : 4 A B R0 R1 R3 R4 R2 R5 R7 R6 DPH DPL PC DPTR PC Some 8051 16-bit Register Some 8-bit Registers of the 8051 !A (Accumulator) !B !PSW (Program Status Word) !SP (Stack Pointer) !PC (Program Counter) !DPTR (Data Pointer)
10
Embed
ểu định đị ỉ Các ki địnhtcdungnghi/MPU_MCU/MCU_8051_addressing...‣Toán hạng nguồn là một hằng số được xác định bởi giá trị của nó. ‣Toán
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Các kiểu định địa chỉ họ MSC-51
Hiệu đính từ bài giảng của Thầy Hồ Trung MỹGV: Trương Công Dung Nghi
Các kiểu định địa chỉ• Có 8 kiểu định địa chỉ trong 8051:
1. Thanh ghi (register) dùng trong trường hợp dữ liệu chứa trong thanh ghi (register data).
2. Tức thời (immediate) dùng cho dữ liệu hằng số (constant data).
3. Trực tiếp (direct) dùng cho dữ liệu chứa trong RAM (RAM data).
4. Gián tiếp (register indirect) dùng cho dữ liệu chứa trong RAM (RAM data).
5. Chỉ số (indexed) dùng cho dữ liệu chứa trong ROM (ROM data).
6. Tương đối (relative)
7. Tuyệt đối (absolute)
8. Dài (long)
2
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ
3
The 8051 Microcontroller, 4eBy I. Scott MacKenzie and Raphael C.-W. Phan
Các kiểu định địa chỉ1. Định địa chỉ thanh ghi (register) :
‣ Cả toán hạng nguồn và toán hạng đích đều có thể là một trong các thanh ghi của CPU.
‣ Các thanh ghi trong 8051 :
4
A B
R0 R1
R3 R4
R2
R5
R7 R6
DPH DPL
PC
DPTR
PC
Some 8051 16-bit Register
Some 8-bit Registers of the 8051
! A (Accumulator) ! B ! PSW (Program Status Word) ! SP (Stack Pointer) ! PC (Program Counter) ! DPTR (Data Pointer)
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ1. Định địa chỉ thanh ghi (register) :
‣ Ví dụ :
MOV R0,A
MOV A,R7
ADD A,R4
ADD A,R7
MOV DPTR,#25F5H
MOV R5,DPL
MOV R1,DPH
‣ Chú ý : có thể chuyển dữ liệu giữa thanh ghi A và Rn (n = 0...7) nhưng không thể chuyển dữ liệu giữa các thanh ghi Rn.
Ví dụ : MOV R4, R7 là sai.
5 GV: Trương Công Dung Nghi
Các kiểu định địa chỉ2. Định địa chỉ tức thời (Immediate) :
‣ Toán hạng nguồn là một hằng số được xác định bởi giá trị của nó.
‣ Toán hạng tức thời được nhận biết nhờ vào ký tự # đặt trước chúng.
6
mov A, #0 ;put 0 in the accumulator ;A = 00000000
mov R4, #11h ;put 11hex in the R4 register ;R4 = 00010001
mov B, #11 ;put 11 decimal in b register ;B = 00001011
mov DPTR,#7521h ;put 7521 hex in DPTR ;DPTR = 0111010100100001
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ2. Định địa chỉ tức thời (Immediate) :
‣ Một số chú ý:
✓ Luôn đặt dấu # trước dữ liệu tức thời.
✓ Chỉ có toán hạng nguồn mới được phép định địa chỉ tức thời.
✓ Thêm “h” vào sau số thập lục phân, “b” sau số nhị phân. Nếu không ghi chú gì thêm thì mặc định là số thập phân.
✓ Dùng dấu nháy đơn ‘’ để đóng khung ký tự.
✓ Với những số thập lục phân bắt đầu bởi A-F, phải thêm số 0 phía trước.
Ví dụ:
7
Add “#” before any immediate dataOnly the source operand can be immediateAdd “h” after a base-16 number, “b” after a base-2 number; otherwise assumed base-10Use ‘ ’ to enclose any character
Notes of Immediate AddressingNotes of Immediate Addressing
Use ‘ ’ to enclose any characterPrecede all base-16 numbers that begin with A-F by a “0”
MOV A,#ABh
MOV A,#0ABH
54
GV: Trương Công Dung Nghi
3. Định địa chỉ trực tiếp (direct) :
• truy suất dữ liệu bằng cách dùng trực tiếp địa chỉ 8-bits của vùng nhớ.
• thường dùng cho vùng nhớ 30H-7FH của RAM.
Các kiểu định địa chỉ
8
GV: Trương Công Dung Nghi9 GV: Trương Công Dung Nghi
Các kiểu định địa chỉ3. Định địa chỉ trực tiếp (direct) :
• Ví dụ :
10
mov a, 70h ; copy contents of RAM at 70h to amov R0,40h ; copy contents of RAM at 70h to amov 56h,a ; put contents of a at 56h to amov 0D0h,a ; put contents of a into PSW
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ3. Định địa chỉ trực tiếp (direct) :
• dùng cho các thanh ghi R0-R7 với địa chỉ trực tiếp.
• Ví dụ :
• Chú ý :
11
Addressing Modes2) Direct Mode – play with R0-R7 by direct
addressMOV A,4 ≡≡≡≡ MOV A,R4
MOV A,7 ≡≡≡≡ MOV A,R7MOV A,7 ≡≡≡≡ MOV A,R7
MOV 7,6 ≡≡≡≡ MOV R7,R6
MOV R2,#5 ;Put 5 in R2MOV R2,5 ;Put content of RAM at 5 in R2
56
Addressing Modes2) Direct Mode – play with R0-R7 by direct
addressMOV A,4 ≡≡≡≡ MOV A,R4
MOV A,7 ≡≡≡≡ MOV A,R7MOV A,7 ≡≡≡≡ MOV A,R7
MOV 7,6 ≡≡≡≡ MOV R7,R6
MOV R2,#5 ;Put 5 in R2MOV R2,5 ;Put content of RAM at 5 in R2
56
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ3. Định địa chỉ trực tiếp (direct) :
12
Examples of Direct AddressingExamples of Direct Addressing
Instruction OperationMOV 80h, A orMOV P0, A
Copy contents of register A to location 80h (Port 0 latch)
MOV A, 80h orMOV A, P0
Copy contents of location 80h (Port 0 pins) to register A
Note: No “#” sign in the instruction
MOV A, P0 register A
MOV A, ABC Copy contents from direct address with label ABC to register A
MOV R0, 12h Copy contents from RAM location 12h to register R0
MOV 0A8h, 77h orMOV IE, 77h
Copy contents from RAM location 77h to IE register of SFRs MOV direct,direct
ABC EQU 80h ; equateMOV A, ABC ; Port 0 to A
58
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ3. Định địa chỉ trực tiếp (direct) :
13
Examples of Direct AddressingExamples of Direct Addressing
MOV A, 2 ; copy location 02 (R2) to AMOV B, 2 ; copy location 02 (R2) to BMOV 7, 2 ; copy location 02 to 07 (R2 to R7)
; since “MOV R7, R2” is invalid
MOV DIRECT, DIRECT
59
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ3. Định địa chỉ trực tiếp (direct) :
• Chú ý : khi làm việc với ngăn xếp (stack), phải sử dụng cách định địa chỉ trực tiếp.
PUSH direct
POP direct
• Ví dụ :
14
Stack and Direct Addressing ModeStack and Direct Addressing Mode
Only direct addressing mode is allowed for pushing onto the stack
Các kiểu định địa chỉ3. Định địa chỉ trực tiếp (direct) :
• Ví dụ : Hãy viết đoạn chương trình chuyển dữ liệu từ các thanh ghi R5, R6 và A vào stack, sau đó lấy dữ liệu ra các thanh ghi R2, R3 và B sao cho nội dung thanh ghi B = A, R2 = R6, R3 = R5.
Các kiểu định địa chỉ4. Định địa chỉ gián tiếp (indirect) :
20
Instruction Operation MOV @R1, A Copy the data in A to the address pointed to by
the contents of R1
MOV A, @R0 Copy the contents of the address pointed to by
register R0 to the A register
MOV @R1, #35h Copy the number 35h to the address pointed to
Examples of Indirect AddressingExamples of Indirect Addressing
MOV @R1, #35h Copy the number 35h to the address pointed to
by register R1
MOV @R0, 80h or
MOV @R0, P0
Copy the contents of the port 0 pins to the
address pointed to by register R0.
MOVX A, @R0 Copy the contents of the external data address
pointed to by register R0 to the A register
MOVX A, @DPTR Copy the contents of the external data address
pointed to by register DPTR to the A register
MOV @Ri,#data where i = 0 or 1
72
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ5. Định địa chỉ chỉ số :
• sử dụng một thanh ghi nền (base address) (hoặc bộ đếm chương trình PC hay con trỏ dữ liệu DPTR) và một offset (thanh ghi tích lũy A) để tạo thành dạng địa chỉ hiệu dụng cho lệnh JMP hoặc MOVC.
• Ví dụ:
21
Addressing Modes
5) Register Indexed Mode – source or destination address is the sum of the base address and the accumulator (Index)
• Base address can be DPTR or PCmov dptr, #4000hmov a, #5movc a, @a + dptr ;a M[4005]
80
Addressing Modes
5) Register Indexed Mode continue
• Base address can be DPTR or PCORG 1000hORG 1000h
1000 mov a, #51002 movc a, @a + PC ;a M[1008]1003 Nop
• Lookup Table • MOVC only can read internal code memory
Instruction Operation MOVC A, @A + DPTR Copy the code byte, found at the ROM
address formed by adding register A and the DPTR register, to A
MOVC A, @A + PC Copy the code byte, found at the ROM
Examples of Indexed AddressingExamples of Indexed Addressing
MOVC A, @A + PC Copy the code byte, found at the ROM address formed by adding A and the PC, to A
JMP @A + DPTR Jump to the address formed by adding A to the DPTR, this is an unconditional jump and will always be done.
84
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ6. Định địa chỉ tương đối:
• Chỉ được sử dụng cho các lệnh nhảy “ngắn” (SJMP, JNC, JZ, DJNZ,...).
• Địa chỉ tương đối (còn gọi là offset) là một giá trị 8-bit có dấu (-128 đến +127).
• Giá trị này được cộng với bộ đếm chương trình (PC) để tạo ra địa chỉ của lệnh tiếp theo cần được thực thi.
• Bộ đếm chương trình (PC) được tăng đến địa chỉ theo sau lệnh nhảy ⇒ địa chỉ mới liên quan đến lệnh kế tiếp, không liên quan đến địa chỉ của lệnh nhảy.
24
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ6. Định địa chỉ tương đối (relative) :
• Tính offset cho kiểu định địa chỉ tương đối:
25
The 8051 Microcontroller, 4eBy I. Scott MacKenzie and Raphael C.-W. Phan
FIGURE 3–2 Calculating the offset for relative addressing. (a) Short jump ahead in memory (b) Short jump back in memory
Offset tương đối = byte thấp của (địa chỉ nhảy đến - địa chỉ lệnh kế)GV: Trương Công Dung Nghi
Các kiểu định địa chỉ6. Định địa chỉ tương đối:
26
Branch OpcodeOffset
Next Opcode
Program Counter
Relative AddressingRelative Addressing
Program counter + offset
= Effective address
= address of next instruction
+ Offset
Next Instruction
94
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ6. Định địa chỉ tương đối:
• Ví dụ:
27
Instruction Operation SJMP NXT Jump to relative address with the label 'NXT'; this
is an unconditional jump and is always taken.
DJNZ R1, DWN Decrement register R1 by 1 and jump to the relative address specified by the label 'DWN' if
Examples of Relative AddressingExamples of Relative Addressing
relative address specified by the label 'DWN' if the result of R1 is not zero.
0035
95GV: Trương Công Dung Nghi
Các kiểu định địa chỉ7. Định địa chỉ tuyệt đối (absolute) :
• Chỉ được sử dụng cho các lệnh ACALL và AJMP.
• Các lệnh này cho phép rẽ nhánh chương trình trong trang 2K hiện hành của bộ nhớ chương trình bằng cách cung cấp 11 bits thấp của địa chỉ đích.
• 5 bits cao của địa chỉ đích là 5 bits cao hiện hành trong bộ đếm chương trình ⇒ lệnh theo sau lệnh rẽ nhánh và đích của lệnh rẽ nhánh phải ở trong cùng 1 trang 2K.
28
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ8. Định địa chỉ dài (long distance) :
• Chỉ dùng cho các lệnh LCALL và LJMP.
• Các lệnh này chứa địa chỉ đích 16 bits.
• Ưu điểm : giúp sử dụng hết toàn bộ không gian nhớ chương trình 64K.
• Khuyết điểm : lệnh dài đến 3-byte và phụ thuộc vào vị trí.
ORG 5FFDHTEST: ACALL BACKWARD ; 2 bytes instruction; now code address at 5FFFH
SJMP $END
97
GV: Trương Công Dung Nghi
Bài tập• Hãy cho biết cách định địa chỉ của các lệnh sau:
a) MOV R4, A b) MOV A, #0A3H c) MOV 6, #0B6H
d) LJMP 0548H e) MOVX A, @DPTR f) MOV A, @R1
g) MOV A, 12H h) ACALL DELAY i) SJMP LOOP
• Xét lệnh sau: MOV 50H, #0FFH. Hãy tìm mã lệnh và giải thích mỗi byte trong mã lệnh.
• Offset tương đối của lệnh “SJMP AHEAD” là bao nhiêu nếu lệnh này đang ở ô nhớ 0400H và 0401H, và nhãn AHEAD biểu diễn lệnh ở địa chỉ 041FH.
31 GV: Trương Công Dung Nghi
Các kiểu định địa chỉ• Ví dụ : Hãy viết đoạn chương trình chép giá trị 55h vào bộ nhớ
RAM tại các địa chỉ từ 40h đến 44h sử dụng:
(a) Định địa chỉ trực tiếp.
(b) Định địa chỉ gián tiếp không dùng vòng lặp.
(c) Định địa chỉ gián tiếp có dùng vòng lặp.
32
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ• Ví dụ : Hãy viết đoạn chương trình chép giá trị 55h vào bộ nhớ
RAM tại các địa chỉ từ 40h đến 44h sử dụng:
(a) Định địa chỉ trực tiếp.
33
MOV A, #55h ; load A with value 55hMOV 40h, A ! ; copy A to RAM location 40h MOV 41h, A ! ; copy A to RAM location 41h MOV 42h, A ! ; copy A to RAM location 42h MOV 43h, A ! ; copy A to RAM location 43h MOV 44h, A ! ; copy A to RAM location 44h
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ• Ví dụ : Hãy viết đoạn chương trình chép giá trị 55h vào bộ nhớ
RAM tại các địa chỉ từ 40h đến 44h sử dụng:
(b) Định địa chỉ gián tiếp không dùng vòng lặp.
34
MOV A, #55h ; load A with value 55hMOV R0, #40h ; load the pointer. R0 = 40hMOV @R0, A ; copy A to RAM location R0 points toINC R0 ; increment pointer. Now R0 = 41hMOV @R0, A ; copy A to RAM location R0 points to
Solution to Example (b)Solution to Example (b)register indirect addressing mode without a loop
MOV @R0, A ; copy A to RAM location R0 points toINC R0 ; increment pointer. Now R0 = 42hMOV @R0, A ; copy A to RAM location R0 points toINC R0 ; increment pointer. Now R0 = 43h MOV @R0, A ; copy A to RAM location R0 points toINC R0 ; increment pointer. Now R0 = 44hMOV @R0, A ; copy A to RAM location R0 points to
75
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ• Ví dụ : Hãy viết đoạn chương trình chép giá trị 55h vào bộ nhớ RAM tại các địa chỉ từ 40h đến 44h sử dụng:
AGAIN: MOV @R0, A ; copy 55A to RAM location R0 points toINC R0 ; increment R0 pointer
Solution to Example (c)Solution to Example (c) Loop method
INC R0 ; increment R0 pointerDJNZ R2, AGAIN ; loop until counter = zero
“DJNZ” : decrement and jump if Not Zero
DJNZ direct, relativeDJNZ Rn, relative where n = 0,1,,,7
MOV R2, #05h ; exampleLP:
;--------------------------------; do 5 times inside the loop;--------------------------------DJNZ R2, LP ; R2 as counter
76GV: Trương Công Dung Nghi
Các kiểu định địa chỉ• Ví dụ : Hãy viết đoạn chương trình xóa 15 ô nhớ RAM bắt đầu tại địa chỉ 60h.
36
Example (looping)Example (looping)Write a program segment to clear 15 RAM locations starting at RAM address 60h.
CLR A ; A = 0MOV R1, #60h ; load pointer. R1 = 60hMOV R7, #15 ; load counter, R7 = 15 (0F in HEX)MOV R7, #15 ; load counter, R7 = 15 (0F in HEX)
AGAIN: MOV @R1, A ; clear RAM location R1 points toINC R1 ; increment R1 pointerDJNZ R7, AGAIN ; loop until counter = zero
; clear one ram location at address 60hCLR AMOV R1,#60hMOV @R1,A
Setup a loop using DJNZ and register R7 as counter77
GV: Trương Công Dung Nghi
Các kiểu định địa chỉ• Ví dụ : Hãy viết đoạn chương trình sao chép một khối dữ liệu 10
bytes từ vùng nhớ RAM có địa chỉ bắt đầu là 35h đến vùng nhớ RAM có địa chỉ bắt đầu là 60h.
37
Example (block transfer)Example (block transfer)Write a program segment to copy a block of 10 bytes of data from RAM locations starting at 35h to RAM locations starting at 60h.
BACK:MOV A, @R0 ; get a byte from sourceMOV @R1, A ; copy it to destinationINC R0 ; increment source pointerINC R1 ; increment destination pointerDJNZ R3, BACK ; keep doing it for all ten bytes