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[r]
(1)Lập trình Hợp ngữ
(2)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
Dịch sang lệnh mã máy tương ứng
Assembler directive
(3)Tổng quan (tt)
Các thành phần Bộ ký tự:
26 chữ thường 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
(4)Tổng quan (tt)
Từ vựng:
Tên: A-Z a-z 0-9 ? @ _ $
Duy 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ự:
(5)Cấu trúc lệnh
Name: Operation Operand(s) ;Comment
[Nhãn] Tên gợi nhớ Tốn hạng(s) Ghi Kí tự ngăn cách: khoảng trắng, TAB
START: MOV CX,5 ;khởi tạo ghi CX MAIN PROC ; tạo thủ tục tên MAIN
Name: tên thay địa câu lệnh Operation: hành động (2-7 kí tự) Operand: liệu để xử lý
Hằng, 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
(6)Khai báo liệu
Khai báo
Chỉ dẫn EQU = Gán giá trị cho tên
name EQU <value> name = <value>
Khai báo biến
Loại 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 biên dịch chương trình
(7)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 ; khai báo biến alpha chiều dài
byte có giá trị khởi tạo
beta DW ? ; khai báo biến beta chiều dài
(8)Mảng (ARRAY)
Thực chất loạt byte hay từ nhớ liên tiếp
nhau truy xuất địa thông qua tên biến
Còn gọi vùng nhớ có tên tổng số byte chiều
dài
Ví dụ: vùng nhớ B_ARRAY chiều dài byte b_array DB 10h,20h,30h
(9)Mảng (ARRAY)
Nếu ASM gán địa offset 0200h cho mảng
B_ARRAY nội dung nhớ sau :
SYMBOL ADDRESS CONTENTS
(10)Mảng (ARRAY)
Ví dụ mảng W_ARRAY phần tử
W_ARRAY DW 1000,40,29887,329
Giả sử mảng bắt đầu 0300h:
SYMBOL ADDRESS CONTENTS
W_ARRAY 300h 1000d W_ARRAY+2 302h 40d
(11)Khai báo liệu
Chuỗi kí tự
Mảng 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ị liệu cần khởi tạo
result DB 100 DUP (‘?’) ; chuỗi 100 dấu ?
(12)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 phần đoạn
CODE DATA
STACK
Chỉ dẫn kiểu nhớ: xác định kích thước đoạn
.model memory_type
(13)Đoạn liệu – DATA Segment
Cú pháp
DATA
;khai báo tên hằng, biến, mảng
Ví dụ
.DATA
WORD1 DW WORD2 DW
(14)Đoạn ngăn xếp – Stack Segment
Cú pháp:
.STACK size
Mặc định 1KB Ví dụ:
(15)Đoạn mã- Code segment
Đoạn chứa mã lệnh chương trình
Bắt đầu CODE, bên chứa mã
lệnh thủ tục
Cú pháp khai báo thủ tục
name PROC
; body of the procedure name ENDP
(16)Ví dụ:
MODEL SMALL ;1 đoạn code đoạn liệu STACK 100h ; dành 256 byte cho stack DATA
; định nghĩa liệu
CODE
MAIN PROC
; thân thủ tục MAIN MAIN ENDP
; thủ tục khác có
END MAIN ; kết thúc chương trình bắt đầu
(17)Các lệnh 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
(18)Các lệnh vào ra
CPU thông tin với cổng ngoại vi I/O
lệnh IN 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
(19)INT 21h
function number routine
9 String input
Input : DX= địa chuỗi ký tự kết thúc $ Output: chuỗi kí tự xuất 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
(20)Chương trình đầu tiên
Đọc ký tự in dòng mới .MODEL SMALL
.STACK 100H .CODE
MAIN PROC
; dấu nhắc MOV AH,2
(21)Chương trình đầu tiên
; nhập 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 cách xuất kí tự ; xuống hàng kí tự đầu hàng
MOV AH,2 ; hàm xuất ký tự
MOV DL,0DH ; ký tự carriage return
INT 21H ; thực xuất kí tự carriage return MOV DL,0AH ; kí tự line feed
(22)Chương trình đầu tiên
; xuất kí tự nhập cất BL
MOV DL,BL ; đưa liệu cất BL vào DL INT 21H ; thực xuất kí tự
; trở DOS
MOV AH,4CH ; hàm thoát DOS INT 21H ; thực exit to DOS