Tải bản đầy đủ (.ppt) (50 trang)

VXL-Ch03-8051-3.8 Lap trinh hop ngu_50 slides.PPT

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 (163.58 KB, 50 trang )

ĐHBK Tp HCM-Khoa Đ-ĐT
BMĐT
GVPT: Hồ Trung Mỹ
Môn học: Vi Xử Lý

CHƯƠNG 3

HỌ VI ĐiỀU KHIỂN 8051

1


3.8 Lập trình hợp ngữ

2


Lập trình hợp ngữ









Hoạt động của trình biên dịch hợp ngữ
Dạng chương trình hợp ngữ
Định trị biểu thức lúc biên dịch hợp ngữ
Các chỉ thị trình biên dịch hợp ngữ


Các điều khiển trình biên dịch hợp ngữ
Hoạt động của trình liên kết
Liên kết các đoạn tái định vị và các module
Các macro

3


Giới thiệu
• Cấu trúc và thiết kế chương trình






Giới thiệu
Các thuận lợi và bất lợi của lập trình [có] cấu trúc
Ba cấu trúc: phát biểu, vòng lặp và lựa chọn
Cú pháp mã giả (pseudo code)
Lập trình hợp ngữ

• Các cơng cụ và kỹ thuật để phát triển chương trình
– Chu kỳ phát triển
– Tích hợp và kiểm chứng
– Lệnh và các môi trường

4



Lập trình hợp ngữ
PROGRAM.OBJ
PROGRAM.SRC

ASM51
PROGRAM.LST

LIBRARY
PROGRAM.ABS
FILE1.OBJ
FILE2.OBJ

RL51

• Tập tin chương trình nguồn có đi là asm/a51/src
• Tập tin sau cùng ghi ROM có đuôi là abs/hex

PROGRAM.MAP

5


ASM(input_file)
/*assemble source program in
Minh họa hoạt động của trình biên dịch hợp ngữ (1/3)
input_file)*/
BEGIN
/*pass 1: build the symbol table */
lc = 0;
/*lc=location counter; default to 0*/

mnemonic = null;
open input_file;
WHILE (mnemonic != end) DO BEGIN
get_line();
/*get line from input_file */
scan_line();
/*scan line & get label/symbol & mnemonic */
IF (label) THEN enter_into_symbol_table(label, lc);
CASE mnemonic OF BEGIN
null, comment, END: ; /*do nothing */
ORG:
lc = operand_value;
EQU:
enter_in_symbol_table( symbol, operand_value);
DB:
WHILE (got_operand) DO increment_lc;
/* increment number of bytes defined */
DS:
lc = lc + operand_value;
1_byte_instruction:
lc = lc + 1;
2_byte_instruction:
lc = lc + 2;
3_byte_instruction:
lc = lc + 3;
6
END


Minh họa hoạt động của trình biên dịch hợp ngữ (2/3)


/*pass 2: create the object program*/
rewind_input_file_pointer;
lc = 0;
mnemonic = null;
open_output_file;
WHILE (mnemonic != end) DO BEGIN
get_line();
scan_line(); /* determine mnemonic op code and value(s) of operand(s)*/
/*Note: if symbols are used in operand field, their values are looked-up*/
/* in the symbol table created during pass 1
*/
CASE mnemonic OF BEGIN
null, comment, EQU, END: ;
/*do nothing */
ORG:
lc = operand_value;
DB: WHILE (operand) DO BEGIN
put_in_objectfile(operand);
lc = lc + 1;
END
/* increment number of bytes defined */

7


Minh họa hoạt động của trình biên dịch hợp ngữ (3/3)

DS: lc = lc + operand;
1_byte_instruction:

put_in_objectfile(inst_code);
2_byte_instruction:
put_in_objectfile(inst_code);
put_in_objectfile(operand);
3_byte_instruction:
put_in_objectfile(inst_code);
put_in_objectfile(operand high-byte);
put_in_objectfile(operand low-byte);
lc = lc + size_of_instruction;
END
END
close_input_file;
close_output_file;
END

8


Dạng chương trình hợp ngữ
• Chương trình hợp ngữ chứa:





Các lệnh máy (ANL, MOV)
Các chỉ thị trình biên dịch hợp ngữ (ORG,..)
Các điều khiển trình biên dịch hợp ngữ ($TITLE)
Các chú thích


• Các dịng lệnh máy hoặc chỉ thị trình biên dịch hợp
ngữ có dạng:
[label:] Mnemonic [operand] [,operand] […] [;comment]
( [nhãn:] Từ gợi nhớ [toán hạng] [, toán hạng] […] [;chú
thích])

9


Dạng chương trình hợp ngữ(2/7)
Vùng nhãn (label)
• Nhãn biểu diễn địa chỉ của lệnh (hoặc dữ liệu) theo
sau nó
• Thuật ngữ “nhãn" ln ln biểu diễn địa chỉ..
• Thuật ngữ “ký hiệu” (symbol) thì tổng qt hơn.
• Nhãn là 1 kiểu ký hiệu và nó được nhận dạng bằng
cách để dấu hai chấm (:) ở cuối tên nhãn.
• Các ký hiệu là các giá trị hay thuộc tính được gán
bằng các chỉ thị như EQU, SEGMENT, BIT, DATA, etc.
• Ký hiệu có thể là địa chỉ, hằng số dữ liệu, tên của
đoạn, hoặc các cấu trúc khác được tạo ra bởi lập trình
viên.
10/81


