Lập trình hợp ngữ

8 1.5K 16
Lập trình hợp ngữ

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

Thông tin tài liệu

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

CHƯƠNG 3 LẬP TRÌNH BẰNG HỢP NGỮ MCS51Lậ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íchTên Hằng số EQU Giá trị hằng ; chú thíchVD:Buffer1 EQU 50h ; Biến Buffer1 được gán giá trị 50HConstant_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 nRetVí 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 Ret3.1.4 Cấu trúc chương trình hợp ngữ:;===========Tên chương trình ============org 00hnopsjmp Tên chương trình chínhorg 03h ; Ngắt Ex0 nopretiorg 0bh ; Ngắt Timer0nopljmp Tên ct Phục vụ ngắt / Retiorg 13h ; Ngắt Ex1 nopljmp Tên ct Phục vụ ngắt / Retiorg 1bh ; Ngắt Timer1nopljmp Tên ct Phục vụ ngắt / Retiorg 23h ; Ngắt serialnopreti;=========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 ứngLư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 byte3.2.1 Quản lý bảng số liệuBả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ị NChú ý : • 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ệuCá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ị NLư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ìnhCú pháp1: Ví dụ1Table1: 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 35Bả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 8000hTable2: 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ị NTươ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 byteCú pháp2: Ví dụ1Table3: 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 8ABả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+DptrLệ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+PCVí 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. Đoạn chương trình Lưu đồ thuật toán mov R0,#50H mov dptr,#1234H mov R2,#50Loop: mov A,@dptrxch A,@R0 movx @dptr,A inc R0inc dptrdjnz R2,Loop StartDptr ← #1234HR0 ← #50HR2 ← #50A←@dptrA↔ @R0@dptr←Adptr +1R0 + 1R2 - 1 R2 = 0YesNo End 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Đoạn chương trình Lưu đồ thuật toán org 00hnopsjmp Startorg 03h ; Ngắt Ex0 nopretiorg 0bh ; Ngắt Timer0nopretiorg 13h ; Ngắt Ex1 nopretiorg 1bh ; Ngắt Timer1nopretiorg 23h ; Ngắt serialnopreti;===================================; m a i n p r o g r a m;===================================org 50hStart:clr Cmov R1,#08Hmov R0,#60Hmov dptr,#1000HLap:mov A,@dptrsubb A,@R0movx @dptr,Ainc R0inc dptrdjnz R1,LapEnd Startxóa cờ CR1#8R0←#60Hdptr←#1000HA← @dptrA←A-@R0-C@dptr←A R0+1 dptr+ 1 R1- 1 R1 = 0YesNo End 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 Dptrmovc a,@a+dptr ; lấy giá trị trong bảng tương ưng với giá trị của Aret;----------------------------------------------------------------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ét3.5 Ngắt trong MCS51: Ngắt ngoài . 3 LẬP TRÌNH BẰNG HỢP NGỮ MCS5 1Lậ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. 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

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

Hình ảnh liên quan

Tên bảng: - Lập trình hợp ngữ

n.

bảng: Xem tại trang 5 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan