Tải bản đầy đủ (.doc) (8 trang)

Lập trình hợp ngữ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (92.22 KB, 8 trang )

CHƯƠNG 3
LẬP TRÌNH BẰNG HỢP NGỮ MCS51
Lập trình hợp ngữ (assembly language programming) cho họ vi điều khiển MCS51.
Một chương trình viết bằng hợp ngữ (chương trình hợp ngữ) là chương trình được viết bằng
việc sử dụng các câu lệnh trong tập lệnh của họ vi điều khiển với các mã lệnh dưới dạng mã
gợi nhớ.
Chương trình hợp ngữ thường được gọi là chương trình nguồn hay mã nguồn được một
chương trình biên dịch (chương trình dịch) dịch ra thành ngôn ngữ máy dưới dạng mã nhị
phân và được nạp vào bộ nhớ chương trình của vi điều khiển thông qua một máy nạp
chương trình (Programmer).
Hiện nay có rất nhiều chương trình biên dịch cho họ vi điều khiển MCS51 (Keil
µVision, RCHPSIM….) đã và đang được sử dụng. Tuy nhiên trong chương này sẽ sử dụng
chương trình Keil µVision3 để soạn thảo và biên dịch chương trình hợp ngữ. Keil µVision
được hình thành và phát triển từ năm 1985, phần mềm biên dịch này hỗ trợ cho nhiều dòng
vi điều khiển khác nhau với hai loại ngôn ngữ chính là hợp ngữ và C cho vi điều khiển.
3.1 Cấu trúc chương hợp ngữ
3.1.1 Quy tắc đặt tên nhãn, tên chương trình, biến, hằng số :
• Không được trùng với các từ khóa
• Không dài quá 31 ký tự, không phân biệt chữ hoa hay chữ thường
• Không tồn tại các dấu cách trong tên và các ký tự đặc biệt
• Tên thường bắt đầu các chữ cái và có tính chất gợi nhớ
• Riêng tên nhãn và tên chương trình phải kết thúc bằng dấu “:”
3.1.2 Khai báo biến, hằng số:
Có nhiều cách khai báo biến và hằng số trong chương trình hợp ngữ sử dụng Keil
µVision. Tuy nhiên để dễ nhớ người lập trình nên sử dụng câu lệnh khai báo với cú pháp:
Tên Biến EQU Giá trị ; chú thích
Tên Hằng số EQU Giá trị hằng ; chú thích
VD:
Buffer1 EQU 50h ; Biến Buffer1 được gán giá trị 50H
Constant_A EQU 10 ; Hằng số Constant_A được gán 10 (=0AH)
3.1.3 Khai báo chương trình con:



Cú pháp:
Tên chương trình con:
; Biến (thanh ghi) vào :…………….
; Biến (thanh ghi) ra: ………………
; Biến (thanh ghi) thay đổi: ………..
; -------------------------------------------------
Câu lênh 1
Câu lệnh 2
…………
Câu lệnh n
Ret
Ví dụ:
Add2_1byte_Hex:
; Biến vào: R0, R1
; Biến ra : Acc ,C flag
; Thanh ghi thay đổi: Acc, C flag
;--------------------------------------------
Mov A, R0
Add A, R1
Ret
3.1.4 Cấu trúc chương trình hợp ngữ:
;===========Tên chương trình ============
org 00h
nop
sjmp Tên chương trình chính
org 03h ; Ngắt Ex0
nop
reti
org 0bh ; Ngắt Timer0

nop
ljmp Tên ct Phục vụ ngắt / Reti
org 13h ; Ngắt Ex1
nop
ljmp Tên ct Phục vụ ngắt / Reti
org 1bh ; Ngắt Timer1
nop
ljmp Tên ct Phục vụ ngắt / Reti
org 23h ; Ngắt serial
nop
reti
;=========Khai báo Biến Hằng số =========
Biến equ giá trị ; chú thích
……………………………………
Hằng số equ giá trị ; chú thích
………………………………….
;===================================
; m a i n p r o g r a m
;=====================================
Vùng khai báo các Vector ngắt và các chương trình
phục vụ ngắt tương ứng
Lưu ý:
• Khi một ngắt nào đó không dùng thì người
viết chương trình phải kết thúc bằng lệnh
RETI (như ngắt EX0 và ngắt Serial)
• Khi ngắt nào đó được sử dụng thì người
dùng phải viết lệnh
Ljmp Tên Ctrình phục vụ ngắt
(Như ngắt Timer0, Ex1, Timer1)


;===================================
Vùng khai báo biến, hằng số
;===================================
org 50h
Tên chương trình chính:
Lệnh 1
…………
lcall Ctr_con1
…………
here:
sjmp here
;==========Ctrình_con =============
Ctr_con1:
Câu lệnh 1
………….
Lcall Ctr_con2
…………
ret
;================================
Ctr_con2:
Câu lệnh a
………….
Câu lệnh k
…………
ret
;===============================
Ctrinh _ Phục vụ ngắt
;===============================
Tên ct Phục vụ ngắt1 :


Câu lệnh 1
………….
Câu lệnh m
…………
Lcall Ctr_con2
…………
Reti
;===============================
Tên ct Phục vụ ngắt2 :

