1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Lập trình hợp ngữ

8 1,5K 16
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Hợp Ngữ
Trường học Trường Đại Học Khoa Học Tự Nhiên
Chuyên ngành Công Nghệ Thông Tin
Thể loại Bài Tập
Thành phố Hồ Chí Minh
Định dạng
Số trang 8
Dung lượng 100,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lập trình hợp ngữ là ngôn ngữ bậc thấp Các VXL chỉ làm việc với các chỉ thị lệnh ở dạng nhị phân và đang ở trong bộ nhớ chính của hệ thống vi xử lý.

Trang 1

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:

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)

Trang 2

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ố

Trang 3

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

Trang 4

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)

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)

Trang 5

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)

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

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

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

Trang 6

Đoạn chương trình Lưu đồ thuật toán

mov R0,#50H

mov dptr,#1234H

mov R2,#50

Loop:

mov A,@dptr

xch A,@R0

movx @dptr,A

inc R0

inc dptr

djnz R2,Loop

Start

Dptr ← #1234H R0 ← #50H R2 ← #50

A←@dptr A↔ @R0

@dptr←A dptr +1 R0 + 1 R2 - 1

R2 = 0 Yes No

End

Trang 7

Ví dụ 2:

Viết chương trình trừ hai số 8 byte, kết quả cất vào số thứ 1 Biết số thứ nhất đặt tại ô nhớ 1000H tại RAM ngoài và số thứ hai đặt tại 60H RAM trong và LSB đặt tại ô có địa chỉ thấp nhất

org 00h

nop

sjmp Start

org 03h ; Ngắt Ex0

nop

reti

org 0bh ; Ngắt Timer0

nop

reti

org 13h ; Ngắt Ex1

nop

reti

org 1bh ; Ngắt Timer1

nop

reti

org 23h ; Ngắt serial

nop

reti

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

; m a i n p r o g r a m

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

org 50h

Start:

clr C

mov R1,#08H

mov R0,#60H

mov dptr,#1000H

Lap:

mov A,@dptr

subb A,@R0

movx @dptr,A

inc R0

inc dptr

djnz R1,Lap

End

Start

xóa cờ C R1#8 R0←#60H dptr←#1000H

A← @dptr A←A-@R0-C

@dptr←A R0+1 dptr+ 1 R1- 1

R1 = 0 Yes No

End

Trang 8

c Tra bảng:

Tra bảng dùng để tìm ra giá trị xác định do người lập trình đã tính toán và tạo ra bảng

số liệu sẵn của một hàm hay một công thức nào đó, thông thường là các hàm siêu việt, bảng mã …,vì vậy các bảng số liệu sẽ được lưu trong bộ nhớ chương trình Do đó khi thao tác với bảng số liệu sẽ sử dụng các câu lênh sau:

; -Look_up_Table:

mov dptr,#Table ; lấy điạ chỉ bảng đưa vào thanh ghi Dptr movc a,@a+dptr ; lấy giá trị trong bảng tương ưng với giá trị của A ret

; -Table:

db 0c0h, 0f9h, 0a4h, 0b0h, 099h, 092h, 082h, 0f8h, 080h, 090h

; -

3.3 Đổi mã ASCII-BCD-HEX

3.4 Điều khiển vào ra: tra mức, sườn tín hiệu, điều khiển quét

3.5 Ngắt trong MCS51: Ngắt ngoài

Ngày đăng: 12/10/2012, 15:29

HÌNH ẢNH LIÊN QUAN

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 - Lập trình hợp ngữ
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 (Trang 4)
Bảng có tên Table3 có 8 byte trong miền  nhớ có địa chỉ đầu được chương trình dịch - Lập trình hợp ngữ
Bảng c ó tên Table3 có 8 byte trong miền nhớ có địa chỉ đầu được chương trình dịch (Trang 5)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w