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.