Câu lệnh a
………….
Câu lệnh h
…………
Lcall Ctr_con m
…………
reti
;==============================
End
;===================================
;===================================
Lệnh định địa chỉ đầu của Ctrình chính trong ROM
Lệnh goi Ctrình con1 trong Ctrình chính
Tạo vòng lặp vô tận
;====================================
Vùng viết các Ctrình con
Lưu ý:
Trong 1 Ctrình con có thể gọi các Ctrình con khác

;===================================

Vùng viết các Ctrình phục vụ ngắt
Lưu ý:
Trong 1 Ctrình phục vụ ngắt có thể gọi các Ctrình
con khác
;====================================
Câu lệnh kết thúc Ctrình

3.2 Quản lý bảng số liệu, phép tính nhiều byte
3.2.1 Quản lý bảng số liệu
Bảng số liệu (Mảng, số nhiều byte) thường được lưu trữ trong 1 vùng nhớ nằm trong bộ nhớ
chương trình. Khi thao tác với một bảng số liệu người lâp trình sẽ cần phải biết cách khai
báo bảng số liệu, qua đó xác định được địa chỉ đầu của bảng số liệu, số lượng byte trong 1
bảng số liệu. Để trên cơ sở đó thực hiện các phép toán trên bảng số liệu đó
a. Khai báo bảng số liệu:
Cú pháp1 : (theo kiểu Byte - DB)
Tên bảng:
DB Gtrị1, Gtrị2, ……, Gtrị N
Chú ý :
• Các giá trị có thể ở các dạng khác nhau
(DEC, HEX, BIN,ASCII)
• Có thể tồn tại nhiều bảng khác nhau
trong 1 chương trình
• Các giá trị trên cùng một dòng, nếu phải
khai báo nhiều thì phải khai báo như sau:
Tên bảng:
DB Gtrị1
DB Gtrị 2
……………..
DB Gtrị N
• Cách này người lập trình khó biết chính

xác địa chỉ đầu của bảng số liệu
Cách 2: Kết hợp với lệnh định địa chỉ con trỏ
Org Địa chỉ
Tên bảng:
DB Gtrị1, Gtrị2, ……, Gtrị N
Lưu ý:
• Người lập trình phải cẩn thận trong việc
lựa chọn địa chỉ đầu của bảng, vì có thể
vùng nhớ này đang được chương trình sử
dụng . Vì vậy thông thường bảng hay
được đặt tại vùng cuối cùng của bộ
nhớ chương trình
Cú pháp1:
Ví dụ1
Table1:
DB 05, 10, 10H, ‘Abc’, 0F8H, ‘5’
Address_Table1 Gtrị (hex)
[ Table1 +00] h 05
[ Table1 +01] h 0A
[ Table1 +02] h 10
[ Table1 +03] h 41
[ Table1 +04] h 62
[ Table1 +05] h 63
[ Table1 +06] h F8
[ Table1 +07] h 35
Bảng có tên Table1 có 8 byte trong miền nhớ
có địa chỉ đầu được chương trình dịch tự
động cấp phát
Ví dụ2:
Org 8000h

Table2:
DB 05, 10, 10H, ‘Abc’, 0F8H, ‘5’
Address_Table2 Gtrị (hex)
[ 8000] h 05
[ 8001] h 0A
[ 8002] h 10
[ 8003] h 41
[ 8004] h 62
[ 8005] h 63
[ 8006] h F8
[ 8007] h 35
Cú pháp2 : (theo kiểu Word - DW)
Tên bảng:
DW Gtrị1, Gtrị2, ……, Gtrị N
Tương tự như sử dụng theo kiểu định nghĩa
theo Byte chỉ có khác là mỗi giá trị phải
được lưu vào 2 byte
Cú pháp2:
Ví dụ1
Table3:
DW 05, 10, ‘5’, 0F8AH,
Address_Table3 Gtrị (hex)
[ Table3 +00] h 00
[ Table3 +01] h 05
[ Table3 +02] h 00
[ Table3 +03] h 0A
[ Table3 +04] h 00
[ Table3 +05] h 35
[ Table3 +06] h 0F
[ Table3 +07] h 8A

Bảng có tên Table3 có 8 byte trong miền nhớ
có địa chỉ đầu được chương trình dịch tự
động cấp phát (với)
b. Phép tính nhiều byte:
Khi thực hiện các phép tính (cộng trừ,…) người lập trình phải xác định được kết quả
là số mấy byte để có phương án xác định vùng nhớ nào sẽ lưu giữ kết quả của phép tính.
Các thao tác đối với một bảng số liệu thường là đọc và viết vào bảng thông qua con trỏ
( pointer) với các lệnh :
Nếu bảng trong vùng RAM trong của MCS51 :
Lệnh đọc từ vùng nhớ Movx A, @Ri ; (Ri là R0, R1)
Lệnh viết vào vùng nhớ Movx @Ri, A ; (Ri là R0, R1)
Nếu bảng trong vùng RAM ngoài của MCS51 :
Lệnh đọc từ vùng nhớ Movx A, @Dptr
Movx A, @A+Dptr
Lệnh viết vào vùng nhớ Movx @Dptr, A
Nếu bảng trong vùng ROM của MCS51 :
Lệnh đọc từ vùng nhớ Movc A, @A+Dptr
Movx A, @A+PC
Ví dụ:
Viết đoạn trình chuyển hai mảng dữ liệu 50 byte. Biết mảng 1 có địa chỉ 50h trong Ram
trong và mảng 2 có địa chỉ 1234h ở RAM ngoài.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×