Ngôn ngữ cấp thấp
Macro Assembler ( MASM) - CPU 8086.
Tập tin hợp ngữ nguồn (.ASM)
Các phát biểu lệnh hợp ngữ (assembly statement)
Assembly Language Instruction
Xác định hành động CPU thực hiện
Dịch sang một lệnh mã máy tương ứng
Assembler directive
Khai báo hướng dẫn biên dịch
22 trang |
Chia sẻ: thuongdt324 | Lượt xem: 662 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Kiến trúc máy tính - Chương 5: Lập trình hợp ngữ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lập trình Hợp ngữ
Assembly Language
Tổng quan
Ngôn ngữ cấp thấp
Macro Assembler ( MASM) - CPU 8086.
Tập tin hợp ngữ nguồn (.ASM)
Các phát biểu lệnh hợp ngữ (assembly statement)
Assembly Language Instruction
Xác định hành động CPU thực hiện
Dịch sang một lệnh mã máy tương ứng
Assembler directive
Khai báo hướng dẫn biên dịch
Tổng quan (tt)
Các thành phần
Bộ ký tự:
26 chữ cái thường và hoa a-z, A-Z
10 kí tự số 0-9
Các kí tự dấu:
? @ _ $ : . [ ] ( ) { } + - * / & % ! ‘ ~ “ | \ = # ^ ; ,
Kí tự ngăn cách
Khoảng trắng
Tab
Kí tự xuống dòng : kết thúc một lệnh
Không phân biệt hoa thường
Tổng quan (tt)
Từ vựng:
Tên: A-Z a-z 0-9 . ? @ _ $
Duy nhất Qui tắc đặt tên??
Từ khóa
Bắt buộc
Kiểu số liệu:
Số:
Thập phân 110d (mặc định)
Nhị phân 01111b
Hexa 0FF01h
Kí tự:
Giữa hai dấu ngoặc đơn hoặc kép
Mã ASCII ‘A’ == 41h
Cấu trúc lệnh
Name: Operation Operand(s) ;Comment
[Nhãn] Tên gợi nhớ Toán hạng(s) Ghi chú
Kí tự ngăn cách: khoảng trắng, TAB
START: MOV CX,5 ;khởi tạo thanh ghi CX
MAIN PROC ; tạo thủ tục tên là MAIN
Name: tên thay thế địa chỉ câu lệnh
Operation: hành động (2-7 kí tự)
Operand: dữ liệu để xử lý
Hằng, thanh ghi, biểu thức, tên tượng trưng
Các dạng định địa chỉ???
Comment: người lập trình hiểu
Assembler bỏ qua
Khai báo dữ liệu
Khai báo hằng
Chỉ dẫn EQU hoặc =
Gán giá trị hằng cho tên
name EQU
name =
Khai báo biến
Loại dữ liệu riêng
Số, ký tự, chuỗi, biểu thức có trị xác định
Vùng nhớ xác định
Tạo ra khi biên dịch chương trình
Truy xuất vùng nhớ qua tên biến
Chỉ dẫn khai báo kiểu số liệu
DB define byte
DW define word (doublebyte)
DD define doubeword (2 từ liên tiếp)
DQ define quadword (4 từ liên tiếp)
DT define tenbytes (10 bytes liên tiếp)
Ví dụ:
alpha DB 4 ; khai báo biến alpha chiều dài 1
byte có giá trị khởi tạo 4
beta DW ? ; khai báo biến beta chiều dài 2
byte không khởi tạo giá trị
Mảng (ARRAY)
Thực chất là một loạt các byte hay từ nhớ liên tiếp
nhau truy xuất địa chỉ thông qua tên biến
Còn gọi là vùng nhớ có tên và tổng số byte chiều
dài
Ví dụ: vùng nhớ B_ARRAY chiều dài 3 byte
b_array DB 10h,20h,30h
b_array là tên gán cho byte đầu tiên
b_array+1 là tên của byte thứ hai
b_array+2 là tên của byte thứ ba
Mảng (ARRAY)
Nếu ASM gán địa chỉ offset 0200h cho mảng
B_ARRAY thì nội dung bộ nhớ như sau :
SYMBOL ADDRESS CONTENTS
b_array 200h 10h
b_array+1 201h 20h
b_array+2 202h 30h
Mảng (ARRAY)
Ví dụ mảng W_ARRAY 4 phần tử
W_ARRAY DW 1000,40,29887,329
Giả sử mảng bắt đầu tại 0300h:
SYMBOL ADDRESS CONTENTS
W_ARRAY 300h 1000d
W_ARRAY+2 302h 40d
W_ARRAY+4 304h 29887d
W_ARRAY+6 306h 329d
Khai báo dữ liệu
Chuỗi kí tự
Mảng các giá trị mã ASCII
msg DB ‘HELLO’, 0AH, 0DH, ‘$’
tương đương
msg DB 48H,45H,4CH,4Ch,4FH,0AH,0DH,24H
Toán tử DUP
Lặp lại số lần giá trị dữ liệu cần khởi tạo
result DB 100 DUP (‘?’) ; chuỗi 100 dấu ?
Có thể lồng nhau
Cấu trúc chương trình ASM
Cú pháp khai báo toàn phần:
Chỉ dẫn SEGMENT ..ENDS
Tự tham khảo
Chương trình ASM gồm 3 phần 3 đoạn
CODE
DATA
STACK
Chỉ dẫn kiểu bộ nhớ: xác định kích thước đoạn
.model memory_type
SMALL, MEDIUM, COMPACT, LARGE
Đoạn dữ liệu – DATA Segment
Cú pháp
.DATA
;khai báo tên hằng, biến, mảng
Ví dụ
.DATA
WORD1 DW 2
WORD2 DW 5
MSG DB ‘THIS IS A MESSAGE ’
MASK EQU 10010010B
Đoạn ngăn xếp – Stack Segment
Cú pháp:
.STACK size
Mặc định 1KB
Ví dụ:
.STACK 100h ;dành 256 bytes cho stack
Đoạn mã- Code segment
Đoạn chứa mã lệnh chương trình
Bắt đầu bằng .CODE, bên trong chứa mã
lệnh của thủ tục
Cú pháp khai báo thủ tục
name PROC
; body of the procedure
name ENDP
Kết thúc chương trình bằng cú pháp END
Ví dụ:
.MODEL SMALL ;1 đoạn code và 1 đoạn dữ liệu
.STACK 100h ; dành 256 byte cho stack
.DATA
; định nghĩa dữ liệu tại đây
.CODE
MAIN PROC
; thân thủ tục MAIN
MAIN ENDP
; các thủ tục khác nếu có
END MAIN ; kết thúc chương trình bắt đầu
bằng thủ tục MAIN
Các lệnh cơ bản
MOV, XCHG
ADD, SUB, INC , DEC,NEG
Chuyển ngôn ngữ cấp cao sang hợp ngữ
Mệnh đề B=A
MOV AX,A ; đưa A vào AX
MOV B,AX ; đưa AX vào B
Mệnh đề A=B-2*A
MOV AX,B ;Ax=B
SUB AX,A ;AX=B-A
SUB AX,A ;AX=B-2*A
MOV A,AX ;A=B-2*A
Các lệnh vào ra
CPU thông tin với cổng ngoại vi I/O bằng
lệnh IN và OUT
Không dùng trực tiếp. Tại sao???
Dùng chương trình phục vụ I/O
BIOS ( Basic Input Output System)
Do hệ điều hành cung cấp
Trình phục vụ ngắt INT
INT interrupt_number
Thực hiện các ngắt thông qua số hiệu hàm
INT 21h
function number routine
9 String input
Input : DX= địa chỉ chuỗi ký tự kết thúc bằng $
Output: chuỗi kí tự xuất hiện trên màn hình
function number routine
2 Single character output
Input :
AH=2
DL=ASCII code of the the display character or control
character
Output:
AL= ASCII code of the the display character or control
character
Chương trình đầu tiên
Đọc một ký tự in ra dòng mới
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
; hiện dấu nhắc
MOV AH,2
MOV DL,’?’
INT 21H
Chương trình đầu tiên
; nhập một ký tự
MOV AH,1 ; hàm nhập ký tự
INT 21H ; ký tự nhập vào AL
MOV BL,AL ; cất ký tự vào BL
; chuyển xuống dòng mới bằng cách xuất kí tự
; xuống hàng và kí tự về đầu hàng.
MOV AH,2 ; hàm xuất ký tự
MOV DL,0DH ; ký tự carriage return
INT 21H ; thực hiện xuất kí tự carriage return
MOV DL,0AH ; kí tự line feed
INT 21H ; thực hiện xuất kí tự line feed
Chương trình đầu tiên
; xuất kí tự nhập cất ở BL
MOV DL,BL ; đưa dữ liệu cất ở BL vào DL
INT 21H ; thực hiện xuất kí tự
; trở về DOS
MOV AH,4CH ; hàm thoát về DOS
INT 21H ; thực hiện exit to DOS
MAIN ENDP
END MAIN