Dạng chương trình hợp ngữ(3/7)
Ký hiệu (symbol)
PAR

EQU


500

START:

MOV

A,#0FFH

; PAR là ký hiệu biểu
; diễn giá trị 500
; START là nhãn biểu
; diễn địa chỉ của lệnh MOV

• Ký hiệu ( hay nhãn) phải bắt đầu với chữ, dấu hỏi, hoặc
dấu gạch dưới “_” ; phải được theo sau bằng các ký
tự, số , “?” hoặc “_” và có thể dài đến 31 ký tự..
• Các ký hiệu có thể dùng chữ in hoa hay chữ in thường
nhưng trình biên dịch xử lý chúng như nhau..
• Khơng được dùng các từ dành riêng làm ký hiệu
• Các ký hiệu đặc biệt của trình biên dịch hợp ngữ
– A, R0-R7, DPTR, PC, C, AB, $ (địa chỉ của lệnh hiện tại)
– AR0– AR7 biểu diễn các địa của R0– R7 trong bank thanh ghi
11/81
hiện hành.


Dạng chương trình hợp ngữ(4/7)
Vùng từ gọi nhớ (Mnemonic Field)
• Sau vùng nhãn là vùng từ gợi nhớ chứa các từ gợi nhớ

lệnh hoặc các chỉ thị trình biên dịch hợp ngữ..
• TD:
– Các từ gợi nhớ lệnh như ADD, MOV, DIV, . . .
– Các chỉ thị trình biên dịch hợp ngữ như ORG, EQU, DB, ....

12/81


Dạng chương trình hợp ngữ(5/7)
Vùng tốn hạng
• Vùng tốn hạng theo sau vùng từ gợi nhớ.
• Vùng này chứa địa chỉ hoặc dữ liệu mà lệnh sử dụng.
• Có thể dùng “nhãn” để biểu diễn địa chỉ, hoặc dùng “ký
hiệu” để biểu diễn hằng số dữ liệu.
• Vùng tốn hạng phụ thuộc vào tác vụ cụ thể của lệnh.

Vùng chú thích
• Chú thích ở cuối dịng để làm rõ giải thuật chương trình.
• Chú thích phải được bắt đầu bằng “;”
13/81


Dạng chương trình hợp ngữ(6/7)
Địa chỉ dữ liệu
• Nhiều lệnh truy cập các ô nhớ dùng định địa chỉ trực
tiếp và cần có địa chỉ bộ nhớ dữ liệu nội (00H to
7FH) hoặc địa chỉ SFR (80H to 0FFH) trong vùng tốn
hạng.
• Các ký hiệu định nghĩa trước có thể dùng cho các
địa chỉ SFR.

• TD:
MOV
A, 45H
MOV
A, SBUF
; giống như MOV A, 99H

14/81


Dạng chương trình hợp ngữ(7/7)
Địa chỉ bit
• Một trong các đặc tính mạnh nhất của 8051 là khả năng
truy cập các bit riêng lẻ khơng cần các phép tốn che
bit trên byte.
• Địa chỉ bit trong bộ nhớ dữ liệu nội (20H to 2FH) hoặc
địa chỉ bit trong vùng SFR (80H to 0FFH).
• Có 3 cách chỉ ra địa chỉ bit:
(a) cho địa chỉ bit cụ thể,
(b) dùng toán tử chấm giữa địa chỉ byte và vị trí bit, và
(c) Dùng ký hiệu đã được định nghĩa trước.
TD:
SETB
SETB
JNB
JNB

0E7H
ACC.7
TI, $

99H, $

; địa chỉ bit cụ thể
; dùng toán tử chấm (giống lệnh trên)
; TI là ký hiệu đã được định nghĩa trước
; (giống lệnh trên)
15/81


Định trị biểu thức lúc biên dịch hợp ngữ
• Các giá trị và các hằng số trong vùng toán hạng có
thể được biểu diễn bằng 3 cách:
(a) với trị cụ thể (TD: 0EFH),
(b) với ký hiệu được định nghĩa trước (TD: ACC),
hoặc
(c) Với biểu thức (TD: 2 + 3).
• Sử dụng các biểu thức là 1 kỹ thuật hữu dụng làm cho
chương trình hợp ngữ dễ đọc hơn và linh hoạt hơn.
• Tất cả các tính tốn biểu thức được thực hiện bằng số
học 16 bit; tuy nhiên tùy theo lệnh mà 8 hay 16 bit
được chèn vào trong lệnh khi cần.
16/81


Định trị biểu thức lúc biên dịch hợp ngữ (2/7)
Các cơ số
• Các hằng số phải được theo sau bằng "B" với số nhị
phân (Binary), "O" hoặc "Q" với bát phân (Octal), "D"
hoặc khơng có gì với thập phân (Decimal), hoặc "H" với
thập lục phân (Hex).

