Chương 9
TÓM TẮT TẬP LỆNH
I – GIỚI THIỆU:
Chương trình được xây dựng nên từ tập lệnh, tuân theo cú
pháp và cấu trúc logic. Một họ vi xử lý luôn đi kèm theo tập
lệnh của nó. Chương này gới thiệu tập lệnh của họ MCs-51,
việc đònh vò và một vài ví dụ về các tình huống gặp phải khi lập
trình. Chương này không bàn về kỹ thuật lập trình cũng như về
trình biên dòch.
Tập lệnh họ vi điều khiển MCx-51 tối ưu cho các điều
khiển ứng dụng 8 bit. Nó cung cấp các cách đònh vò nhanh, gọn
thuận tiện cho việc truy xuất dữ liệu 8 bit trong vùng RAM nội.
Tập lệnh cũng đưa ra một số lệnh thao tác trên bit thuận tiện
cho việc điều khiển và các hệ thống logic có yêu cầu xử lý luận
lý.
Là một xử lý 8 bit, các lệnh của 8051 là mã 8 bit. Do đó
tập lệnh có tối đa 256 lệnh. Trong đó 255 lệnh được đònh nghóa.
Trong một lệnh, ngoài mã lệnh (1 byte) ra còn có thể có dữ liệu
và đòa chỉ. Trong tập lệnh 8051 có 139 lệnh 1 byte, 92 lệnh 2
byte và 24 lệnh 3 byte. Phần phụ lục sẽ mô tả đầy đủ về mỗi
mã, về mã gợi nhớ, số byte lệnh, số chu kỳ hành lệnh.
II – CÁC MODE ĐỊNH VỊ (ADDRESSING MODE)
Khi lệnh thao tác trên dữ liệu, một câu hỏi được đặt ra là
“dữ liệu ở đâu?”. Để trả lời câu hỏi này ta xem xét qua các
mode đònh vò của 8051.
Đònh vò dữ liệu là một phần quan trọng trong tập lệnh.
Chúng xác đònh dữ liệu nguồn và đích theo những cách khác
nhau tùy theo cách lập trình. Trong phần này ta sẽ lhảo sát kỹ
từng mode đònh vò và cho mỗi loại một ví dụ. Có 8 mode đònh vò:
Thanh ghi
Trực tiếp
Gián tiếp
Tức thời (Immediate)
Tương đối
Xa
Chỉ số
Đònh vò bằng thanh ghi:
Người lâp trình truy xuất dữ liệu chứa trong các thanh ghi
từ R0 đến R7 thông qua tên gọi của chúng. Đòa chỉ của 8 thanh
ghi này được giải mã thông qua bit thấp nhất của chúng. Do đó
mã lệnh và toán hạng đòa chỉ được gom chung vào 1 byte.
Opcode 5-bit n n n
Ví dụ lệnh sau cộng nội dung R7 vào thanh ghi tích luỹ:
ADD A, R7;
Mã lệnh là 001011111B. Trong đó 5 bit cao 00101 chỉ mã
lệnh 3 bit thấp 111 chỉ thanh ghi R7.
Một vài lệnh xác đònh trực tiếp trên thanh ghi như thanh
ghi tích luỹ, con trỏ dữ liệu …do đó không cần đến các bit đòa
chỉ. Bản thân mã lệnh đã mô tả thanh ghi.
Đònh vò trực tiếp :
Đònh vò trực tiếp có thể truy xuất bất kỳ byte nào trong
vùng nhớ nội hoặc các thanh ghi chức năng. Một byte được thêm
vào mã lệnh để xác đònh vò trí thanh ghi được dùng.
Opcode 8-bit Direct Adress 8-
bit
Tùy thuộc vào bit cao nhất của byte đòa chỉ trực tiếp, một
trong hai vùng nhớ sẽ được chọn. Khi bit 7 của đòa chỉ trực tiếp
bằng 0: đòa chỉ trực tiếp có giá trò từ 0 đến 127 (00H – 0FH) và
128 bytes thấp của on chip RAM được tham khảo đến, Tất cả
các I/O port, thanh ghi chức năng. Thanh ghi điều khiển, thanh
ghi trạng thái có đòa chỉ từ 128 đến 255 (80H-FFh). Khi bit 7=1
byte đòa chỉ trực tiếp nằm trong giới hạn này, tương ứng với
thanh ghi chức năng sẽ được truy xuất. Ví dụ port 0 và port 1 có
đòa chỉ tương ứng là 80H và 90H. Ta không cần phải biết đòa chỉ
của những thanh ghi này, trình biên dòch luôn hiểu các mã gợi
nhớ ngắn gọn của nó như P0, P1, TMOD…
Đònh vò gián tiếp:
Làm thế nào để nhận dạng một biến, nếu đòa chỉ của nó
được xác đònh, tính toán, thay đổi khi chương trình đang chạy.
Vấn đề này được đặt ra khi thao tác các vò trí nhớ liên tục, chuỗi
số, hay xâu ký tự. Thanh ghi và đòa chỉ trực tiếp không thể dùng
vì toán hạng đòa chỉ phải được nhân biết trong thời gian biên
dòch.
Để giải quyết vấn đề trên 8051 sử dụng đòa chỉ gián tiếp.
R1 và R0 được coi như những con trỏ. Nội dung của chúng chỉ
đến một đòa chỉ nào đó trong RAM khi đọc hoặc ghi dữ liệu. Bit
thấp nhất trong byte mã lệnh xác đònh thanh ghi nào (R0 hay
R1) được dùng làm con trỏ.
Ngôn ngữ assembly của 8051 dùng ký hiệu @ đặt trước R0
hay R1 để mô tả đònh vò gián tiếp. Ví dụ, nếu R1 chứa 40H và
tại vò trí 40H trong bộ nhớ nội chứa giá trò 55H, lệnh:
MOV A, @R1;
Chuyển giá trò 55H vào thanh ghi tích luỹ.
Opcode 7-bit i
Đònh vò gián tiếp trở nên quan trọng khi phải thao tác từng
byte bộ nhớ nội một cách liên tục. Ví dụ những lệnh sau sẽ xóa
vùng RAM từ đòa chỉ 60H đến 70H:
MOV R0, #60H;
MOV @R0, #0;
LOOP: INC R0;
CJNE R0, #80H, LOOP;
Lệnh đầu tiên khởi động thanh ghi với đòa chỉ đầu tiên của
khối bộ nhớ. Lệnh thứ hai dùng lệnh gián tiếp để chuyển giá trò
00H vào vò trí được trỏ bởi R0. Lệnh thứ 3 tăng giá trò con trỏ
đến đòa chỉ tiếp theo. Và lệnh cuối kiểm tra xem con trỏ đến
cuối khối chưa. Lệnh kiểm tra dùng giá trò 80H chứ không phải
giá trò 7FH vì việc xảy ra sau việc dòch chuyển gián tiếp. Như
vậy chắc chắn cuối cùng sẽ được ghi trước khi kết thúc.
Đònh vò tức thời :
Khi một toán hạng nguồn là một hằng số không phải là
một biến. Hằng số có thể được gom vào trong lệnh như một dữ
liệu tức thời. Byte được thêm vào sẽ chứa giá trò.
Trong ngôn ngữ assembly toán hạng tức thời được đặt
trước bằng ký hiệu số (#). Toán hạng có thể là một hằng số, ký
hiệu hoặc toán tử. Trình biên dòch sẽ tính toán giá trò và gán dữ
liệu tức thời vào lệnh.
Tất cả các lệnh dùng đònh vò tức thời đều sử dụng hằng dữ
liệu 8 bit. Ngoại trừ khi khởi động thanh ghi con trỏ dữ liệu
(DPTR)
MOV DPTR, #40000H;
Là một lệnh 3 bytes nạp số 16 bit vào thanh ghi con trỏ.
Opcode Immediate data
Đònh vò tương đối:
Đònh vò tương đối chỉ dùng trong các lệnh jump. Đòa chỉ
tương đối (offset) là một số 8 bit có dấu được cộng vào thanh ghi
đếm chương trình để chỉ ra đòa chỉ của lệnh tiếp theo phải thi
hành. Vì offset là một số 8 bit có dấu nên tầm nhảy chỉ giới hạn
trong khoảng cách +127 và –128 vò trí.
Trước khi cộng, thanh ghi đếm chương trình tăng lên đến
đòa chỉ sau lệnh jump. Vì vậy, đòa chỉ mới là tương đối so với đòa
chỉ lệnh kế tiếp chứ không phải đòa chỉ lệnh jump.
Thông thường chi tiết này không liên quan đến người lập
trình, khi mà đích nhảy đến được mô tả bằng một nhãn. Trình
biên dòch sẽ đònh giá trò offset tương đối tương ứng.
Ví dụ nếu nhãn THERE được đặt tại lệnh có đòa chỉ 1040H
và lệnh
SJMP THERE
Ở tại vò trí 1000H và 1001H. Trình biên dòch sẽ gán giá trò offset
tương đối là 3EH tại byte thứ hai của lệnh.
Đònh vò tuyệt đối:
Đònh vò tuyệt đối chỉ dùng đối với các lệnh ACALL,
AJMP. Lệnh 2 byte này cho phép rẽ nhánh trong phạm vi
2Kbytes bộ nhớ. 5bit cao của đòa chỉ đích là 5 bit cao hiện thời
trong thanh ghi đếm chương trìng. Vì vậy lệnh theo sau lệnh rẽ
nhánh và lệnh kết thúc rẽ nhánh kết thuác nằm trong phạm vi
2Kbytes.
Addr 10 –
Addr8
Opcode 5-bit
Relative offsetOpcode
Addr7 - Addr0