TẬP LỆNH CỦA 8051 PHẦN 2

0
1848

III. TẬP LỆNH CỦA 8051 (8051 INSTRUCTION SET)

 

   * Một số ký hiệu dùng trong lệnh:
  Rn                 Địa chỉ thanh ghi sử dụng (R0 – R7).
  direct           Địa chỉ trực tiếp của một byte trong RAM nội (00H-FFH)
  @Ri              Địa chỉ gián tiếp sử dụng (R0 hoặc R1).
  source         Toán hạng nguồn (Rn, direct hoặc @Ri).
  dest             Toán hạng đích (Rn, direct hoặc @Ri).
  #data          Hằng số 8 bit (#00H – #0FFH).
  #data16      Hằng số 16 bit (#0000H – #0FFFFH).
  bit                Địa chỉ trực tiếp của một bit (địa chỉ bit).
  rel                Offset8 bit có dấu.
  addr11         Địa chỉ 11 bit.
  addr16         Địa chỉ 16 bit.
←                 Được thay thế bởi …
  ( )                 Nội dung của …
  (( ))              Nội dung được chứa bởi …
  rrr                Thanh ghi của dãy thanh ghi (000 = R0, 001 = R1, …, 111 = R7).
i                   Địa chỉ gián tiếp sử dụng R0 (i = 0) hoặc R1 (i = 1).
  dddddddd    Các bit dữ liệu.
  aaaaaaaa     Các bit địa chỉ.
  eeeeeeee     Địa chỉ tương đối.

   * Một số lưu ý khi lập trình bộ vi điều khiển 8051:

  • Để thông báo đó là một giá trị tức thời thì cần phải đặt thêm ký hiệu “#” vào trước giá trị đó. Nếukhông có ký hiệu “#” thì giá trị đó được hiểu là địa chỉ của ô nhớ.

MOV A, #12H                            ;Nạp giá trị 12H vào thanh ghi A.

MOV A, 12H                               ;Sao chép nội dung của ô nhớ có địa chỉ 12H vào thanh ghi A.
→ Ở đây ta cũng nên lưu ý rằng nếu thiếu ký hiệu “#”  thì lệnh trên cũng không gây ra lỗi trong quá
trình biên dịch. Vì trình dịch hợp ngữ cho đó là một lệnh hợp lệ. Tuy nhiên, kết quả lập trình sẽ không
đúng như ý muốn của người lập trình.

  • Các giá trị tức thời nếu có thành phần chữ (A, B, C, …, F) đứng đầu thì cần phải thêm số 0 vàotrước thành phần chữsau ký hiệu “#”. Việc này để báo rằng thành phần chữ đó là một số HEX chứ không phải là một ký tự.
    MOV A, #BH                               ;Thiếu số 0 → gây lỗi khi biên dịch.
    MOV A, #0BH                             ;Thêm số 0 → đúng.
    MOV A, #F9H                             ;Thiếu số 0 → gây lỗi khi biên dịch.
    MOV A, #0F9H                           ;Thêm số 0 → đúng.

→ Ở đây ta cũng nên lưu ý rằng việc thiếu số 0 thêm vào này sẽ gây lỗi trong quá trình biên dịch
đối với các chương trình biên dịch cũ. Ngày nay, một số phần mềm biên dịch đã hỗ trợ việc này. Điều
này có nghĩa là ta có thể thêm hay không thêm số 0 vào thì đều không ảnh hưởng gì ñến quá trình biên
dịch (không gây ra lỗi khi biên dịch).

  • Trong lệnh, các giá trị tức thời hay địa chỉ của ô nhớ có thể được biểu diễn dưới bất kỳ dạng nào BIN (nhị phân), DEC (thập phân) hay HEX (thập lục phân).
    o  Địa chỉ ô nhớ:các câu lệnh sau đây là tương đương nhau:
    MOV   A, 64H                                               ;Sao chép nội dung của ô nhớ có địa chỉ 64H vào thanh ghi A.
    MOV   A, 100                                               ;Sao chép nội dung của ô nhớ có địa chỉ 64H vào thanh ghi A.
    MOV   A, 01100100B                                   ;Sao chép nội dung của ô nhớ có địa chỉ 64H vào thanh ghi A.