• Các lệnh sau đều giống nhau:
MOV
MOV
MOV
MOV
MOV

A, #15
A, #1111B
A, #0FH
A, #17Q
A, #15D

• Chú ý là ký số phải là ký tự đầu với các hằng số Hex để
phân biệt với nhãn (nghĩa là phải ghi 0A5H cho số A5H).
17/81


Định trị biểu thức lúc biên dịch hợp ngữ (3/7)
Chuỗi ký tự
• Các chuỗi dùng 1 hay 2 ký tự làm toán hạng trong
biểu thức. Các mã ASCII được đổi thành nhị phân
tương đương bởi trình biên dịch hợp ngữ. Các hằng
số ký tự được để trong dấu nháy đơn (') hoặc dấu
nháy kép (“) (tùy trình biên dịch hợp ngữ).
• TD:
CJNE A, #'Q', AGAIN ; chuyển đổi ký số ASCII
SUBB A, #'0'
; sang ký số nhị phân
MOV DPTR, #'AB'

MOV DPTR, #4142H ; giống như trên
18/81


Định trị biểu thức lúc biên dịch hợp ngữ (4/7)





MOV
A,#10 + 10H (MOV A,#1AH)
MOV
A,#25 MOD 7
(MOV A,#4)
MOV
A,#’9’ AND 0FH
(MOV A,#9)
THREE
EQU 3
Minus_three
EQU -3
MOV
A,#(NOT THREE)+1
MOV
A,#Minus_three
MOV
A,#11111101B
• MOV
A,#8 SHL 1 (MOV A,#10H)

• MOV
A,#HIGH 1234H
(MOV A,12H)

19


Định trị biểu thức lúc biên dịch hợp ngữ (5/7)
• Các tốn tử quan hệ : kết quả ln ln là sai (0000H)
hoặc đúng (FFFFH)
EQ =
Equal (bằng)
NE <>
Not Equal (không bằng )
LT < Less Than (nhỏ hơn)
LE <=
Less than or Equal to (nhỏ hơn hoặc bằng)
GT >
Greater Than (lớn hơn)
GE >=
Greater than or Equal to (lớn hơn hoặc bằng)

• TD:
MOV
MOV
MOV
MOV
MOV

A,#5 = 5

A,#’X’ LT ‘Z’
A,#5 NE 4
A,#’X’ >= ‘X’
A,#$ > 0

Các lệnh trên đều được biên dịch thành MOV A,#0FFH
20


Định trị biểu thức lúc biên dịch hợp ngữ (6/7)
• Các thí dụ biểu thức
Được định trị là
‘B’ - ‘A’
8/3
155 MOD 2
4*4
8 AND 7
NOT 1

0001H
0002H
0001H
0010H
0000H
FFFEH

Được định trị là
‘A’ SHL 8
LOW 65535
(8 + 1)*2

5 EQ 4
‘A’ LT ‘B’
3 <= 3

4100H
00FFH
0012H
0000H
FFFFH
FFFFH

21


Định trị biểu thức lúc biên dịch hợp ngữ (7/7)
• Thứ tự ưu tiên của các toán tử
()
HIGH LOW
* / MOD SHL SHR
+EQ NE LT LE GT GE = <> < <= > >=
NOT
AND
OR XOR

• Khi có cùng ưu tiên thì các tốn tử được định trị từ
trái sang phải
HIGH (‘A’ SHL 8)
HIGH ‘A’ SHL 8
NOT ‘A’ - 1
‘A’ OR ‘A’ SHL 8


0041H
0000H
FFBFH
4141H
22


Các chỉ thị trình biên dịch hợp ngữ
• Điều khiển trạng thái trình biên dịch hợp ngữ (ORG,
END, USING)
• Định nghĩa ký hiệu (SEGMENT, EQU, SET, DATA,
IDATA, XDATA, BIT, CODE)
• Khởi trị vùng nhớ hay dành chỗ trong vùng nhớ (DS,
DB, DW, DBIT)
• Liên kết chương trình (PUBLIC, EXTRN, NAME)
• Chọn đoạn (RSEG, CSEG, DSEG, ISEG, BSEG, XSEG)

23


Điều khiển trạng thái trình biên dịch hợp ngữ
• ORG
ORG
ORG

100H
($ + 1000H) AND 0F000H ; chọn biên giới 4K kế

• END ; phải là phát biểu sau cùng trong chương trình

• USING
MOV
USING
PUSH
MOV
USING
PUSH

expression ; chọn bank thanh ghi làm việc
PSW,#00011000B
; Chọn bank 3
3
; dùng bank thanh ghi
AR7 ; 1FH (R7 trong bank 3)
PSW,#00001000B
1
AR7 ; 0FH (R7 trong bank 1)
24


Định nghĩa ký hiệu
• Chỉ thị định nghĩa ký hiệu tạo ra các ký hiệu biểu diễn
các đoạn (segment), thanh ghi (register), số
(numbers) và địa chỉ (address).

25


×