Hệ thống nhúng - Hướng dẫn
Luồng chương trình tiến hành một cách tuần tự, từ lệnh này đến lệnh tiếp theo, trừ khi lệnh chuyển điều khiển được thực hiện. Các loại lệnh chuyển điều khiển khác nhau trong hợp ngữ bao gồm lệnh nhảy có điều kiện hoặc không điều kiện và lệnh gọi.
Hướng dẫn Vòng và Nhảy
Vòng lặp trong 8051
Lặp lại một chuỗi lệnh một số lần nhất định được gọi là loop. Một chỉ dẫnDJNZ reg, labelđược sử dụng để thực hiện một hoạt động Vòng lặp. Trong hướng dẫn này, một thanh ghi được giảm đi 1; nếu nó không phải là 0, thì 8051 sẽ nhảy đến địa chỉ đích mà nhãn tham chiếu.
Thanh ghi được nạp với bộ đếm số lần lặp lại trước khi bắt đầu vòng lặp. Trong hướng dẫn này, cả giảm thanh ghi và quyết định nhảy được kết hợp thành một lệnh duy nhất. Các thanh ghi có thể là bất kỳ R0 – R7. Bộ đếm cũng có thể là một vị trí RAM.
Thí dụ
Multiply 25 by 10 using the technique of repeated addition.
Solution- Phép nhân có thể đạt được bằng cách cộng lặp lại số nhân và nhiều lần với số nhân. Ví dụ,
25 * 10 = 250 (FAH)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC
MOV R2,#10 ; the multiplier is replaced in R2
Add A,#25 ;add the multiplicand to the ACC
AGAIN:DJNZ R2,
AGAIN:repeat until R2 = 0 (10 times)
MOV R5 , A ;save A in R5 ;R5 (FAH)
Drawback in 8051 - Hành động lặp với lệnh DJNZ Reg labelchỉ giới hạn ở 256 lần lặp. Nếu một bước nhảy có điều kiện không được thực hiện, thì lệnh sau bước nhảy sẽ được thực hiện.
Looping bên trong một Loop
Khi chúng ta sử dụng một vòng lặp bên trong một vòng lặp khác, nó được gọi là nested loop. Hai thanh ghi được sử dụng để giữ số lượng khi số lượng tối đa được giới hạn ở 256. Vì vậy, chúng tôi sử dụng phương pháp này để lặp lại hành động nhiều lần hơn 256.
Example
Viết chương trình cho -
- Nạp bộ tích có giá trị 55H.
- Bổ sung ACC 700 lần.
Solution- Vì 700 lớn hơn 255 (dung lượng tối đa của bất kỳ thanh ghi nào), hai thanh ghi được sử dụng để giữ số đếm. Đoạn mã sau đây cho thấy cách sử dụng hai thanh ghi, R2 và R3, để đếm.
MOV A,#55H ;A = 55H
NEXT: MOV R3,#10 ;R3 the outer loop counter
AGAIN:MOV R2,#70 ;R2 the inner loop counter
CPL A ;complement
Các bước nhảy có điều kiện khác
Bảng sau liệt kê các bước nhảy có điều kiện được sử dụng trong 8051:
Chỉ dẫn | Hoạt động |
---|---|
JZ | Nhảy nếu A = 0 |
JNZ | Nhảy nếu A ≠ 0 |
DJNZ | Giảm và Nhảy nếu đăng ký ≠ 0 |
CJNE A, dữ liệu | Nhảy nếu dữ liệu A ≠ |
CJNE reg, #data | Nhảy nếu dữ liệu byte ≠ |
JC | Nhảy nếu CY = 1 |
JNC | Nhảy nếu CY ≠ 1 |
JB | Nhảy nếu bit = 1 |
JNB | Nhảy nếu bit = 0 |
JBC | Nhảy nếu bit = 1 và xóa bit |
JZ (jump if A = 0)- Trong hướng dẫn này, nội dung của bộ tích lũy được kiểm tra. Nếu nó bằng 0, thì 8051 sẽ nhảy đến địa chỉ đích. Lệnh JZ chỉ có thể được sử dụng cho bộ tích lũy, nó không áp dụng cho bất kỳ thanh ghi nào khác.
JNZ (jump if A is not equal to 0)- Trong hướng dẫn này, nội dung của bộ tích lũy được kiểm tra là khác không. Nếu nó không phải là 0, thì 8051 sẽ nhảy đến địa chỉ đích.
JNC (Jump if no carry, jumps if CY = 0)- Bit cờ Carry trong thanh ghi cờ (hoặc PSW) được sử dụng để đưa ra quyết định có nhảy hay không "nhãn JNC". CPU nhìn vào cờ mang để xem nó có được nâng lên hay không (CY = 1). Nếu nó không được nâng lên, thì CPU sẽ bắt đầu tìm nạp và thực thi các lệnh từ địa chỉ của nhãn. Nếu CY = 1, nó sẽ không nhảy mà sẽ thực hiện lệnh tiếp theo bên dưới JNC.
JC (Jump if carry, jumps if CY = 1) - Nếu CY = 1, nó sẽ nhảy đến địa chỉ đích.
JB (jump if bit is high)
JNB (jump if bit is low)
Note - Cần lưu ý rằng tất cả các bước nhảy có điều kiện đều là bước nhảy ngắn, tức là địa chỉ của đích phải nằm trong phạm vi –128 đến +127 byte nội dung của bộ đếm chương trình.
Hướng dẫn Nhảy vô điều kiện
Có hai bước nhảy không điều kiện trong 8051 -
LJMP (long jump)- LJMP là lệnh 3 byte trong đó byte đầu tiên đại diện cho opcode, byte thứ hai và thứ ba đại diện cho địa chỉ 16 bit của vị trí đích. Địa chỉ đích 2 byte cho phép nhảy đến bất kỳ vị trí bộ nhớ nào từ 0000 đến FFFFH.
SJMP (short jump)- Là một lệnh 2 byte trong đó byte đầu tiên là opcode và byte thứ hai là địa chỉ tương đối của vị trí đích. Địa chỉ tương đối nằm trong khoảng từ 00H đến FFH được chia thành các bước nhảy tiến và lùi; nghĩa là, trong phạm vi –128 đến +127 byte bộ nhớ so với địa chỉ của PC hiện tại (bộ đếm chương trình). Trong trường hợp chuyển tiếp, địa chỉ đích có thể nằm trong khoảng cách 127 byte tính từ PC hiện tại. Trong trường hợp nhảy lùi, địa chỉ đích có thể nằm trong phạm vi –128 byte tính từ PC hiện tại.
Tính toán địa chỉ bước ngắn
Tất cả các bước nhảy có điều kiện (JNC, JZ và DJNZ) là bước nhảy ngắn vì chúng là các lệnh 2 byte. Trong các hướng dẫn này, byte đầu tiên đại diện cho opcode và byte thứ hai đại diện cho địa chỉ tương đối. Địa chỉ đích luôn liên quan đến giá trị của bộ đếm chương trình. Để tính toán địa chỉ đích, byte thứ hai được thêm vào PC của lệnh ngay bên dưới bước nhảy. Hãy xem chương trình dưới đây -
Line PC Op-code Mnemonic Operand
1 0000 ORG 0000
2 0000 7800 MOV R0,#003
3 0002 7455 MOV A,#55H0
4 0004 6003 JZ NEXT
5 0006 08 INC R0
6 0007 04 AGAIN: INC A
7 0008 04 INC A
8 0009 2477 NEXT: ADD A, #77h
9 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0, A
12 000F F9 MOV R1, A
13 0010 FA MOV R2, A
14 0011 FB MOV R3, A
15 0012 2B OVER: ADD A, R3
16 0013 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 0017 END
Tính toán địa chỉ mục tiêu nhảy lùi
Trong trường hợp nhảy về phía trước, giá trị dịch chuyển là một số dương trong khoảng từ 0 đến 127 (00 đến 7F trong hệ thập lục phân). Tuy nhiên, đối với bước nhảy lùi, độ dịch chuyển là giá trị âm từ 0 đến –128.
Hướng dẫn GỌI
CALL được sử dụng để gọi một chương trình con hoặc phương thức. Các chương trình con được sử dụng để thực hiện các hoạt động hoặc công việc cần được thực hiện thường xuyên. Điều này làm cho một chương trình có cấu trúc hơn và tiết kiệm không gian bộ nhớ. Có hai hướng dẫn - LCALL và ACALL.
LCALL (Cuộc gọi dài)
LCALL là một lệnh 3 byte trong đó byte đầu tiên đại diện cho opcode và byte thứ hai và thứ ba được sử dụng để cung cấp địa chỉ của chương trình con đích. LCALL có thể được sử dụng để gọi các chương trình con có sẵn trong không gian địa chỉ 64K byte của 8051.
Để thực hiện trở lại thành công điểm sau khi thực hiện chương trình con được gọi, CPU sẽ lưu địa chỉ của lệnh ngay bên dưới LCALL trên ngăn xếp. Do đó, khi một chương trình con được gọi, điều khiển sẽ được chuyển đến chương trình con đó, và bộ xử lý lưu PC (bộ đếm chương trình) trên ngăn xếp và bắt đầu lấy các lệnh từ vị trí mới. Lệnh RET (return) chuyển điều khiển trở lại người gọi sau khi thực hiện xong chương trình con. Mọi chương trình con đều sử dụng RET làm lệnh cuối cùng.
ACALL (Cuộc gọi tuyệt đối)
ACALL là một lệnh 2 byte, ngược lại với LCALL là 3 byte. Địa chỉ đích của chương trình con phải nằm trong khoảng 2K byte vì chỉ có 11 bit trong số 2 byte được sử dụng cho địa chỉ. Sự khác biệt giữa ACALL và LCALL là địa chỉ đích cho LCALL có thể ở bất cứ đâu trong không gian địa chỉ 64K byte của 8051, trong khi địa chỉ đích của CALL nằm trong phạm vi 2K byte.