You are on page 1of 25

4/12/2022

Chương 3 Hợp ngữ


 Phân biệt được loại địa chỉ
 Phân tích được các câu lệnh (ý nghĩa, thời gian thực
hiện)
 Áp dụng viết chương trình đơn giản

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

3.2.Cấu trúc của hợp ngữ.


 Một chương trình hợp ngữ bao gồm một chuỗi các
dòng lệnh hợp ngữ.
 Một lệnh hợp ngữ có chứa một từ gợi nhớ (memonic)
và tuy theo từng lệnh và sau nó có một hoặc hai toán
hạng.
 Các toán hạng là các dữ liệu cần được thao tác và các
từ gợi nhớ là các lệnh đối với CPU nói nó làm gì với
các dữ liệu.

3.2.1Cấu trúc của hợp ngữ.


ORG 00H ; Bắt đầu (origin) tại ngăn nhớ 0
COUNT EQU 25
ORG 500H
DATA1: DB 2BH ; Số thập phân (2B ở dạng Hex)
MOV R5, #01101H ; Nạp 01101H vào R5
MOV R7, #01101B ; Nạp 01101B vào R7
MOV R6, #01101 ; Nạp 01101 vào R6
Lap :
MOV A, #0 ; Nạp 0 vào thanh ghi A
ADD A, R5 ; Cộng nôi dụng R5 vào A (A = A + R5)
ADD A, R7 ; Cộng nội dung R7 vào A (A = A + R7)
ADD A, #0AH; Cộng giá trị 0AH vào A (A = A + 0AH)
SJMP lap ; Nhảy đến vòng lặp này
END ; Kết thúc file nguồn hợp ngữ

2
4/12/2022

3.2.2.Cấu trúc câu lệnh của hợp ngữ.


Cấu trúc của một lệnh hợp ngữ có 4 trường như sau:
 [nhãn:] [từ gợi nhớ] [các toán hạng] [; chú giải]
 Ví dụ: Batdau: mov R0, #00H ; xóa thanh ghi R0
 Trường nhãn cho phép chương trình tham chiếu đến một
dòng lệnh bằng tên. Nó không được viết quá một số ký tự
nhất định.
 Từ gợi nhớ (lệnh) và các toán hạng là các trường kết hợp
với nhau thực thi công việc thực tế của chương trình và
hoàn thiện các nhiệm vụ mà chương trình được viết cho
chúng.
 Trường chú thích luôn phải bắt đầu bằng dấu chấm phẩy
(;).

3.2.3.Chỉ lệnh hợp ngữ.


Chỉ lệnh ORG: dùng để báo bắt đầu của địa chỉ.
 Số đi sau ORG có kể ở dạng Hex hoặc thập phân. Nếu số này có kèm
chữ H đằng sau thì là ở dạng Hex và nếu không có chữ H ở sau là
số thập phân và hợp ngữ sẽ chuyển nó thành số Hex. Một số hợp
ngữ sử dụng dấu chấm đứng trước “ORG” thay cho “ORG”.
Chỉ lệnh EQU: Được dùng để định nghĩa một hằng số mà không
chiếm ngăn nhớ nào.
 Chỉ lệnh EQU không dành chỗ cất cho dữ liệu nhưng nó gắn một
giá trị hằng số với nhãn dữ liệu sao cho khi nhãn xuất hiện trong
chương trình giá trị hằng số của nó sẽ được thay thế đối với nhãn.

 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.

3.3. Biên soạn và dịch


1. Biên soạn : Có nhiều trình soạn thảo được sử dụng để
tạo ra hoặc để soạn thảo chương trình: trình soạn
thảo EDIT (MS-DOS), Notepad ( Windows) đều chạy
trên hệ điều hành Microsoft.
 Trình soạn thảo phải có khả năng tạo ra file mã ASCII.
2.File nguồn chứa mã chương trình tạo ra được nạp
vào trình hợp dịch của 8051. Trình hợp dịch chuyển
các lệnh ra mã máy. Trình hợp dịch sẽ tạo ra một file
đối tượng và một file liệt kê với các thành phần mở
rộng “obj” và “lst” tương ứng.

4
4/12/2022

