Hardware Summary of 8051 1 CHƯƠNG 3 HỌ VI ĐiỀU KHIỂN 8051 ĐHBK Tp HCM Khoa Đ ĐT BMĐT GVPT Hồ Trung Mỹ Môn học Vi Xử Lý 2 3 8 Lập trình hợp ngữ Lập trình hợp ngữ – Hoạt động của trình biên dịch hợp ngữ[.]
Trang 23.8 Lập trình hợp ngữ
Trang 3– 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
Trang 5• Tập tin chương trình nguồn có đuôi là asm/a51/src
Trang 6ASM(input_file) /*assemble source program in
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 */
Trang 7/*pass 2: create the object program*/
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 */
Minh họa hoạt động của trình biên dịch hợp ngữ (2/3)
Trang 9[label:] Mnemonic [operand] [,operand] […] [;comment]
( [nhãn:] Từ gợi nhớ [toán hạng] [, toán hạng] […] [;chú
thích])
Trang 10Vù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" luôn luôn biểu diễn địa chỉ
• Thuật ngữ “ký hiệu” (symbol) thì tổng quát 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.
Dạng chương trình hợp ngữ(2/7)
Trang 11Ký hiệu (symbol)
PAR EQU 500 ; PAR là ký hiệu biểu
; diễn giá trị 500 START: MOV A,#0FFH ; 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
Dạng chương trình hợp ngữ(3/7)
Trang 12Vù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,
Dạng chương trình hợp ngữ(4/7)
Trang 13Vùng toán hạng
• Vùng toá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 toá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 “;”
Dạng chương trình hợp ngữ(5/7)
Trang 14Đị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 toán hạng.
• Các ký hiệu định nghĩa trước có thể dùng cho các
Trang 15Đị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 toá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 0E7H ; địa chỉ bit cụ thể SETB ACC.7 ; dùng toán tử chấm (giống lệnh trên) JNB TI, $ ; TI là ký hiệu đã được định nghĩa trước JNB 99H, $ ; (giống lệnh trên)
Dạng chương trình hợp ngữ(7/7)
Trang 16• 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 toá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.
Định trị biểu thức lúc biên dịch hợp ngữ
Trang 17Cá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:
Trang 18Chuỗ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
Định trị biểu thức lúc biên dịch hợp ngữ (3/7)
Trang 19• MOV A,#10 + 10H (MOV A,#1AH)
• MOV A,#’9’ AND 0FH (MOV A,#9)
• MOV A,#8 SHL 1 (MOV A,#10H)
• MOV A,#HIGH 1234H (MOV A,12H)
Định trị biểu thức lúc biên dịch hợp ngữ (4/7)
Trang 20• Các toán tử quan hệ : kết quả luôn luôn 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)
Trang 22• Thứ tự ưu tiên của các toán tử
• Khi có cùng ưu tiên thì các toán tử được định trị từ
trái sang phải
Trang 23Cá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)
Trang 24Điều khiển trạng thái trình biên dịch hợp ngữ
ORG 100H
ORG ($ + 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 expression ; chọn bank thanh ghi làm việc
MOV PSW,#00011000B ; Chọn bank 3
USING 3 ; dùng bank thanh ghi
PUSH AR7 ; 1FH (R7 trong bank 3)
MOV PSW,#00001000B
USING 1
PUSH AR7 ; 0FH (R7 trong bank 1)
Trang 25Đị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 ).
Trang 26• Segment (CODE, XDATA, DATA,IDATA,BIT)
symbol SEGMENT segment_type
XDATA (vùng nhớ dữ liệu bên ngoài)
BIT (vùng nhớ bit; trong vùng nhớ dữ liệu byte bên
trong từ 20H-2FH)
• TD:
EPROM SEGMENT CODE (khai báo EPROM là đoạn
mã Để thật sự bắt đầu dùng đoạn này, ta dùng chỉ thị RSEG)
Định nghĩa ký hiệu (2/4)
Trang 27• EQU và SET – dùng để gán hằng số/chuỗi
symbol EQU expression (gán giá trị số vào tên
ký hiệu cụ thể)
MESSAGE: DB ‘This is a message’
symbol SET expression (tương tự với EQU
ngoại trừ ký hiệu này có thể được định nghĩa lại sau này dùng chỉ thị SET)
Định nghĩa ký hiệu (3/4)
Trang 28• DATA, IDATA, XDATA, BIT, & CODE : gán các địa chỉ của các kiểu đoạn tương ứng vào ký hiệu.
(thông báo lỗi: cần có địa chỉ đoạn dữ liệu [data
segment address expected ])
Định nghĩa ký hiệu (4/4)
Trang 29Khởi trị /dành chỗ vùng nhớ
• DS (define storage = định nghĩa vùng nhớ)
[nhãn:] DS biểu thức
– dành chỗ trong vùng nhớ với số tính từ biểu thức,
có thể dùng trong bất kỳ đoạn nào, ngoại trừ đoạn BIT
Trang 30• TD: Tạo 1000 byte ở RAM ngoài từ địa chỉ 4000H
XSTART EQU 4000H
XLENGTH EQU 1000
XSEG AT XSTART ; put I data segment
; (absolute , internal) XBUFFER: DS XLENGTH ; dành 1000 byte
MOV DPTR,#XBUFFER LOOP: CLR A
MOV @DPTR,A INC DPTR
MOV A,DPL CJNE A,#LOW( XBUFFER + XLENGTH + 1 ),LOOP MOV A,DPH
CJNE A,#HIGH( XBUFFER + XLENGTH + 1 ),LOOP (tiếp tục)
Khởi trị /dành chỗ vùng nhớ (2/3)
Trang 31• DBIT: dành chỗ tính theo bit
[nhãn:] DBIT biểu thức
BSEG ; đoạn bit, tuyệt đối (00H-7FH) KBFLAG: DBIT 1 ; keyboard status (bit 0 của byte có đ/c 20H)
PRFLAG: DBIT 1 ; printer status (bit 1 của byte có đ/c 20H) DKFLAG: DBIT 1 ; disk status (bit 2 của byte có đ/c 20H)
• DB (định nghĩa byte): khởi trị bộ nhớ mã với các giá trị byte
[nhãn:] DB biểu thức [, biểu thức] […]
CSEG AT 0100H SQUARES: DB 0,1,4,9,16,25 ; bình phương của các số 0-5
MESSAGE: DB ‘Login:’,0 ; chuỗi ký tự kết thúc bằng null
Trang 32Liên kết chương trình
• Cho phép các module (tập tin) được biên dịch riêng liên lạc với nhau bằng cách cho phép tham chiếu giữa các module và đặt tên các module.
• PUBLIC (khai báo công khai cho các module khác tham chiếu)
PUBLIC symbol [,symbol] […]
– cho phép các ký hiệu có trong danh sách trên được dùng trong các module khác.
• EXTRN (declare symbols defined outside current module)
EXTRN segment_type symbol [,symbol] […]
RET GOOD_BYE: (begin sub)
…
MAIN.SRC MESSAGE.SRC
Trang 33• Chọn các đoạn tuyệt đối
CSEG [AT address]
DSEG [AT address]
ISEG [AT address]
BSEG [AT address]
XSEG [AT address]
• Mỗi đoạn có bộ đếm vị trí riêng của nó mà ban đầu có trị là 0
Trang 34LOC OBJ LINE SOURCE
1 ONCHIP SEGMENT DATA
2 EPROM SEGMENT CODE 3
4 BSEG AT 70H ;begin abs bit seg
7 8 RSEG ONCHIP ;begin relocatable data seg
12 13 RSEG EPROM ;begin relocatable code seg
0000 750000 F 14 BEGIN: MOV TOTAL,#0
15 (continue program)
Chọn đoạn – Thí dụ (2/2)
Trang 35Điều khiển trình biên dịch hợp ngữ
• Thiết lập dạng các tập tin đối tượng và các tập tin
liệt kê để in Điều khiển cách trình bày tập tin in ra
mà không ảnh hưởng đến chương trình.
• Dòng điều khiển trình biên dịch hợp ngữ có $ đi đầu.
• Các điều khiển cơ bản và điều khiển tổng quát
• TD: DATE, INCLUDE, LIST, MACRO(50), XREF
Trang 36NAME Primary/
General DEFAULT Abbrev. Meaning
DATE(date) P DATA() DA Places string in header (9 Char
EJECT G Not applicable EJ Continue listing on next page
ERRORPRINT P NOERRORPRINT EP Designates a file to receive error
Messages in addition to the listing file (defaults to console)
NOERRORPRINT P NOERRORPRINT NOEP Designates that error messages will
be printed in listing file only
GEN P GENONLY GO List only the fully expanded source
as if all lines generated by a macro call were already in the source file
Điều khiển trình biên dịch hợp ngữ (2/6)
Trang 37GENONLY G GENONLY NOGE List only the original source
text in the listing file
INCLUDE(file) G Not applicable IC Designates a file to be
included as part of the program
source code in listing file
NOLIST G NOLIST NOLI Do not print subsequent lines
of source code in listing file
NOMACRO P MACRO(50) NOMR Do not evaluate macro calls
predefined special function registers
8051-specific predefined special
Điều khiển trình biên dịch hợp ngữ (3/6)
Trang 38PAGING P PAGING PI Designates that listing file
be broken into pages and each will have a header
NOPAGING P PAGING NOPI Designates that listing file will
contain no page breaks
PAGELENGTH P PAGELENGTH(60) PL Sets maximum number of lines in
each page of listing file (range = 10
to 65,536)
PAGEWIDTH P PAGEWIDTH(120) PW Sets maximum number of
characters in each line of listing file (range = 72 to 132)
PRINT(file) P PRINT(source.LST) PR Designates file to receive source
Trang 39SAVE G Not applicable SA Stores current control settings from
SAVE stack
RESTORE G Not applicable RS Restores control settings
from SAVE stack
REGISTERBANK(rb, ) P REGISTERBANK(0) RB Indicates one or more banks
used in program module
NOREGISTERBANK P REGISTERBANK(0) NORB Indicates that no register banks are
used
SYMBOLS P SYMBOLS SB Creates a formatted table of all
symbols used in program
NOSYMBOLS P SYMBOLS NOSB Designates that no symbol table is
created
TITLE(string) G TITLE() TT Places a string in all subsequent
page headers (max 60 characters)
WORKFILES(path) P Same as source WF Designates alternate path for
temporary workfiles
Điều khiển trình biên dịch hợp ngữ (5/6)
Trang 40XREF P NOXREF XR Creates a cross reference listing of
all symbols used in program
NOXREF P NOXREF NOXR Designates that no cross
reference list is created
Điều khiển trình biên dịch hợp ngữ (6/6)
Trang 41Hoạt động của trình liên kết (Linker )
• Intel RL51: liên kết các module thành 1 tập tin xuất:
RL51 input_list [TO output_file] [location_controls] input_list: danh sách các module (tập tin) đối tượng tái định vị được cách nhau bằng dấu phẩy.
Output_file: tên của module đối tượng xuất (chương trình thực thi được).
Location controls: đặt các địa chỉ bắt đầu cho các đoạn có tên.
• TD:
RL51 MAIN.OBJ,MESSAGE.OBJ, SUBROUTINE.OBJ TO
EXAMPLE & CODE (EPROM(4000H)) DATA(ONCHIP(30H))
Trang 42Hoạt động của trình liên kết (Linker ) (2/2)
Trang 43• Macro cho phép các đoạn mã thường dùng sẽ được
định nghĩa 1 lần dùng 1 từ gợi nhớ đơn giản và có thể dùng bất cứ chỗ nào trong chương trình bằng cách chèn từ gợi nhớ vào đó.
• ASM51’s MPL: thay thế chuỗi.
• %DEFINE (call_pattern) (macro_body)
• %DEFINE (PUSH_DPTR)
(PUSH DPH PUSH DPL)
• %PUSH_DPTR sẽ được thay thế bằng 2 lệnh PUSH
DPH và PUSH DPL trong tập tin.LST
Trang 44Các thuận lợi của việc dùng macro
• Dễ đọc hơn
• Chương trình nguồn được viết ngắn hơn
• Dùng macro làm giảm các lỗi
• Dùng macro làm cho người lập trình không cần biết
chi tiết cấp thấp hơn
Trang 45• %CMPA# (20H) = CJNE A,#20H,$+3
Trang 47Các nhãn cục bộ
• %DEFINE (macro_name [(parameter_list)])
[LOCAL list_of_local_labels] (macro_body)
• %DEFINE (DEC_DPTR) LOCAL SKIP
MOV A,DPL CJNE A,#0FFH, %SKIP DEC DPH
%SKIP: )
DEC DPL
MOV A,DPL CJNE A,#0FFH, SKIP00 DEC DPH
SKIP00:
•
Trang 48Bảo toàn A bằng các Push-Pop
• %DEFINE (DEC_DPTR) LOCAL SKIP
DEC DPL MOV A,DPL CJNE A,#0FFH,%SKIP DEC DPH
%SKIP: POP A
)
Trang 49Lặp lại các tác vụ– Macro có sẵn
• %REPEAT (expression) (text)
• TD:
%REPEAT (100) (NOP)
Trang 50Các tác vụ luồng điều khiển
• Biên dịch theo điều kiện trong ASM51:
• %IF (expression) THEN (balanced_text)
[ELSE (balanced_text)]
%IF (INTERNAL) THEN