Professional Documents
Culture Documents
c3-17- Tập Lệnh Và Hợp Ngữ
c3-17- Tập Lệnh Và Hợp Ngữ
3.1.Hợp ngữ
CPU chỉ có thể làm việc với các số nhị phân , một chương
trình chứa các số 0 và 1 được gọi là ngôn ngữ máy.
Các nguồn ngữ hợp ngữ đã được phát, đã cung cấp các từ
gợi nhớ cho các lệnh mã máy cộng với những đặc tính
khác giúp cho việc lập trình nhanh hơn và ít mắc lỗi hơn.
Các chương trình hợp ngữ phải được dịch ra thành mã
máy bằng một chương trình được là trình hợp ngữ (hợp
dịch).
Hợp ngữ được coi như là một ngôn ngữ bậc thấp vì nó
giao tiếp trực tiếp với cấu trúc bên trong của CPU.
Để lập trình trong hợp ngữ, lập trình viên phải biết tất cả
các thanh ghi của CPU và kích thước của chúng cũng như
các chi tiết khác.
1
4/12/2022
2
4/12/2022
Ví dụ
sang EQU 1;
tat EQU 0;
3
4/12/2022
tt.
Chỉ lệnh DB (định nghĩa byte): được sử dụng rộng rãi nhất
trong hợp ngữ.
Nó được dùng để định nghĩa dữ liệu 8 bit.
Khi DB được dùng để định nghĩa byte dữ liệu thì các số có
thể ở dạng thập phân, nhị phân, Hex hoặc ở dạng thức ASII.
DATA1: DB 2B ; Số thập phân (1C ở dạng Hex)
DATA2:DB 00110101B ; Số nhị phân (35 ở dạng Hex)
DATA3:DB 39H ; Số dạng Hex
Chỉ lệnh END: Nó báo cho trình hợp ngữ kết thúc của file
nguồn “asm” chỉ lệnh END là dòng cuối cùng của chương trình
8051
Trong mã nguồn thì mọi thứ sau chỉ lệnh END để bị trình
hợp ngữ bỏ qua.
Một số trình hợp ngữ sử dụng .END có dấu chấm đứng
trước thay cho END.
4
4/12/2022
5
4/12/2022
Đọc kỹ yêu cầu bài toán, xác định đối tượng điều khiển
Xác định dữ liệu đầu vào: giá trị, kiểu
Xác định kết quả: giá trị, kiểu
Xác định giải thuật / công thức để xử lý dữ liệu đầu vào
thành kết quả
Kiểm tra lỗi cú pháp
Chạy và nhập dữ liệu thử cho nhiều trường hợp khác nhau
để đánh giá chương trình
EDITOR
PRAGRAM
. …dịch myfile.asm
ASSEMBLER
Hiện nay có nhiều trình PRAGRAM
soạn thảo chuyên dụng myfile.lst other obj file
cho phép kết hợp các myfile.obj
bước 2 đến 4 vào thành LINKER
một bước. PRAGRAM
8051 IDE, KeilC, MC …
myfile.abs
OH
PRAGRAM
myfile.hex
6
4/12/2022
3.5. Lệnh
3.5.1 Tập lệnh
Số Độ
Dạng lệnh Mô tả Ví dụ MC dài
LỆNH LUẬN LÝ TÁC ĐỘNG TRÊN BIT
CLR C Gán cờ C=0 CLR C 1 1
CLR BIT Gán BIT =0 CLR P1.0 1 2
SETB C Gán cờ C=1 SETB C 1 1
SETB BIT Gán BIT =1 SETB P1.0 1 2
CPL C Đảo giá trị cờ C. Nếu C=1 thì sau lệnh này C=0 và ngược lại. CPL C 1 1
CPL BIT Đảo giá trị BIT. Nếu BIT=1 thì sau lệnh này BIT=0 và ngược lại. CPL P1.0 1 2
ANL C, BIT Phép AND giữaa cờ C và BIT. Kết quả cất vào C. ANL C,P1.0 2 2
ANL C, BIT Phép AND giữa cờ C và bù của BIT. Kết quả cất vào C. ANL C, /P1.0 2 2
ORL C, BIT Phép OR giữa cờ C và BIT. Kết quả cất vào C. ORL C,P1.7 2 2
ORL C,/BIT Phép OR giữa cờ C và bù của BIT. Kết quả cất vào C. ORL C,/P1.7 2 2
MOV C,BIT Gán cờ C=BIT MOV C,ACC.7 1 2
MOV BIT,C Gán BIT bằng giá trị cờ C MOV ACC.7,C 2 2
JC nhãn Nhảy đến nhãn nếu cờ C =1 JC nhohon 2 2
JNC nhãn Nhảy đến nhãn nếu cờ C=0 JNC nhohon 2 2
JB BIT, nhãn Nhảy đến nhãn nếu BIT = 1 JB P1.0,start 2 3
JNB BIT, nhãn Nhảy đến nhãn nếu BIT = 0 JNB P1.0,start 2 3
JBC BIT, nhãn Nhảy đến nhãn nếu BIT = 1 và sau đó gán BIT = 0 JBC P1.0,main 2 3
Số Độ
Dạng lệnh Mô tả Ví dụ MC dài
LỆNH RẼ NHÁNH CHƯƠNG TRÌNH
ACAL ACAL
nhãn Gọi thực thi chương trịnh con có tên “nhãn”. Sau khi thực thi chương DELAY 2 2
L L
trình con, VXL sẽ thực hiện câu lệnh ngay phía sau câu lệnh gọi này.
LCALL nhãn Cần cất các giá trị thanh ghi được sử dụng trong chương trình con bằng LCALL DELAY 2 3
CALL nhãn các lệnh PUSH/POP CALL DELAY X X
RET Thoát khỏi chương trình con. RET 2 1
RETI Thoát khỏi chương trình phục vụ ngắt RETI 2 1
AJMP nhãn AJMP Main 2 2
LJMP nhãn Nhảy đến nhãn. Số chu kỳ máy của lệnh JMP được quyết định tại thời LJMP Main 2 3
điểm đích phụ thuộc vào khoảng cách từ điểm gọi đến nhãn. Lệnh nhảy
SJMP nhãn này không cần điều kiện. SJMP Main 2 2
JMP nhãn JMP Main X X
JMP @A+DPTR Nhảy đến vị trị cách vị trị được trị bởi DPTR một khoảng là A. JMP @A+DPTR 2 1
JZ nhãn Nhảy đến nhãn nếu thanh ghi A=0 JZ Abang0 2 2
JNZ nhãn Nhảy đến nhãn nếu thanh ghi A khác 0 JNZ Akhac0 2 2
So sánh và nhảy đến nhãn nếu giá trị thanh ghi A không bằng giá trị ô
CJNE A,direct,nhãn CJNE A,B,AkhacB 2 3
nhớ direct
CJNE A,#data,nhãn So sánh và nhảy đến nhãn nếu giá trị thanh ghi A không bằng giá trị data CJNE A,#20,Akhac20 2 3
So sánh và nhảy đến nhãn nếu giá trị thanh ghi Rn không bằng giá trị
CJNE Rn,#data,nhãn CJNE R5,#20,R5khac20 2 3
data.
So sánh và nhảy đến nhãn nếu giá trị ô nhớ được trị bởi Ri (R0 hay R1)
@R0,#20,memkhac2
CJNE @Ri,#data,nha?n không bằng giá trị data.vd: R0=40h, so sánh giá trị ô nhớ 40h với 20 ta CJNE 2 3
0
dùng câu lệnh bên
giảm giá trị thanh ghi Rn (R0 -> R7) đi một đơn vị, sau đó nhảy đến
DJNZ Rn,nhãn DJNZ R7,khackhong 2 2
nha?n nếu Rn khác 0.
giảm giá trị của ô nhớ direct đi 1 rổi nhảy đến nhãn nếu giá trị ô nhớ
DJNZ direct, nhãn direct khác 0. nếu giá trị ô nhớ direct bằng 0 thì thực hiện câu lệnh ngay DJNZ 40h,khackhong 2 3
sau câu lệnh này.
NOP tạm dừng VXL trong 1 chu kỳ máy NOP 1 1
7
4/12/2022
Số Độ
Dạng lệnh Mô tả Ví dụ MC dài
CÂU LỆNH CHUYỂN DỮ LIỆU
MOV A, Rn chép dữ liệu từ thanh ghi Rn vào thanh ghi A MOV A, R7 1 1
MOV A, direct chép dữ liệu từ ô nhơ vào thanh ghi A MOV A, 40h 1 2
MOV A, @Ri chép dữ liệu từ ô nhớ được trị bởi thanh ghi Ri vào thanh ghi A MOV A, @R0 1 1
MOV A, #data gán A bằng con số data MOV A, #10 1 2
MOV Rn, A chép dữ liệu từ thanh ghi A vào thanh ghi Rn MOV R1, A 1 1
MOV Rn, direct chép dữ liệu từ ô nhớ vào thanh ghi Rn MOV R2, 40h 2 2
MOV Rn, #data gán Rn bằng con số data MOV R2,#10 1 2
MOV direct, A chép dữ liệu của A vào ô nhớ MOV 40h, A 1 2
MOV direct, Rn chép dữ liệu của Rn vào ô nhớ MOV 50h, R7 2 2
MOV direct1, direct2 chép dữ liệu từ ô nhớ direct2 vào ô nhớ direct1 MOV 40h, 50h 2 3
MOV direct, @Ri chép dữ liệu từ ô nhớ được trỏ bởi Ri vào ô nhớ direct MOV 40h, @R0 2 2
MOV direct, #data gán nội dung ô nhớ direct bằng giá trị data MOV 50h, #10 2 3
MOV @Ri, A chép dữ liệu trong thanh ghi A vào ô nhớ được trỏ bởi Ri MOV @R0, A 1 1
MOV @Ri, direct chép dữ liệu từ ô nhớ trịc tiếp vào ô nhớ được trỏ bởi Ri MOV @R1, 40h 2 2
MOV @Ri, #data gán nội dung ô nhớ được trỏ bởi Ri bằng giá trị data MOV @R0, #10 1 2
MOV DPTR, #data gán giá trị thanh ghi DPTR bằng data MOV DPtrị #2000h 2 3
chép vào A một byte từ bộ nhớ chương trình tại vị trí cách con trỏ DPTR
MOVC A,@A+DPTR MOVC A, @A+DPTR 2 1
một khoảng là A
chép vào A một byte từ bộ nhớ chương trình tại vị trí cách lệnh hiện hành
MOVC A, @A+PC MOVC A, @A+PC 2 1
một khoảng là A
MOVX A, @Ri chép vào A một byte từ ô nhớ ngoài có địa chỉ được trỏ bởi Ri MOVX A, @R0 2 1
MOVX A, @DPTR chép vào A một byte từ ô nhớ ngoài có địa chỉ được trỏ bởi DPTR MOVX A, @DPTR 2 1
MOVX @Ri, A chép nội dung thanh ghi A vào ô nhớ ngoài được trỏ bởi Ri MOVX @Ri, A 2 1
MOVX @DPTR, A chép nội dung thanh ghi A vào ô nhớ ngoài được trỏ bởi DPTR MOVX @DPTR, A 2 1
PUSH direct cất giá trị ô nhớ direct vào vùng nhớ stack PUSH ACC 2 2
POP direct lấy lại giá trị đã cất ở vùng stack vào ô nhớ direct POP ACC 2 2
XCH A, Rn hoán đổi nội dung hai thanh ghi A và Rn XCH A, R7 1 1
XCH A, direct hoán đổi nội dung thanh ghi A và nội dung ô nhớ direct XCH A, 60h 1 2
XCH A, @Ri hoán đổi nội dung thanh ghi A và nội dung ô nhớ được trỏ bởi Ri XCH A, @R0 1 1
hoán đổi nibble thấp thanh ghi A và nibble thấp của nội dung ô nhớ được trỏ
XCHD A, @Ri XCHD A, @R1 1 1
bởi Ri
Số Độ
Dạng lệnh Mô tả Ví dụ MC dài
LỆNH SỐ HỌC
ADD A, Rn cộng nội dung thanh ghi A và Rn, kết quả cất vào A ADD A, R5 1 1
ADD A, direct cộng nội dung thanh ghi A với ô nhớ direct, kết quả cất vào A ADD A, 70h 1 2
ADD A, @Ri cộng nội dung thanh ghi A với ô nhớ được trỏ bởi Ri, kết quả cất vào A ADD A, @R0 1 1
ADD A, #data cộng nội dung thanh ghi A và con số data, kết quả cất vào A ADD A, #10 1 2
ADDC A, Rn cộng nội dung thanh ghi A và Rn và cộng thêm cờ nhớ C, kết quả cất vào A ADDC A, R7 1 1
ADDC A, direct cộng nội dung thanh ghi A với ô nhớ direct và cộng thêm cờ nhớ C, kết quả cất vào A ADDC A, 41h 1 2
cộng nội dung thanh ghi A với ô nhớ được trỏ bởi Ri và cộng thêm cờ nhớ C, kết quả cất
ADDC A, @Ri ADDC A, @R0 1 1
vào A
ADDC A, #data cộng nội dung thanh ghi A và con số data và cộng thêm cờ nhớ C, kết quả cất vào A ADDC A, #10 1 2
SUBB A, Rn trừ nội dung thanh ghi A và Rn và trừ thêm cờ nhớ C, kết quả cất vào A SUBB A, R7 1 1
SUBB A, direct trừ nội dung thanh ghi A với ô nhớ direct và trừ thêm cờ nhớ C, kết quả cất vào A SUBB A, 41h 1 2
SUBB A, @Ri trừ nội dung thanh ghi A với ô nhớ được trỏ bởi Ri và trừ thêm cờ nhớ C , kết quả cất vào A SUBB A, @R0 1 1
SUBB A, #data trừ nội dung thanh ghi A và con số data và trừ thêm cờ nhớ C, kết quả cất vào A SUBB A, #10 1 2
INC A tăng nội dung thanh ghi A lên 1 đơn vị INC A 1 1
INC Rn tăng nội dung thanh ghi Rn lên 1 đơn vị INC R6 1 1
INC direct tăng nội dung ô nhớ direct lên 1 đơn vị INC 42h 1 2
INC @Ri tăng nội dung ô nhớ được trỏ bởi Ri lên 1 đơn vị INC @R0 1 1
DEC A giảm nội dung thanh ghi A lên 1 đơn vị DEC A 1 1
DEC Rn giảm nội dung thanh ghi Rn lên 1 đơn vị DEC R6 1 1
DEC direct giảm nội dung ô nhớ direct lên 1 đơn vị DEC 43h 1 2
DEC @Ri giảm nội dung ô nhớ được trỏ bởi Ri lên 1 đơn vị DEC @R0 1 1
INC DPTR tăng giá trị thanh ghi DPTR lên 1 đơn vị INC DPTR 2 1
MUL AB nhân nội dung thanh ghi A và thanh ghi B, kết quả: A chứa byte thấp, B chứa byte cao MUL AB 4 1
DIV AB chia A cho B, kết quả: A chứa thương số, B chứa số dữ DIV AB 4 1
hiệu chỉnh BCD cho nội dung thanh ghi A. Nếu digit nào của A (dạng HEX) lớn hơn 9 sẽ
DA A được cộng thêm 6 vào digit đó, ngược lại thì cộng 0. lệnh này chỉ hoạt động đúng cho phép DA A 1 1
cộng.
8
4/12/2022
Số Độ
Dạng lệnh Mô tả Ví dụ MC dài
LỆNH LUẬN LÝ TÁC ĐỘNG TRÊN BYTE
ANL A, Rn Thực hiện AND nội dung thanh ghi A với Rn, kết quả cất vào A ANL A, R7 1 1
ANL A, direct Thực hiện AND nội dung thanh ghi A với ô nhớ direct, kết quả cất vào A ANL A, 45h 1 2
Thực hiện AND nội dung thanh ghi A với ô nhớ có địa chỉ trỏ bởi Ri, kết quả cất vào
ANL A, @Ri ANL A, @R0 1 1
A
ANL A, #data Thực hiện AND nội dung thanh ghi A với con số data, kết quả cất vào A ANL A, #45h 1 2
ANL direct, A Thực hiện AND nội dung ô nhớ direct với thanh ghi A , kết quả cất vào ô nhớ direct ANL 45h, A 1 2
ANL direct, #data Thực hiện AND nội dung ô nhớ direct với con số data , kết quả cất vào ô nhớ direct ANL 45h, #45h 2 3
ORL A, Rn Thực hiện OR nội dung thanh ghi A với Rn, kết quả cất vào A ORL A, R7 1 1
ORL A, direct Thực hiện OR nội dung thanh ghi A với ô nhớ direct, kết quả cất vào A ORL A, 45h 1 2
ORL A, @Ri Thực hiện OR nội dung thanh ghi A với ô nhớ có địa chỉ trỏ bởi Ri, kết quả cất vào A ORL A, @R0 1 1
ORL A, #data Thực hiện OR nội dung thanh ghi A với con số data, kết quả cất vào A ORL A, #45h 1 2
ORL direct, A Thực hiện OR nội dung ô nhớ direct với thanh ghi A , kết quả cất vào ô nhớ direct ORL 45h, A 1 2
ORL direct, #data Thực hiện OR nội dung ô nhớ direct với con số data , kết quả cất vào ô nhớ direct ORL 45h, #45h 2 3
XRL A, Rn Thực hiện XOR nội dung thanh ghi A với Rn, kết quả cất vào A XRL A, R7 1 1
XRL A, direct Thực hiện XOR nội dung thanh ghi A với ô nhớ direct, kết quả cất vào A XRL A, 45h 1 2
Thực hiện XOR nội dung thanh ghi A với ô nhớ có địa chỉ trỏ bởi Ri, kết quả cất vào
XRL A, @Ri XRL A, @R0 1 1
A
XRL A, #data Thực hiện XOR nội dung thanh ghi A với con số data, kết quả cất vào A XRL A, #45h 1 2
XRL direct, A Thực hiện XOR nội dung ô nhớ direct với thanh ghi A , kết quả cất vào ô nhớ direct XRL 45h, A 1 2
XRL direct, #data Thực hiện XOR nội dung ô nhớ direct với con số data , kết quả cất vào ô nhớ direct XRL 45h, #45h 2 3
CLR A Gán A=0 CLR A 1 1
CPL A lấy bù 1 giá trị của A. thực sự là gán A= 255 - A CPL A 1 1
RL A quay trái các bit trong thanh ghi A RL A 1 1
RLC A quay trái các bit trong thanh ghi A có dùng thêm cờ nhớ C RLC A 1 1
RR A quay phải các bit trong thanh ghi A. RR A 1 1
RRC A quay phải các bit trong thanh ghi A có dùng thêm cờ nhớ C. RLC A 1 1
SWAP A hoán đổi nibble cao và nibble thấp của thanh ghi A. SWAP A 1 1
9
4/12/2022
Ví dụ:
▪ MOV A, # 10H ; Nạp giá trị 10H vào thanh ghi A
▪ MOV DPTR, #100H ; Nạp 100H vào con trỏ dữ liệu DPTR
10
4/12/2022
VD
MOV A, RO ; Sao nội dung thanh ghi RO vào thanh ghi A
MOV R2, A ; Sao nội dung thanh ghi A vào thanh ghi R2
ADD A, R5 ; Cộng nội dung thanh ghi R5 vào thanh ghi A
MOV DPTR,A
MOV R1,R2
MOV 56H, A ; Lưu nội dung thanh ghi A vào ngăn nhớ 56H của RAM
MOV R4, 7FH ; Chuyển nôi dung ngăn nhớ 7FH của RAM vào R4
11
4/12/2022
12
4/12/2022
Xác định giá trị chứa trong các thanh ghi sau
khi hoàn thành đọan chương trình
1 2
Mov R0,#10 Mov 20,#15
Mov 15,R0 Mov R1,20
Mov A,15 Mov A,R1
R0= …; A=…; R1= …; A=…;
3 4
Mov A,#10 Mov A,#20
Mov 55,A Mov 20,#15
Mov R0,55 Mov P0,@A
R0= …; A=…; P0= …; A=…;
13
4/12/2022
14
4/12/2022
MOV A, #4EH
MOVX @DPTR, A ; ghi giá trị 4EH vào ô nhớ ngoài có địa chỉ 1000
c. Lệnh liên quan đến vùng nhớ chương trình (đọc mã lệnh):
- Cú pháp: MOVC A,@A+DPTR
- Thực hiện: lấy nội dung ô nhớ trong vùng nhớ chương trình có địa chỉ là nội dung
thanh ghi A + DPTR đặt vào thanh ghi A.
- Ví dụ 1:
MOV A,#2
MOV DPTR,#500
MOVC A,@A+DPTR ; A (502)
- Ví dụ 2:
MOV A, #4
MOV DPTR,#TABLE
MOVC A, @A+DPTR
TABLE: DB 12H, 4EH, 0C7H, 084H, 055H,……
15
4/12/2022
b. Cộng có nhớ:
16
4/12/2022
2. Lệnh trừ:
- Cú pháp: SUBB A, <NGUỒN>
Trong đó: <NGUỒN> có thể là thanh ghi, ô nhớ, #<giá trị> hoặc @Rp
- Thực hiện: A A - <NGUỒN> - C (carry bit)
3. Lệnh nhân:
- Cú pháp: MUL AB
- Thực hiện: A * B = BA (B: byte cao của kết quả; A: byte thấp của kết quả)
4. Lệnh chia:
- Cú pháp: DIV AB
17
4/12/2022
- Thực hiện: nhảy đến vị trí được chỉ định bởi <NHÃN>, <NHÃN> có thể nằm ở bất
kì vị trí nào trong chương trình.
2. Lệnh nhảy có điều kiện:
a. Lệnh so sánh và nhảy nếu không bằng (compare and jump if not equal)
- Cú pháp:
CJNE A, <TOÁN HẠNG >, <NHÃN>
Trong đó <TOÁN HẠNG> có thể là thanh ghi, ô nhớ hoặc #<giá trị>
- Thực hiện: So sánh A và <TOÁN HẠNG>, nếu:
+ A ≠ <TOÁN HẠNG>: nhảy đến <NHÃN> và nếu:
. A > <TOÁN HẠNG>: bit C = 0
. A < <TOÁN HẠNG>: bit C = 1
+ A = <TOÁN HẠNG>: thực hiện lệnh kế tiếp
- Một dạng khác của lệnh:
CJNE Ri/@Rp, #<GIÁ TRỊ>, <NHÃN>
b. Lệnh giảm nội dung Ri một đơn vị và nhảy nếu bằng zero (decrement Ri by 1
and jump if not zero):
- Cú pháp: DJNZ Ri, <NHÃN>
- Thực hiện: Ri = Ri - 1, nếu:
+ Ri > 0: nhảy đến <NHÃN>
+ Ri =0: thực hiện lệnh kế tiếp
c. Lệnh nhảy phụ thuộc vào trạng thái bit kiểm tra:
- Cú pháp: JB/ JNB BIT, <NHÃN>
Trong đó: BIT có thể là các bit của một thanh ghi hoặc các chân I/O của vi điều khiển
- Thực hiện: nhảy đến vị trí chương trình được chỉ định bởi <NHÃN> nếu BIT bằng 1
hoặc bằng 0
d. Lệnh nhảy thông qua việc kiểm tra cờ CARRY:
- Cú pháp: JC/ JNC <NHÃN>
- Thực hiện: nhảy đến vị trí chương trình được chỉ định bởi <NHÃN> nếu C bằng 1
hoặc bằng 0
18
4/12/2022
19
4/12/2022
4. Biên dịch
20
4/12/2022
5. Debug
21
4/12/2022
22
4/12/2022
23
4/12/2022
24
4/12/2022
Xây dựng lưu đồ thuật toán và viết chương trình tạo trể 50ms
Xây dựng lưu đồ thuật toán và viết chương trình tạo trể 100ms
Xây dựng lưu đồ thuật toán và viết chương trình tạo trể 500ms
Xây dựng lưu đồ thuật toán và viết chương trình điều khiển
bóng đèn led sáng tắt 10 lần
Xây dựng lưu đồ thuật toán và viết chương trình điều khiển
bóng đèn led sáng 500ms tắt 500ms và lặp lại vô hạn.
Xây dựng lưu đồ thuật toán và viết chương trình điều khiển
bóng đèn led sáng 500ms khi ấn công tắc và tự tắt.
Xây dựng lưu đồ thuật toán và viết chương trình điều khiển
đếm số lần ấn công tắc.
Xây dựng lưu đồ thuật toán , viết chương trình điều khiển đếm
số lần ấn công tắc, nếu công tắc ấn đủ 10 lần thì đèn sáng.
25