Biên soạn và dịch


3. Các trình hợp dịch yêu cầu một bước liên kết.
Chương trình liên kết lấy một hoặc nhiều file đối
tượng và tạo ra một file đối tượng tuyệt đối với thành
phần mở rộng “abs”. file “abs” này được sử dụng bởi
thùng chứa của 8051 có một chương trình giám sát.
4. File “abs” được nạp vào một chương trình được “0H”
(chuyển đối tượng object về dạng số Hex) để tạo ra
một file với đuôi mở rộng “Hex” để nạp vào trong
ROM.

Các đặc điểm cần có của một chương trình

 Đúng đắn, chính xác (correctness).


 Chắc chắn (robustness).
 Thân thiện (user friendliness).
 Khả năng thích nghi (adapability): Chương trình có khả năng
để phát triển tiến hóa theo yêu cầu.
 Tính tái sử dụng (reuseability): Chương trình có thể dùng để
làm một phần trong một chương trình lớn khác.
 Tính hiệu quả (efficiency).
 Tính khả chuyển (porability): Khả năng chuyển đổi giữa
 các môi trường.
 Tính an toàn (security).
 Tính dừng (halt).

5
4/12/2022

CÁC BƯỚC VIẾT MỘT CHƯƠNG TRÌNH

 Đọ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

3.5.2. Chế độ địa chỉ


 CPU có thể truy cập dữ liệu theo nhiều cách khác
nhau.
 Dữ liệu có thể ở trong một thanh ghi hoặc trong bộ
nhớ hoặc được cho như một giá trị tức thời
 Các cách truy cập dữ liệu khác nhau được gọi là các
chế độ đánh địa chỉ.
1. Tức thời
2. Theo thanh ghi
3. Trực tiếp
4. Gián tiếp qua thanh ghi
5. Theo chỉ số

9
4/12/2022

3.5.2. Chế độ địa chỉ


1. Tức thời
2. Theo thanh ghi
3. Trực tiếp
4. Gián tiếp qua thanh ghi
5. Theo chỉ số
Ví dụ: MOV <toán hạng đích>, <toán hạng nguồn>
MOV A,100
MOV A,#100
MOV A,R1
MOV A,@R1
MOV A,@a+DPTR