o  Giá trị tức thời: các câu lệnh sau đây là tương đương nhau:
MOV   A, #0C9H                                          ;Nạp giá trị C9H vào thanh ghi A.

MOV   A, #201                                            ;Nạp giá trị C9H vào thanh ghi A.

MOV   A, #11001001B                                ;Nạp giá trị C9H vào thanh ghi A.

* Lưu ý : các hậu tố đi kèm tương ứng cho từng dạng:

+ B – dạng BIN (nhị phân)

+ H – dạng HEX (thập lục phân)

+ D hoặc không có hậu tố – dạng DEC (thập phân).

  • Chuyển một giá trị tức thời hay địa chỉ của ô nhớ lớn hơn khả năng chứa của một thanh ghi thì sẽ  gây ra lỗi (00H-FFH: cho thanh ghi hoặc ô nhớ  8 bit0000H-FFFFH: cho thanh ghi 16  bit  – DPTR).

MOV   A, #123H                                            ;Không hợp lệ vì 123H > FFH.

MOV   A, #214                                               ;Hợp lệ vì 214 (D6H) < FFH (255).

MOV   A, #0F2H                                             ;Hợp lệ vì F2H < FFH.

MOV   A, 123H                                                ;Không hợp lệ vì 123H > FFH.

MOV   A, 200                                                   ;Hợp lệ vì 200 (C8H) < FFH (255).

MOV DPTR, #123H                                         ;Hợp lệ vì 123H < FFFFH (16 bit).

1. Nhóm lệnh số học :
1.1. Lệnh ADD A,<src-byte>

  •  Chức năng: Cộng (Add).
  •  Mô tả:  ADD cộng nội dung của thanh ghi A (A) với nội dung của một byte có địa chỉ được chỉ ra trong lệnh (src- byte) và đặt  kết quả vào thanh   ghi A. Các cờ bị ảnh hưởng:

o  Cờ CY = 1 nếu có số nhớ từ bit 7. Ngược lại CY = 0.
o  Cờ AC = 1 nếu có số nhớ từ bit 3. Ngược lại AC = 0.
o  Cờ  OV = 1 nếu có số nhớ từ bit 6 nhưng không có số nhớ từ bit 7 hoặc nếu có số nhớ từ bit 7 nhưng không có số nhớ từ bit 6.                       Ngược lại OV = 0.
o  Khi cộng hai số nguyên không dấu và có dấu:
                           + Số không dấu:  CY = 1  ↔      Phép toán có nhớ.
                           + Số có dấu:       CY = 1   ↔     Số dương = Số âm + Số âm.
↔     Số âm = Số dương + Số dương.

  • Các dạng lệnh:

ADD A, Rn

                                  Số byte                1
Số chu kỳ             1
Mã đối tượng        00101rrr
Hoạt động            (A)  ←(A) + (Rn)

                              ADD A, direct

                                  Số byte                2
Số chu kỳ             1
Mã đối tượng         00100101  aaaaaaaa
Hoạt động             (A)  ←(A) + (direct)

                                ADD A, @Ri

                                  Số byte                1
Số chu kỳ             1
Mã đối tượng        0010011i
Hoạt động            (A)  ←(A) + ((Ri))

                                ADD A, #data

Số byte                2
Số chu kỳ             1
Mã đối tượng        00100100  dddddddd
Hoạt động            (A)  ←(A) + #data

Ví dụ : Cho biết trước (A)=C3H, (R0)=47H, (P1)=(90H)=AAH, (47H)=D2H.

