6.3 .Giải mã địa chỉ
8. Hoạt động Reset
3.2. Cấu trúc chương trình dữ liệu
- Những lệnh của vi xử lý.
- Những chỉ dẫn assembler (Assembler Directive). - Những điều khiển Assembler.
- Các chú thích.
Cú pháp lệnh của vi xử lý như sau:
[label:] mnemonic [operand] [,operand] […] [;comment]
Trong đó label là nhãn – theo sau bởi dấu hai chấm “:”, mnemonic là từ gợi nhớ của lệnh, operand là toán hạng tuỳ thuộc vào lệnh có một hoặc nhiều toán hạng hoặc không có toán hạng, cuối cùng là chú thích cho lệnh đó – đi sau dấu chấm phẩy “;”.
Kí hiệu là tên được định nghĩa để biểu diễn một giá trị, khối văn bản, địa chỉ hoặc tên thanh ghi và cũng có thể biểu diễn các hằng số và các biểu thức. Các tên của các kí hiệu cho phép tối đa 31 kí tự với kí tự đầu phải là chữ hoặc dấu “?” hoặc “-”, và theo
sau phải là các chữ, số, “?” hoặc “-”. Các kí hiệu có thể sử dụng các kí tự in hoa hay thường không phân biệt.
Chú ý các từ kí hiệu là các từ đã sử dụng nên người lập trình không được dùng chúng làm kí hiệu cho các mục đích khác.
Ví dụ 1: Bdn EQU R2
Nhãn là một loại kí hiệu dùng để định nghĩa vị trí trong chương trình: - Tên nhãn tượng trưng cho một địa chỉ.
- Vùng văn bản thứ nhất trong dòng hợp ngữ - Theo sau nhãn là dấu hai chấm “:”
- Trên một hàng chỉ có thể định nghĩa một nhãn. - Không được đặt tên các nhãn trùng nhau Ví dụ 2:
Label1: MOV R2,#35h
Mnemonic là tất cả các từ gợi nhớ cho tất cả các lệnh và các chỉ dẫn assembler: - Mnemonic cho lệnh: ADD, SUB, MUL, DIV, MOV,…
- Mnemonic cho chỉ dẫn assembler: org, equ, db, bit,…
Toán hạng operand là đối số hoặc biểu thức được đặt tả cùng với lệnh hoặc chỉ dẫn assembler, toán hạng có thể là địa chỉ hoặc dữ liệu.
Bài tập: Phân tích 2 ví dụ sau:
Ví dụ 3: Ngat EQU R2
Ví dụ 4: MOV R0,#75H
NOP RET
Trong hợp ngữ ASM51 có các kiểu toán hạng bảng:
Kiểu toán hạng Mô tả
Dữ liệu tức thời Kí hiệu hoặc hằng được dùng làm giá trị số Địa chỉ bit trực tiếp Kí hiệu hoặc hằng tham chiếu địa chỉ bit Địa chỉ chương trình Kí hiệu hoặc hằng tham chiếu địa chỉ mã Địa chỉ dữ liệu trực tiếp Kí hiệu hoặc hằng tham chiếu địa chỉ dữ liệu Địa chỉ gián tiếp Tham chiếu gián tiếp đến bộ nhớ, có thể là offset Kí hiệu assembler đặc biệt Tên thanh ghi.
Dữ liệu tức thời (immediate data): Là biểu thức số được mã hóa như một phần trong lệnh ngôn ngữ máy. Toán hạng này phải có kí hiệu “#” đi trước.
Ví dụ 5: MOV R0,#30. Trong ví dụ này 30 là dữ liệu tức thời.
Địa chỉ bit trực tiếp: (direct bit address): Kiểu này dùng để truy cập các bit của các ô nhớ cho phép truy xuất bit.
Có 3 cách để định địa chỉ bit: Truy xuất trực tiếp địa chỉ bit. Truy xuất toán tử chấm (byte.bit).
Kí hiệu assembler được định nghĩa trước. Ví dụ 6: SETB 00H ;bit có địa chỉ 00H
CLR ACC.7 ;xóa bit thứ 7 của thanh ghi A
CLR EA ;xóa bit ngắt tồn cục
Địa chỉ chương trình: (program address): Là toán hạng của lệnh nhảy. Lệnh nhảy tương đối: trong kiểu lệnh này toán hạng này có độ dài 8 bit được xem là offset sử dụng cho lệnh nhảy không điều kiện sjmp và lệnh nhảy có điều kiện. Lệnh nhảy và lệnh gọi tuyệt đối: trong kiểu lệnh này toán hạng này có độ dài 11 bit dùng để quản lý trang bộ nhớ cho lệnh AJMP và ACALL.
Lệnh nhảy và lệnh gọi có địa chỉ dài: trong kiểu lệnh này toán hạng này có độ dài 16 bit dùng để quản lý toàn bộ bộ nhớ cho lệnh LJMP và LCALL.
Nhảy và gọi generic:
Lệnh JMP có thể được dịch hợp thành lệnh SJMP, AJMP hoặc LJMP. Lệnh Call có thể được dịch hợp thành lệnh ACALL hoặc LCALL. Người lập trình không cần quan tâm đến địa chỉ thật khi nhảy hay gọi. Quy tắc chuyển thành tuỳ thuộc vào assembler:
Lệnh SJMP: không có tham chiếu tới và địa chỉ đích trong vùng -128 byte so với địa chỉ của lệnh kế.
Lệnh AJMP/ACALL: không có tham chiếu tới và địa chỉ đích trong vùng nhớ cùng khối 2 KByte so với lệnh kế.
Lệnh AJMP/ACALL: có tham chiếu tới địa chỉ đích trong vùng nhớ 64Kbyte. Địa chỉ dữ liệu trực tiếp (direct data address): Địa chỉ này dùng để truy xuất bộ nhớ dữ liệu nội từ có địa chỉ 00H đến 7FH và các vùng nhớ chứa các thanh ghi đặc biệt
từ 80H đến FFH. Các kí hiệu được định nghĩa đều có thể sử dụng được cho các thanh ghi chức năng.
Ví dụ 7: Hai lệnh sau là tương đương: MOV A,90H
MOV A,P1
Địa chỉ dữ liệu gián tiếp (indirect data address): Kiểu này dùng các thanh ghi để chứa địa chỉ của các ô nhớ cần truy xuất dữ liệu. Các thanh ghi sử dụng cho kiểu này là thanh ghi R0, R1, DPTR và PC. Các kí hiệu đặc biệt của assembler: Các kí hiệu này dùng cho cách định địa chỉ dùng thanh ghi như A, DPTR, R0 đến R7, PC, cờ C và cặp thanh ghi AB. Kí hiệu dấu “$” dùng để tham chiếu đến giá trị hiện hành của bộ đếm vị trí.
Ví dụ 8: hai lệnh sau là tương đương:
WAIT: JNB RI,WAIT
JNB RI,$
Kí hiệu “;” đi sau nó là các chú thích
3.2.1. Khai báo biến
Ten_bien DB Gia_Tri_Khoi_Tao
DB là một chỉ lệnh dữ liệu được sử dụng rộng rãi nhất trong hợp ngữ. Nó được dùng để định nghĩa dữ liệu 8 bit. Khi DB được dùng để định nghĩa byte dữ liệu thì các số có thể ở dạng thập phân, nhị phân, Hex hoặc ở dạng thức ASCII. Đối với dữ liệu thập phân thì cần đặt chữ “D” sau số thập phân, đối với số nhị phân thì đặt chữ “B” và đối với dữ liệu dạng Hex thì cần đặt chữ “H”. Khi dữ liệu có kích thước là 2byte sử dụng: DW để khai báo biến kiểu nguyên
DATA1: DB 2D ; Số thập phân
DATA2: DB 00110101B ; Số nhị phân (35 ở dạng Hex)
DATA3: DB 39H ; Số dạng Hex
DATA4: DB “Ky thuat may tinh” ; Các ký tự ASCII
3.2.2. Khai báo hằng
Ten_Hang EQU Gia_tri
Được dùng để định nghĩa một hằng số mà không chiếm ngăn nhớ nào. Chỉ lệnh EQU không dành chỗ cất cho dữ liệu nhưng nó gắn một giá trị hằng số với nhãn dữ liệu
sao cho khi nhãn xuất hiện trong chương trình giá trị hằng số của nó sẽ được thay thế đối với nhãn
Ví dụ:
COUNT EQU 25
MOV R3, #count ; Khi thực hiện lệnh “MOV R3, #COUNT” ;thì thanh ghi R3 sẽ được nạp giá trị 25
3.2.3. Cấu trúc một chương trình hợp ngữ
ORG 0000h; Đặt lệnh LJMP main tại địa chỉ
LJMP main; 0000h (địa chỉ bắt đầu khi reset AT89C51) ORG 0030h; Vùng địa chỉ 0003h – 002Fh
Main: ; dùng để chứa các chương trình phục vụ ngắt … CALL Subname … ;--- Subname: … … RET END ; kết thúc chương trình Ví dụ 9:
ORG 00H ;(con trỏ chương trình bắt đầu từ 00h) LJMP MAIN ; nhảy tới vị trí có nhãn là MAIN)
ORG 0030H ; (vị trí bắt đầu chương trình chính MAIN): MAIN:
MOV R1,#10 ;(nạp cho R1 giá trị là 10). LAP1:
DJNZ R1,LAP1
END ; (Kết thúc chương trình.)
Con trỏ: vị trí mà vi điều khiển bắt đầu thực thi tại đó. Thường khi bắt đầu con
trỏ có địa chỉ thấp nhất là 00h, tuy nhiên người lập trình cũng có thể quy định cho nó làm việc tại một vị trí bất kỳ
Ví dụ:
ORG 00H ; Bắt đầu tại vị trí 00h ORG 0030H ; Bắt đầu tại vị trí 0030h
3.2.4. Chương trình con. Nhãn: Nhãn: ... Các câu lệnh ... RET Ví dụ 10: ORG 00H LJMP MAIN ORG 0030H MAIN: MOV R1,#10
LCALL LAP1 ;gọi chương trình con LAP1:
DJNZ R1,LAP1
RET ; kết thúc chương trình con END