Chế độ đánh địa chỉ tức thời


 Toán hạng nguồn là một hằng số.
 Trước dữ liệu tức thời phải được đặt dấu (#)
 Chế độ đánh địa chỉ này có thể được dùng để nạp thông tin vào bất kỳ
thanh ghi nào kể cả thanh ghi con trỏ dữ liệu DPTR.

 Ví dụ:
▪ MOV A, # 10H ; Nạp giá trị 10H vào thanh ghi A

▪ MOV R4, #10B ; Nạp giá trị 10 nhị phân vào R4

▪ MOV B, #10 ; Nạp giá trị 10 vào thanh ghi B

▪ MOV DPTR, #100H ; Nạp 100H vào con trỏ dữ liệu DPTR

▪ Chi chú: độ lớn thanh ghi, độ lớn giá trị (…..)

10
4/12/2022

Chế độ đánh địa chỉ theo thanh ghi:


 Chế độ đánh địa chỉ theo thanh ghi liên quan đến việc sử
dụng các thanh ghi để dữ liệu cần được thao tác
 Thanh ghi nguồn và đích phải phù hợp về kích thước.
 Có thể chuyển dữ liệu giữa thanh ghi tích luỹ A và
thanh ghi Rn (n từ 0 đến 7) nhưng việc chuyển dữ liệu
giữa các thanh ghi Rn thì không được phép.

 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

Chế độ đánh địa chỉ trực tiếp


 8051 có 128 byte bộ nhớ RAM, được gán các địa chỉ từ
00 đến FFH
 Thường được sử dụng để truy cập các ngăn nhớ RAM từ
30H đến 7FH.
 Trong chế độ đánh địa chỉ trực tiếp thì dữ liệu ở trong
một ngăn nhớ RAM mà địa chỉ của nó được biết và địa
chỉ này được cho như là một phần của lệnh.
 VD:
MOV R0, 40H ; Lưu nội dung của ngăn nhớ 40H của RAM vào R0

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

Chế độ địa chỉ gián tiếp thanh ghi


 Trong chế độ này, một thanh ghi được sử dụng như
một con trỏ đến dữ liệu.
 Nếu dữ liệu ở bên trong CPU thì chỉ các thanh
ghi R0 và R1 được sử dụng cho mục đích này.
 Chế độ đánh địa chỉ này khi Ro và R1 được dùng
như các con trỏ, nghĩa là khi chúng giữ các địa chỉ của
các ngăn nhớ RAM
 Trước chúng phải đặt dấu (@).
 VD:
MOV A, @ R0 ; Chuyển nội dung của ngăn nhớ RAM có địa
chỉ trong RO và A
MOV @ R1, B ; Chuyển nội dung của B vào ngăn nhớ RAM
có địa chỉ ở R1

Chế độ địa chỉ chỉ số


 Trong chế độ này được dùng trong các ứng dụng cần
tạo các bảng nhảy hay các bảng tìm kiếm.
 Kiểu định địa chỉ này dùng một thanh ghi nền (PC hay
DPTR) kết hợp với một offset(A) để tạo thành địa chỉ
hiệu dụng, được sử dụng như một con trỏ dữ liệu.
VD ... Mov R0,#00
LAP: Mov A,R0
MOV DPTR,#MaLed7
MOVC A,@A+DPTR
MOV P0,A
INC R0
SJMP LAP
MaLed7: DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,90h
END

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=…;

3.5.2. NHÓM LỆNH DI CHUYỂN DỮ LiỆU:


1. Lệnh di chuyển dữ liệu trực tiếp:
- Cú pháp: MOV <ĐÍCH>, <NGUỒN>
Trong đó:
. <ĐÍCH>: có thể là thanh ghi, địa chỉ ô nhớ trong vùng RAM nội
. <NGUỒN>: có thể là thanh ghi, địa chỉ ô nhớ trong vùng RAM nội
hoặc #<giá trị>
- Thực hiện: di chuyển nội dung <NGUỒN> vào <ĐÍCH>
- Ví dụ:
MOV A, 120
MOV B, #24
MOV 120,#10110010B
MOV R3, A
MOV P3,#3EH

13
4/12/2022

2. Nhóm lệnh di chuyển dữ liệu gián tiếp:


a. Liên quan đến vùng nhớ RAM nội:
+ Lệnh đọc bộ nhớ:
- Cú pháp: MOV <ĐÍCH>, @Rp
Trong đó:
. <ĐÍCH>: thanh ghi, ô nhớ
. Rp: là thanh ghi R0 hoặc R1
- Thực hiện: lấy nội dung ô nhớ trong vùng RAM nội có địa chỉ là nội dung
thanh ghi Rp đặt vào <ĐÍCH>
- Ví dụ:
MOV 120,#47
MOV R1,#120
MOV A,@R1
; sau khi thực hiện xong đoạn lệnh nội dung thanh ghi A chứa giá trị 47

+ Lệnh ghi bộ nhớ:


- Cú pháp: MOV @Rp, <NGUỒN>
Trong đó:
. <NGUỒN>: thanh ghi, ô nhớ hoặc #<giá trị>
. Rp: là thanh ghi R0 hoặc R1
- Thực hiện: đặt nội dung <NGUỒN> vào ô nhớ trong vùng RAM nội có địa chỉ
là nội dung thanh ghi Rp.
- Ví dụ 1:
MOV R0,#100
MOV @R0, #0E3H
; sau khi thực hiện xong đoạn lệnh nội dung ô nhớ 100 chứa giá trị E3H
- Ví dụ 2:
MOV A, #49
MOV R1,#127
MOV @R1, A ; (127) = 49

14
4/12/2022

b. Liên quan đến vùng nhớ dữ liệu ngoài:


+ Lệnh đọc bộ nhớ:
- Cú pháp: MOVX A, @DPTR
- Thực hiện: lấy nội dung ô nhớ trong vùng dữ liệu ngoài có địa chỉ là nội dung
thanh ghi DPTR đặt vào thanh ghi A
- Ví dụ:
MOV DPTR,#1000
MOVX A, @DPTR ; A  (1000)
+ Lệnh đọc bộ nhớ:
- Cú pháp: MOVX @DPTR, A
- Thực hiện: lấy nội dung A đặt vào ô nhớ trong vùng dữ liệu ngoài có địa chỉ là
nội dung thanh ghi DPTR.
- Ví dụ:
MOV DPTR,#1000

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

3 Nhóm lệnh liên quan đến ngăn xếp:


+ Ghi vào ngăn xếp:
- Cú pháp: PUSH Thanh ghi/ địa chỉ
- Thực hiện: cất nội dung thanh ghi hoặc ô nhớ vào đỉnh ngăn xếp
+ Đọc ngăn xếp:
- Cú pháp: POP Thanh ghi/ địa chỉ
- Thực hiện: lấy nội dung ở đỉnh ngăn xếp gán vào thanh ghi, ô nhớ
+ ví dụ: MOV A,#100
MOV 100,#3EH
PUSH ACC
PUSH 100
MOV A, #21H
MOV 100, #40
POP 100
POP ACC

4. Lệnh trao đổi dữ liệu:


- Cú pháp: XCH A, <NGUỒN>
Trong đó: <NGUỒN> có thể là thanh ghi, ô nhớ hoặc @Rp
- Thực hiện: trao đổi nội dung thanh ghi A và <NGUỒN>

3.5.2. NHÓM LỆNH SỐ HỌC


1. Lệnh cộng:
a. Cộng không nhớ:
- Cú pháp: ADD 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>

b. Cộng có nhớ:

- Cú pháp: ADDC 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

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

- Thực hiện: A : B = A dư B (A: chứa phần nguyên; B: chứa phần dư)

5. Lệnh tăng một đơn vị:


- Cú pháp: INC <ĐÍCH>
Trong đó: <ĐÍCH> có thể là thanh ghi, ô nhớ
- Thực hiện: <ĐÍCH> = <ĐÍCH> + 1
6. Lệnh giảm một đơn vị:
- Cú pháp: DEC <ĐÍCH>
Trong đó: <ĐÍCH> có thể là thanh ghi, ô nhớ
- Thực hiện: <ĐÍCH> = <ĐÍCH> - 1

6. Lệnh giảm một đơn vị:


- Cú pháp: DEC <ĐÍCH>
Trong đó: <ĐÍCH> có thể là thanh ghi, ô nhớ
- Thực hiện: <ĐÍCH> = <ĐÍCH> - 1

3.5.3. NHÓM LỆNH NHẢY:


1. Lệnh nhảy không điều kiện:
a. Nhảy gần:
- Cú pháp: SJMP <NHÃN>
Trong đó: <NHÃN> là một từ, hay nhóm từ viết liền nhau, theo sau bằng dấu ”:”
dùng để đánh dấu vị trí chương trình.
- Thực hiện: nhày không điều kiện đến vị trí chương trình được chỉ định bởi
<NHÃN>, khoảng cách từ lệnh đến <NHÃN> không vượt quá 128 byte mã lệnh.
b. Nhảy xa:
- Cú pháp: LJMP <NHÃN>

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

e. Lệnh nhảy thông qua việc kiểm tra cờ ZERO:


- Cú pháp: JZ/ JNZ <NHÃN>
- Thực hiện: nhảy đến vị trí chương trình được chỉ định bởi <NHÃN> nếu Z bằng 1
hoặc bằng 0

3.5.4 NHÓM LỆNH LOGIC:


1. ANL A, <NGUỒN>
2. ORL A, <NGUỒN>
3. XRL A, <NGUỒN>
4. CLR A ; xóa nội dung thanh ghi A
5. SETB
6.CPL A ; đảo các BIT trong thanh ghi A
7. NOP ; lệnh không thực hiện, bỏ qua khi gặp lệnh này
8. SWAP A ; đảo vị trí 4 bit cao và 4 bit thấp trong thanh ghi A

8 Nhóm lệnh quay vòng:


a. Quay phải thanh ghi A
- Cú pháp: RR A
Bit 7 ------------------>- bit 0
- Thực hiện:
b. Lệnh quay trái thanh ghi A:
- Cú pháp: RL A
- Thực hiện: Bit 7 --<----------------- bit 0

c. Lệnh quay trái thanh ghi A với cờ C:


- Cú pháp: RLC A
- Thực hiện: Bit 7 --<----------------- bit 0 C

d. Lệnh quay phải thanh ghi A với cờ C:


- Cú pháp: RRC A
- Thực hiện: C Bit 7 --<----------------- bit 0

19
4/12/2022

3.5.6. NHÓM LỆNH LIÊN QUAN ĐẾN CHƯƠNG TRÌNH CON:


1. CALL <TÊN CHƯƠNG TRÌNH CON> ; gọi chương trình con
2. RET ; kết thúc chương trình con
3. RETI ; kết thúc chương trình ngắt

4. Biên dịch

20
4/12/2022

File “*.hex” được tạo ra


Để biết chính xác File “*.hex” được tạo đã lưu ở vị trí nào trên
máy tính hoặc thay đỏi vị trí lưu của “*.hex” thì chọn “Select
Forlder for Objects”

5. Debug

Kĩ thuật 1: Break Point và Run Step by Step


Chương trình luôn chạy liên tục và dừng tại điểm Break Point
Kĩ thuật 2: Watch Window
Chương trình hoạt động cho phép quan sát sự thay đổi về biến (Watch Variable), bộ nhớ
(Watch Memory), thanh ghi (Watch Register) …

21
4/12/2022

Nội dung ôn tập

 Ý nghĩa mỗi câu lệnh ASM.


 Chu kỳ máy và thời gian thực hiện mỗi câu lệnh.
 Xây dựng lưu đồ thuật toán chương trình xử lý.
 Vòng lặp, chương trình con.
 Tính thời gian thực hiện chương trình, vòng lặp.
 Tính toán để xây dựng chương trình tạo trể.

Bài tập tại lớp


 Vẽ lưu đồ thuật toán và viết chương trình:
 Điều khiển led sáng tắt với thời gian giữ chậm( trễ)
cho trước
 Điều khiển led sáng tắt với thời gian giữ chậm( trễ)
cho trước và lặp lại vô hạn
 Điều khiển led sáng tắt với thời gian giữ chậm( trễ)
cho trước và lặp lại n lần
 Điều khiển 8 led sáng lần lược với thời gian giữ
chậm( trễ) cho trước.
 Điều khiển 8 led sáng lần lược khi nhấn con tắc.

22
4/12/2022

Bài tập 1 Chỉ ra câu lệnh sai và giải


thích lí do
1 2
 CL1: Mov R0,DPTR  CL1: Mov R1,R2
 CL2: Mov 10,#15h  CL2: Mov A,1010B
…… ……
…… ……
3 4
 CL1: Mov 10B,#15  CL1: Mov 10,#150H
 CL2: Mov R0,@R3  CL2: Mov R0,@A
…… ……
…… ……

Bài tập 2:Giải thích ý nghĩa các câu


lệnh
ORG 00h
Mov R0,#00
LAP: Mov A,R0
MOV DPTR,#MaLed7
MOVC A,@A+DPTR
MOV P0,A
INC R0
SJMP LAP
MaLed7: DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,90h
END

23
4/12/2022

Bài tập 3:Giải thích ý nghĩa các câu


lệnh và kết quả
ORG 00h ORG 00h
Mov R0,#10 Mov R0,#10
LAP: Mov P0,#55H LAP: Mov P0,#85
MOV P0,#0AAH MOV P0,#170
DJNZ R0,LAP DJNZ R0,LAP
END END
ORG 00h ORG 00h
Mov R0,#10 Mov R0,#10
LAP: Mov P0,#10101010B Mov A,#10101010B
LAP: Mov P0,A
MOV P0,#01010101B
CPL A
DJNZ R0,LAP DJNZ R0,LAP
END END

Bài tập 4: 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 10,#15  Mov R1,#20
 Mov A,@R0  Mov A,@R1
R0= …; A=…; R1= …; A=…;
3 4
 Mov A,#10  Mov A,#10
 Mov 10,#15  Mov 10,#15
 Mov R0,@A  Mov P0,@A
R0= …; A=…; P0= …; A=…;

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

You might also like