Mục đích
Làm quen với ngôn ngữ lập trình Assembly
Biết cách viết, dịch, chạy và chẩn lỗi (debug) một vài chương trình đơn giản
Tóm tắt lý thuyết
Hợp ngữ (assembler) là ngôn ngữ bậc thấp, giúp cho người lập trình không phải ghi nhớ mã máy (opcode) mà sử dụng các từ ngữ gợi nhớ (pseudo-code) gần với ngôn ngữ tự nhiên để miêu tả công việc cần thực hiện. Tuy vậy, assembler rất gần với ngôn ngữ máy, đòi hỏi người lập trình phải hiểu biết tương đối đầy đủ về cấu trúc phần cứng máy tính.
Với mỗi kiểu kiến trúc của bộ vi xử lý, có một bộ lệnh riêng, do đó, có một ngôn ngữ assembler riêng cho nó. Ở đây, chúng ta nghiên cứu assembler cho các bộ vi xử lý Intel thuộc họ x86. Các chương trình sẽ được viết cho chế độ thực (real mode) trong DOS và được biên dịch bằng Turbo Assembler.
Cấu trúc thông thường của một chương trình hợp ngũ
.model <Khai báo kiểu chương trình>
.stack <Khai báo kích thước ngăn xếp>
.data
<Khai báo dữ liệu>
.code
<Các lệnh>
end
Ví dụ: Chương trình sau in ra màn hình dòng chữ “XIN CHAO CAC BAN”
.MODEL SMALL ; KHAI BAO CHE DO BO NHO
.STACK 100H ;KHAI BAO BO NHO DANH CHO CHUONG TRINH
.DATA ;PHAN CHUA DU LIEU CHO CHUONG TRINH
TB DB “XIN CHAO CAC BAN $” ; <TEN BIEN> <KIEU DU LIEU> <DU LIEU>
.CODE
MOV AX,@DATA ;NAP DU LIEU VAO THANH GHI DX
MOV DS,AX ; DU LIEU DC CHUYEN DEN THANH GHI DATA SEGERMENT
LEA DX,TB ; XAC DINH HAY NAP DU LIEU , TEN BIEN CAN IN
MOV AH,9 ; AH =9 IN DU LIEU TU THANH GHI DX RA MAN HINH
INT 21H ; HAM GOI LENH DOS CUA MAY
MOV AH,4CH ; AH=4CH THOAT CT
INT 21H
END ; KET THUC CHUONG TRINH TAI DAY
Lưu ý:
– Mọi chương trình đều phải có đoạn code thoát khỏi chương trình, nếu không chương trình sẽ không dừng khi hết chương trình của mình.
Khai báo biến trong hợp ngữ
Cú pháp:
<tên biến> D<Kiểu DL> <giá trị khởi tạo>
hoặc
<tên biến> D<Kiểu DL> <số phần tử> dup(<giá trị khởi tạo>)
Các kiểu dữ liệu: B (1 byte), W (2 bytes), D (4 bytes)
Nếu không khởi tạo, dùng dấu hỏi “?”
Ví dụ:
Khai báo trong C Khai báo trong hợp ngữ
char ch; ch DB ?
char ch = ‘a’; ch DB ‘a’
char ch = 5; ch DB 5
char s[]=”\nhello world!” s DB 10,13,”hello world!$”
int i=100; i DW 100
long l; l DD ?
char a[] = {1,2,3}; a DB 1,2,3
char a[100]; a DB 100 dup(?)
char a[100][50]; a DB 100 dup(50 dup(?))
Chương Trình Hello Word
Một số lệnh cơ bản
MOV des,src : chép dữ liệu từ src sang des
INC des : tăng des một đơn vị
DEC des : giảm des một đơn vị
ADD des,src : des = des + src
SUB des,src : des = des – src
INT num : gọi ngắt
Tài liệu học assembly: Google