Cấu trúc của chương trình hợp ngữ

Một phần của tài liệu Bài giảng Vi điều khiển: Phần 2 - ĐH Phạm Văn Đồng (Trang 25 - 29)

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 “;”.

v 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

v 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

v 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,…

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

Các chỉ dẫn assembler luôn cần các toán hạng là hằng số hoặc kí hiệu.

Ví dụ 3: Biendemngat EQU R2

Số toán hạng trong lệnh tùy thuộc vào lệnh có toán hạng hay không có:

Ví dụ 4: MOV R0,#75h

NOP RET

Trong hợp ngữ ASM51 có các kiểu toán hạng bảng sau:

Bảng 7.1 - Các kiểu toán hạ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

v Dữ liệu tức thời (immediate data):

Là biểu thức số được mã hoá 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,#75h

Trong ví dụ này 75h là dữ liệu tức thời. v Đị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: (adsbygoogle = window.adsbygoogle || []).push({});

- 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 ;xoá bit thứ 7 của thanh ghi A CLR EA ;xoá bit ngắt toàn cục

v Đị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.

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

Ví dụ 7:

LOC OBJ LINE SOURCE

(vị trí mã đối tượng hàng mã nguồn)

1234 1 org 1234h 2 1234 04 3 start: INC A 1235 80FD 4 JMP start 5 12FC 6 org start+200 12FC 4134 7 JMP start 8 12FE 021304 9 JMP finish 1301 121307 10 CALL delay 11 1304 14 12 finish: DEC A 1305 4134 13 JMP start 14 1307 7F00 15 delay: MOV R7,#0 1309 22 16 RET 17 end

Hàng lệnh thứ 4 jmp được biên dịch thành sjmp, hàng lệnh jmp thứ 7 được biên dịch thành Ajmp và hàng lệnh jmp thứ 9 được biên dịch thành ljmp.

v Đị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.

MOV A,90H MOV A,P1

v Đị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.

v 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ụ 9: 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 (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Bài giảng Vi điều khiển: Phần 2 - ĐH Phạm Văn Đồng (Trang 25 - 29)