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
;khởi tạo thanh ghi CX
START: MOV CX,5 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
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
define byte define word (doublebyte) define doubeword (2 từ liên tiếp) define quadword (4 từ liên tiếp) define tenbytes (10 bytes liên tiếp)
Chỉ dẫn khai báo kiểu số liệu DB DW DD DQ DT Ví dụ:
alpha DB 4
; khai báo biến alpha chiều dài 1
beta DW ?
byte có giá trị khởi tạo 4
; 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
Còn gọi là vùng nhớ có tên và tổng số byte chiều
nhau truy xuất địa chỉ thông qua tên biến
Ví dụ: vùng nhớ B_ARRAY chiều dài 3 byte
dài
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
b_array DB 10h,20h,30h
Mảng (ARRAY)
CONTENTS
Nếu ASM gán địa chỉ offset 0200h cho mảng B_ARRAY thì nội dung bộ nhớ như sau : ADDRESS 200h 201h 202h
SYMBOL b_array b_array+1 b_array+2
10h 20h 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
W_ARRAY W_ARRAY+2 W_ARRAY+4 W_ARRAY+6
ADDRESS 300h 302h 304h 306h
CONTENTS 1000d 40d 29887d 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
Kết thúc chương trình bằng cú pháp END
name ENDP
Ví dụ:
.MODEL SMALL ;1 đoạn code và 1 đoạn dữ liệu .STACK 100h ; dành 256 byte cho stack .DATA
.CODE
; định nghĩa dữ liệu tại đây
MAIN PROC
; thân thủ tục MAIN
MAIN ENDP
END MAIN
; các thủ tục khác nếu có
; 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ữ
; đưa A vào AX ; đưa AX vào B
Mệnh đề B=A MOV AX,A MOV B,AX Mệnh đề A=B-2*A MOV AX,B SUB AX,A SUB AX,A MOV A,AX
;Ax=B ;AX=B-A ;AX=B-2*A ;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
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
9 routine String input
routine Single character output
character
Output:
AL= ASCII code of the the display character or control
character
2 Input : AH=2 DL=ASCII code of the the display character or control
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 INT 21H MOV BL,AL ; 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 MOV DL,0DH INT 21H MOV DL,0AH INT 21H
; hàm nhập ký tự ; ký tự nhập vào AL ; cất ký tự vào BL
; hàm xuất ký tự ; ký tự carriage return ; thực hiện xuất kí tự carriage return ; kí tự line feed ; 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

