Chế độ địa chỉ tức thì
z Toán hạng (dữ liệu) được chỉ định trực tiếp trong lệnh
(mã lệnh)
z Toán hạng là 1 hằng, được biết trong thời gian dịch
z Dữ liệu tức thì phải có tiền tố là dấu “#”
z Ví dụ:
mov A, #25H ;A ← #0x25
mov DPTR, #1FFFH ;DPTR ← #0x1FFF
temp EQU 40 ;assembler directive
mov R1, #temp ;R1 ← 28H (40 decimal)
Chế độ địa chỉ thanh ghi
z Yêu cầu phải sử dụng các thanh ghi để lưu giữ dữ liệu
z Đặt toán hạng vào 1 thanh ghi và thao tác với nó bằng
cách tham chiếu đến thanh ghi chứa (theo tên) trong lệnh
mov A, R0 ;A ← contents (R0)
mov R2, A ;R2 ← contents (A)
ADD A, R1 ;A ← contents (A) + contents (R1)
z Các thanh ghi nguồn và đích phải cùng kích thước
z Các lệnh dịch chuyển dữ liệu giữa các thanh ghi không
thể áp dụng cho mọi trường hợp, cho mọi thanh ghi:
mov R4, R7 ; invalid
– Kiểm tra với danh sách lệnh trước khi sử dụng
21 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 522 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Microcontroller - Chương 3: Ngôn ngữ lập trình Assembly cho vi điều khiển 805, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
DCE
Ngôn ngữ lập trình Assembly
cho vi điều khiển 8051
Microcontroller
Chapter 3
Ngo Nhu Khoa
Department of Computer Engineering
ThaiNguyen University of Technology
10/1/2005 2 DCE
Các vấn đề
z Mã máy - Machine code
z Các chế độ địa chỉ của 8051
z Các lệnh Jump, Loop và Call
z Thường trình con - Subroutines
z Các vòng trễ đơn giản
10/1/2005 3 DCE
1. Mã đối tượng của 8051
z Assembler chuyển đổi mã lệnh assembly thành mã
máy/đối tượng
z Sự chuyển đổi từ mã assembly sang mã đối tượng là
duy nhất
– Data sheet for 8051 lists the table of conversion
– Manual assembly is cool !
z Mã đối tượng là 1 chuỗi các lệnh máy
z Mỗi lệnh máy có thể có độ dài 1 byte hoặc nhiều hơn
z Các lệnh máy là 1 giá trị nhị phân và được viết ở hệ 16
10/1/2005 4 DCE
1. Mã đối tượng của 8051 ()
z Assemblers tạo ra 1 file .lst trong quá trình dịch.
z Instruction to m/c code translation on a line by line
basis is listed
1
1
2
2
2
3
00
08
74 55
78 AA
A8 AA
90 55 AA
nop
inc R0
mov A, #55H
mov R0, #0AAH
mov R0, 0AAH
mov DPTR, #55AAH
#bytes Hex code Instruction
10/1/2005 5 DCE
1. Mã đối tượng của 8051 ()
79
61
78
1A
E9
12
00
30
09
D8
F9
12
00
32
02
00
00
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
800A
800B
800C
800D
800E
800F
8010
ValueAddress
.equ cout, 0x0030
.equ cin, 0x0032
.equ esc, 0x004E
.org 0x8000
mov r1, #'a'
mov r0, #26
next_char:
mov A, r1
lcall cout
inc r1
djnz r0, next_char
lcall cin
ljmp 0x0000
0000:
0000:
0000:
8000:
8000: 79 61
8002: 78 1A
8004: E9
8005: 12 00 30
8008: 09
8009: D8 F9
800B: 12 00 32
800E: 02 00 00
AssemblyHex
10/1/2005 6 DCE
2. Các chế độ địa chỉ của 8051
z CPU có thể truy xuất dữ liệu theo nhiều cách khác
nhau
– Chỉ định dữ liệu trực tiếp trong lệnh
– Sử dụng các chế độ địa chỉ khác nhau đối với dữ liệu được
lưu trữ trong bộ nhớ mã lệnh và bộ nhớ dữ liệu
z 5 chế độ địa chỉ
– Tức thì - Immediate
– Thanh ghi - Register
– Trực tiếp - Direct
– Gián tiếp thanh ghi - Register Indirect
– Chỉ số - Indexed
10/1/2005 7 DCE
2.1. Chế độ địa chỉ tức thì
z Toán hạng (dữ liệu) được chỉ định trực tiếp trong lệnh
(mã lệnh)
z Toán hạng là 1 hằng, được biết trong thời gian dịch
z Dữ liệu tức thì phải có tiền tố là dấu “#”
z Ví dụ:
mov A, #25H ;A ← #0x25
mov DPTR, #1FFFH ;DPTR ← #0x1FFF
temp EQU 40 ;assembler directive
mov R1, #temp ;R1 ← 28H (40 decimal)
10/1/2005 8 DCE
2.2. Chế độ địa chỉ thanh ghi
z Yêu cầu phải sử dụng các thanh ghi để lưu giữ dữ liệu
z Đặt toán hạng vào 1 thanh ghi và thao tác với nó bằng
cách tham chiếu đến thanh ghi chứa (theo tên) trong lệnh
mov A, R0 ;A ← contents (R0)
mov R2, A ;R2 ← contents (A)
ADD A, R1 ;A ← contents (A) + contents (R1)
z Các thanh ghi nguồn và đích phải cùng kích thước
z Các lệnh dịch chuyển dữ liệu giữa các thanh ghi không
thể áp dụng cho mọi trường hợp, cho mọi thanh ghi:
mov R4, R7 ; invalid
– Kiểm tra với danh sách lệnh trước khi sử dụng
10/1/2005 9 DCE
2.3. Chế độ địa chỉ trực tiếp
z Đối với dữ liệu được lưu trữ trên RAM và các thanh ghi
– Tất cả các vùng nhớ đều các thể truy xuất bằng địa chỉ.
– Như truy xuất đến tất cả các thanh ghi, các cổng, các thiết bị ngoại
vi trong 8051.
z Sử dụng địa chỉ của trực tiếp toán hạng trong lệnh.
mov A, 40H ; A ← mem[40H] (note no # sign before 40H)
z Chế độ địa chỉ thanh ghi tương tự như chế độ địa chỉ trực
tiếp
mov A, 4H ; 4H is the address for R4
mov A, R4 ; tương tự như trên. Cả 2 lệnh đều như nhau
;nhưng có thể có mã khác nhau
z Ngăn xếp trong 8051 chỉ sử dụng chế độ địa chỉ trực tiếp
10/1/2005 10 DCE
2.4. Chế độ gián tiếp thanh ghi
z 1 thanh ghi được sử dụng như 1 con trỏ
– Thanh ghi lưu giữ địa chỉ của dữ liệu
z Chỉ có các thanh ghi R0, R1 và DPTR có thể được sử
dụng cho mục đích này trong 8051
z R0 và R1 có thể được sử dụng đối với bộ nhớ nội (256
bytes bao gồm cả SFRs) hay từ 00H đến FFH của bộ nhớ
ngoài
mov A, @R0 ;A ← internal_mem[R0]
mov @R1, A ;A ← internal_mem[R1]
movx A, @R0 ; A ← external_mem[R0]
z Thanh ghi DPTR có thể được sử dụng đối với bộ nhớ
ngoài, trỏ đến ô nhớ bất kỳ trong khoảng 64K
movx A, @DPTR ;A ← external_mem[DPTR]
movx @DPTR, A ;vice versa
10/1/2005 11 DCE
2.5. Chế độ địa chỉ chỉ số
z Sử dụng 1 thanh ghi để lưu trữ con trỏ (địa chỉ cơ
sở) và 1 thanh ghi khác để lưu giá trị lệch
z Địa chỉ kết quả là tổng sum = base+offset
– Chuyển byte mã có quan hệ với DPTR vào A. Địa chỉ kết
quả là: DPTR + A
movc A, @A+DPTR ;A ← ext_code_mem [(A + DPTR)]
– Chuyển byte mã có quan hệ với PC vào A. Địa chỉ kết quả là
PC + A
movc A, @A+PC ;A ← ext_code_mem [(A + PC)]
z Được sử dụng rộng rãi trong thực hiện các bảng tra,
các mảng dữ liệu, tạo ra ký tự, trong bộ nhớ mã
lệnh (ROM)
10/1/2005 12 DCE
2.5. Ví dụ
z Chương trình đọc vào 1 giá trị x từ P1 và đưa ra x2 ở
P2
ORG 0 ; assembler directive
mov DPTR, #LUT ; 300H is the LUT address
mov A, #0FFH
mov P1, A ; program the port P1 to input data
Again: mov A, P1 ; read x
movc A, @A+DPTR ; get x2 from LUT
mov P2, A ; output x2 to P2
sjmp again ; for (1) loop
ORG 300H ;Look-up Table starts at 0x0300
LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
10/1/2005 13 DCE
3. Các lệnh điều khiển chương trình
z Rẽ nhánh không điều kiện
– ajmp addr11 ; absolute jump - nhảy theo địa chỉ tuyệt đối
– ljmp addr16 ; long jump - nhảy xa
– sjmp rel ; nhảy gần đến địa chỉ quan hệ
– jmp @A+DPTR ; jump indirect - nhảy gián tiếp
z Rẽ nhánh có điều kiện
– jz, jnz rel ; nhảy gần đến địa chỉ quan hệ nếu điều kiện thoả mãn
– djnz rel ; giảm toán hạng nguồn và nhảy nếu khác không
– cjne rel ; so sánh và nhảy nếu không bằng
z Gọi thường trình con (Subroutine)
– acall addr11 ; gọi tuyệt đối 1 thường trình con
– lcall addr16 ; gọi 1 thương trình con ở xa
– ret ; trở về chương trình chính từ 1 thường trình con
– reti ; trở về từ 1 chương trình phục vụ ngắt (ISV)
10/1/2005 14 DCE
3.1. Địa chỉ đích
z Địa chỉ đích có thể là:
– Tuyệt đối: Một giá trị địa chỉ vật lý
z addr16: địa chỉ 16 bit, ở vị trí bất kỳ trong không gian 64k
z addr11: địa chỉ 11 bit, ở vị trí bất kỳ trong không gian 2k
– rel: relative – quan hệ (tiến hay lùi) -128 bytes đến +127 bytes từ vị trí
của mã lệnh hiện thời
z Địa chỉ đích được tính toán cho các lệnh nhảy quan hệ
– PC của lệnh kế tiếp + địa chỉ quan hệ
– Đối với nhảy lùi, bỏ đi giá trị nhớ
z PC = 15H, SJMP 0FEH
z Địa chỉ là 15H + FEH = 13H
z Nhảy đến vị trí lệnh kế tiếp -2byte (lệnh hiện thời)
10/1/2005 15 DCE
3.2. Nhảy có điều kiện
z jz, jnz : Điều kiện được xác lập trên thanh ghi chứa
A==0
– Kiểm tra nếu A = 0
– jz nhảy nếu A =0 và jnz nhảy nếu A # zero
– Không cần thực hiện phép toán số học
z djnz : giảm đi 1 và nhảy nếu không bằng 0
– djnz Rn, rel
– djnz direct, rel
z jnc : Điều kiện được xác lập trên cờ nhớ CY
– jc rel
– jnc rel
z Cjne : so sánh và nhảy nếu không bằng
– cjne A, direct, rel
– cjne ARn, #data, rel
– cjne @Rn, #data, rel
10/1/2005 16 DCE
z Add 3 to A ten times
mov A, #0 ; clear A
mov R2, #10 ; R2 ← 10, can also say 0AH
AGAIN: add A, #03 ; add 3 to A
djnz R2, AGAIN ; repeat until R2==0
mov R5, A ; save the result in R5
z Loop within loop using djnz
mov R3, #100
loop1: mov R2, #10 ; trying for 1000 loop iterations
loop2: nop ; no operation
djnz R2, loop2 ; repeat loop2 until R2==0
djnz R3, loop1 ; repeat loop1 until R3==0
3.2. Nhảy có điều kiện ()
10/1/2005 17 DCE
z LJMP addr16
– Long jump. Nhảy đến 1 địa chỉ đích 2 byte
– Lệnh có độ dài 3 byte
z SJMP rel
– Nhảy đến 1 địa chỉ quan hệ từ PC+127 đến PC-128
– Nhảy đến PC + 127 (00H – 7FH)
– Nhảy đến PC – 128 (80H – FFH)
3.3. Nhảy không điều kiện
10/1/2005 18 DCE
4. Các lệnh gọi thường trình
z Thường trình con:
– Những đoạn chương trình có thể dùng lại được
z LCALL addr16
– Long call. Lệnh 3 byte. Gọi bất kỳ thường trình con nào trong
không gian mã 64Kb
– Cất nội dung PC vào ngăn xếp - push PC
– Nhảy đến địa chỉ xác định - jmp address
z ACALL addr11
– Lệnh 2 byte. Gọi bất kỳ thường trình con nào trong khoảng 2k
không gian bộ nhớ mã lệnh
– Saves code ROM for devices with less than 64K ROM
z RET
– Trở về từ 1 thương trình con
– Phục hồi lại PC từ ngăn xếp - pop PC
10/1/2005 19 DCE
5. Chu kỳ máy
z Là số các chu kỳ đồng hồ được sử dụng để thực
hiện 1 lệnh
z Có giá trị khác nhau, phụ thuộc lệnh. Lệnh ngắn nhất
là 1 chu kỳ máy
z Với 8051, 12 chu kỳ đồng hồ là thời gian tối thiểu cần
thiết cho thực hiện 1 lệnh
z Thời gian của 1 chu kỳ máy:
– Tmc = Số Clocks trên chu kỳ máy/ tần số đồng hồ
– Với 8051 tần số đồng hồ là 11.0592MHz,
z Tmc = 12 / 11.0592M = 1.085 micro seconds
z Thời gian để thực hiện 1 lệnh
– Tinstr = số chu kỳ máy để thực hiện lệnh * Tmc
– Với lệnh NOP, số chu kỳ máy = 1. Vì vậy, Tinstr = 1 * 1.085 =
1.085 micro seconds
10/1/2005 20 DCE
6. Các vòng trễ đơn giản
z Tìm thời gian trễ cho thường trình con
DELAY: mov R3, #200 ; 1 machine cycle
HERE: djnz R3, HERE ; 2 machine cycles
RET ; 1 machine cycle
z Tính toán
– Total machine cycles = 200*2 + 1 + 1 = 402
– Time = 402 * 1.085us (giả thiết: 11.0592 MHz clk) =
436.17us
z Tương tự, với bất kỳ thời gian trễ nào, đều có thể
được xác định bằng các vòng lặp trong lặp
z Với các bộ trễ lớn hơn, thường sử dụng các bộ định
thời.
10/1/2005 21 DCE
Chương 3 : Ôn tập
z How does 8051 machine code look ?
z What are 8051 addressing modes ?
z What are program control instructions ?
z Conditional Vs Unconditional branches
z Subroutines
z What is Machine cycle ?
z How to calculate exact time spent in executing
a program ? Or how to write exact time delay
loops ?
Các file đính kèm theo tài liệu này:
- bai_giang_microcontroller_chuong_3_ngon_ngu_lap_trinh_assemb.pdf