1.2. ADDC A,

  • Chức năng: Cộng có cờ nhớ (Add with Carry).
  • Mô tả: ADDC cộng đồng thời nội dung của thanh ghi A (A) với nội dung của byte có địa chỉ được chỉ ra trong lệnh (src-byte) và cờ nhớ (CY), đặt kết quả vào thanh ghi A. Các cờ bị ảnh hưởng:

o  Cờ CY = 1 nếu có số nhớ từ bit 7. Ngược lại CY = 0.
o  Cờ AC = 1 nếu có số nhớ từ bit 3. Ngược lại AC = 0.
o  Cờ  OV = 1 nếu có số nhớ từ bit 6 nhưng không có số nhớ từ bit 7 hoặc nếu có số nhớ từ bit 7 nhưng không có số nhớ từ bit 6.                     Ngược lại OV = 0.
o  Khi cộng hai số nguyên không dấu và có dấu:
                          + Số không dấu:  CY = 1         ↔              Phép toán có nhớ.
                          + Số có dấu:  CY = 1              ↔              Số dương = Số âm + Số âm.
                                                                       ↔             Số âm = Số dương + Số dương.

  • Các dạng lệnh:

ADDC A, Rn

                                  Số byte                 1
Số chu kỳ              1
Mã đối tượng         00110rrr
Hoạt động             (A)  ←(A) + (C) + (Rn)

                               ADDC A, direct

                                  Số byte                 2
Số chu kỳ              1
Mã đối tượng         00110101  aaaaaaaa
Hoạt động             (A)  ←(A) + (C) + (direct)

                                ADDC A,@Ri

Số byte                  1
Số chu kỳ               1
Mã đối tượng          0011011i
Hoạt động              (A)  ←(A) + (C) + ((Ri))

                                 ADDC A, #data

Số byte                  2
Số chu kỳ               1
Mã đối tượng          00110100  dddddddd
Hoạt động              (A)  ←(A) + (C) + # data

Ví dụ : Cho biết trước (A)=C3H, (R0)=47H, (P1)=(90H)=AAH, (47H)=D2H và cờ CY=1.

1.3. SUBB A,

  •  Chức năng:  Trừ có số mượn (Subtract with Borrow).
  •  Mô tả: SUBB trừ nội dung của thanh ghi A (A) với nội dung của byte có địa chỉ được ch ỉra trong lệnh (src-byte) cùng với cờ nhớ và cất kết quả vào thanh ghi A. Các cờ bị ảnh hưởng:

o  Cờ CY = 1nếu có số mượn cho bit 7. Ngược lại CY = 0.
o  Cờ AC = 1nếu có số mượn cho bit 3. Ngược lại AC = 0.
o  Cờ OV = 1nếu có số mượn cho bit 6 nhưng không có số mượn cho bit 7 hoặc nếu có số mượn cho bit 7 nhưng không có số mượn cho bit 6. Ngược lại OV = 0.
o  Khi cộng hai số nguyên không dấu và có dấu:
                             + Số không dấu:  CY = 1    ↔     Phép toán có mượn.
                             + Số có dấu:  CY = 1          ↔   Số dương = Số âm – Số dương.
                                                                    ↔    Số âm = Số dương – Số âm.

  •  Các dạng lệnh:

SUBB A, Rn

Số byte            1
Số chu kỳ         1
Mã đối tượng    10011rrr
Hoạt động        (A)  ←(A) – (C) – (Rn)

SUBB A, direct

Số byte              2
Số chu kỳ           1
Mã đối tượng      10010101  aaaaaaaa
Hoạt động          (A)  ←(A) – (C) – (direct)

SUBB A, @Ri

Số byte               1
Số chu kỳ            1
Mã đối tượng       1001011i
Hoạt động           (A)  ←(A) – (C) – ((Ri))

SUBB A, #data

Số byte                1
Số chu kỳ             1
Mã đối tượng        100110100  dddddddd
Hoạt động            (A)  ←(A) – (C) – #data

Ví dụ : Cho biết trước (A)=83H, (R0)=78H, (P1)=(90H)=AAH, (78H)=C5H và cờ CY=1.

Leave a Reply