Giới thiệu Hợp ngữ Assembly: ngôn ngữ lập trình bậc thấp, sử dụng chính các câu lệnh trong tập lệnh của VXLđể viết nên một chương trình Ưu điểm của lập trình hợp ngữ: chương trình vi
Trang 1VI XỬ LÝ &
CẤU TRÚC MÁY TÍNH
ĐH CNKT ĐIỆN TỬ TRUYỀN THÔNG K5
Giảng viên: Kiều Xuân Thực Khoa Điện tử
Đại học công nghiệp Hà Nội
CHƯƠNG 3
LẬP TRÌNH ASSEMBLY CHO 8086
Nội dung:
1 Giới thiệu
2 Các chế độ địa chỉ của 80x86
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
3 Một số hàm của ngắt 21h
4 Tập lệnh của 8086
5 Ngăn xếp và thủ tục
1 Giới thiệu
Hợp ngữ (Assembly): ngôn ngữ lập trình bậc thấp, sử dụng chính các câu lệnh trong tập lệnh của VXLđể viết nên một chương trình
Ưu điểm của lập trình hợp ngữ: chương trình viết bằng hợp ngữ chạy nhanh và chiếm ít bộ nhớ hơn so với các chương trình viết bằng các ngôn ngữ bậc cao do:
do:
Trình dịch chỉ cần qua một bước là có thể biên dịch các chương trình này ra mã máy
Lập trình hợp ngữ cho phép đọc hoặc ghi trực tiếp vào các ô nhớ, thanh ghi hay các cổng vào/ra dễ dàng.
Nhược điểm:
Chương trình dài nên khó kiểm soát lỗi, khó bảo trì hơn so với chương trình tương tự viết bằng ngôn ngữ bậc cao
Chương trình viết bằng hợp ngữ chỉ chạy được trên hệ thống tương ứng, không thể thực thi trên hệ thống có kiến trúc và tập lệnh khác.
Trang 2Cú pháp của hợp ngữ
Một chương trình hợp ngữ bao gồm các dòng lệnh,
mỗi lệnh được viết trên một dòng.
Một dòng lệnh có thể là:
Lệnh thật:được hợp ngữ dịch ra mã máy
Hướng dẫn biên dịch: không được dịch ra mã máy
Mỗi một lệnh bao gồm có 4 trường:
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
Mỗi một lệnh bao gồm có 4 trường:
Tên: Mã_lệnh Toán_hạng; Chú_giải
Các trường phải được cách nhau ít nhất một ký tự
trống hoặc TAB.
Một lệnh không nhất thiết phải có đủ 4 trường, VD
trường tên hoặc trường chú giải có thể bỏ qua nhưng
các trường phải xuất hiện theo đúng theo thứ tự.
Ví dụ: NHAP: MOV AX,0; Chuyển 0 vào thanh ghi AX
5
tên biến Tên sẽ được chương trình dịch gán bằng các
địa chỉ cụ thể của ô nhớ.
Trường tên cách với trường mã lệnh bởi dấu (:)
Các quy định khi đặt tên:
Không được dài quá 31 ký tự.
Không được dài quá 31 ký tự.
Bao gồm các chữ cái, chữ số và một số ký tự đặc biệt (!@% _$).
Không được bắt đầu bằng một chữ số.
Không chứa khoảng trống hoặc dấu gạch ngang.
Nếu có dấu (.) thì phải đặt ở vị trí đầu tiên của tên.
Không phân biệt chữ thường, chữ hoa.
Trường mã lệnh: các ký hiệu gợi nhớ biểu thị chức năng
thao tác như MOV, ADD, SHL
Trường toán hạng: toán hạng xác định dữ liệu sẽ được các
lệnh tác động lên Một lệnh có thể không có, có 1 hoặc có 2
toán hạng Ví dụ:
NOP DEC CX MOV AX,1
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
MOV AX,1
Chú ý:
• L ệnh có 2 toán hạng phải cách nhau bởi dấu phảy (,) Toán hạng đầu là toán hạng đích (nơi chứa kết quả), toán hạng thứ hai là toán hạng nguồn, các lệnh thường không làm thay đổi toán hạng nguồn.
• Các toán hạng của lệnh phải có cùng độ lớn hay cùng kiểu thì mới hợp lệ
Ví dụ: MOV AX,BX MOV AX,BL
7
dụng lệnh của chương trình giúp người đọc dễ hiểu Lời giải thích cách với trường toán hạng dấu chấm phảy (;) Chương trình dịch bỏ qua khi dịch đến dấu ;
VD:
; MOV CX,DX MOV CX,5; Khởi tạo đếm bằng 5
Trang 3Dữ liệu chương trình
Qui ước:
1 số thuộc hệ nhị phân là 1 chuỗi các bit kết thúc bằng chữ ‘B’
hay ‘b’
1 số thuộc hệ hexa là một chuỗi các số bắt đầu là một số thập
phân và kết thúc bằng chữ ‘H’ hay ‘h’ Ví dụ: 0AH hoặc 12C5H.
Nếu một số bắt đầu bằng một chữ cái thì phải thêm 0 vào trước số đó để chương trình dịch không nhầm sang một tên
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
trước số đó để chương trình dịch không nhầm sang một tên hay một nhãn.
Riêng đối với một số thuộc hệ thập phân có thể kết thúc số đó
bằng chữ ‘D’ hay ‘d’ (hoặc không có) Ví dụ: 12 hay 12D là như nhau.
Các ký tự hoặc chuỗi ký tự phải được đặt trong dấu nháy đơn
hoặc nháy kép Ví dụ: ‘a’, “Chao ban”.
Các ký tự sẽ được dịch ra mã ASCII của chúng, chương trình dịch sẽ không phân biệt giữa “A” với 41H, 1000001B hoặc 65.
9
Tên_biến Kiểu_biến G iá_trị_khởi_tạo
Tên biến: đặt theo qui ước
Kiểu biến:
Giá trị khởi tạo: đặt giá trị ban đầu cho biến, nếu
không muốn đặt giá trị đầu cho biếnđể ?
VD: Khoa DB 5;
Lop DB ‘DHDT1$’
kiểu ký tự và được gán tên bởi toán tử EQU (equate)
Tên_hằng_số EQU Giá_trị
VD:
CR EQU 0DH
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
CR EQU 0DH
PI EQU 3.14159
11
Khung của một chương trình hợp ngữ title Tên_chương_trình (có thể bỏ qua) model Kiểu_bộ_nhớ
.stack Dung_lượng_ngăn_xếp data
; khai báo các hằng, biến
… code code main proc
; các lệnh chương trình chính
… main endp
; các hàm và thủ tục
… end main
Trang 4.model Kiểu_bộ_nhớ
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
.stack Dung_lượng_ngăn_xếp
VD: stack 100h tạo ngăn xếp kích thước 256byte
Nếu không khai báo thì chương trình tự gán 1Kbyte cho ngăn
xếp
13
.model small
.stack 100H
.data
message DB "I am student!$“
.code
main proc
mov AX,@data
Hiển thị dòng chữ
“I am student!"
lên màn hình bằng hàm số 9 của ngắt
mov AX,@data
mov DS,AX
mov AH,9
mov DX,message
int 21H
mov AH,4CH
int 21H
main endp
end main
hàm số 9 của ngắt 21h
2 Các chế độ địa chỉ của 80x86
1 Chế độ địa chỉ thanh ghi (Register Addressing Mode)
2 Chế độ địa chỉ tức thời (Immediate Addressing Mode)
3 Chế độ địa chỉ trực tiếp (Direct Addressing Mode)
4 Chế độ địa chỉ gián tiếp qua thanh ghi (Register Direct Addressing Mode)
5 Chế độ địa chỉ tương đối cơ sở (Based Relative Addressing
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
5 Chế độ địa chỉ tương đối cơ sở (Based Relative Addressing Mode)
6 Chế độ địa chỉ tương đối chỉ số (Indexed Relative Addressing Mode)
7 Chế độ địa chỉ tương đối chỉ số cơ sở (Based Indexed Relative Addressing Mode)
15
Chế độ địa chỉ thanh ghi
MOV AX,BX ; Chuyển nội dung của BX vào AX
MOV DL,AL ; Chuyển nội dung của AL vào DL
MOV SI,DX ; Chuyển nội dung của DX vào SI
MOV SP,BP ; Chuyển nội dung của BP vào SP
ADD AL,BH ; Cộng nội dung của BH với AL,kết quả lưu trong AL
MOV CL,BX ; Lệnh này sẽ báo lỗi vì đích và nguồn không cùng kiểu
Trang 5Chế độ địa chỉ tức thời
MOV AH,12; chuyển 12 vào thanh ghi AH
MOV DL,0AH; chuyển 10 (0AH) vào thanh ghi DL
MOV AH,01000010B; chuyển 66 vào thanh ghi AH
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
MOV CL, A ; chuyển 65 vào thanh ghi CL
MOV [BX],100; chuyển 100 vào ô nhớ có địa chỉ DS:BX
17
Chế độ địa chỉ trực tiếp
MOV AL, [012H];chuyển nội dung ô nhớ DS:[012H]vào AL
MOV AL, ES:[22];chuyển nội dung ô nhớ ES:[012H]vào AL
MOV [16H], AX ;chuyển nội dung của AX vào hai ô nhớ
;liên tiếp có địa chỉ DS:[16H]và DS:[17H]
;liên tiếp có địa chỉ DS:[16H]và DS:[17H]
MOV BX,[5678H]; chuyển nội dung của hai ô nhớ có địa
;chỉ DS:[5678H]và DS:[5679h]vào BX
Chế độ địa chỉ gián tiếp qua thanh ghi
MOV AX,[BX]; Chuyển nội dung của hai ô nhớ có địa chỉ ;DS:[BX]và DS:[BX+1]vào AX
MOV AL,[BX]; Chuyển nội dung của ô nhớ có địa chỉ DS:[BX] vào AL
MOV [BP],AL; Chuyển nội dung của AL vào ô nhớ có địa chỉ SS:[BP]
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 19
Chế độ địa chỉ tương đối cơ sở
MOV [BP+2],AL; Chuyển nội dung của AL vào ô nhớ có địa
; chỉ SS:[BP+2]
MOV AX,[BX+4 ]; Chuyển nội dung của hai ô nhớ có địa chỉ
; DS:[BX+4]và DS:[BX+5]vào AL và AH
Lệnh này có thể viết như sau:
MOV AX,[BX]+4
Trang 6Chế độ địa chỉ tương đối chỉ số
Ví dụ: MOV AX,[DI+4];
Ý nghĩa: chuyển nội dung của hai ô nhớ có địa chỉ
DS:[DI+4]và DS:[DI+5]vào AX
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 21
Chế độ địa chỉ tương đối chỉ số cơ sở
Ví dụ:
MOV AH,[BX+SI+disp]; disp là hằng số
3 Một số hàm của ngắt 21h
Cách gọi một hàm của ngắt 21h của DOS:
MOV AH, Số_hiệu_hàm;
INT 21H
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 23
Hàm 4C
Cách gọi:
MOV AH,4CH INT 21H
Chức năng: thoát khỏi chương trình, trở về DOS
Chức năng: thoát khỏi chương trình, trở về DOS
Trang 7Hàm 01
Chức năng: nhập 1 ký tự từ bàn phím
Cách gọi:
MOV AH,1 INT 21H
Trả về: AL chứa mã ASCII của ký tự nhập vào; AL = 0
nếu một phím điều khiển hay một phím chức năng
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
nếu một phím điều khiển hay một phím chức năng
được nhấn.
25
Hàm 02
Chức năng: xuất 1 ký tự ra màn hình
Cách gọi:
MOV DL,Mã_ASCII_của_ký_tự;
MOV AH,2 INT 21H
Trả về: AL chứa mã ASCII của ký tự.
Trả về: AL chứa mã ASCII của ký tự.
Chú ý: Nếu DL chứa mã ASCII của ký tự điều khiển,
hàm 2 sẽ thi hành các chức năng điều khiển
Ví dụ:
mov AH,2 mov DL,’A’
; mov DL,7 int 21H
Ví dụ minh họa
.model small stack 100H data
.code main proc
mov AH,2 mov DL,0AH int 21H mov DL,0DH int 21H
Nhập vào một ký
tự rồi hiển thị ký
tự đó ở đầu dòng tiếp theo!
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
mov AH,1 int 21H mov BL,AL
27
mov DL,BL int 21H mov AH,4CH int 21H
main endp end main
tiếp theo!
Hàm 09
Chức năng: hiểm thị 1 chuỗi ký tự ra màn hình, địa chỉ của chuỗi ký tự DS:DX
Cách gọi:
MOV AX,@DATA MOV DS,AX; nhập địa chỉ đoạn dữ liệu vào DS LEA DX,Tên_của_chuỗi_ký_tự; nhập địa chỉ lệch của chuỗi vào DX LEA DX,Tên_của_chuỗi_ký_tự; nhập địa chỉ lệch của chuỗi vào DX MOV AH,9
INT 21H
Chú ý: @data trả về địa chỉ đoạn dữ liệu được định nghĩa bởi data ở đầu chương trình.
Trang 8Ví dụ
.model small
.stack 100H
.data
tb1 DB “Moi ban nhap vao 1 ky tu thuong:$”
tb2 DB 10,13,“Doi thanh chu hoa la:$”
.code
mov AH,1 int 21H mov BL,AL sub BL,20h mov AH,9 LEA DX,tb2 int 21H mov AH,2
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
.code
main proc
mov AX,@data
mov DS,AX
mov AH,9
LEA DX,tb1
int 21H
29
mov AH,2 mov DL,BL int 21H mov AH,4CH int 21H main endp end main
4 Tập lệnh của 8086
1 Nhóm lệnh dịch chuyển dữ liệu
2 Nhóm lệnh số học
3 Nhóm lệnh điều khiển rẽ nhánh
4 Nhóm lệnh xử lý bit
4 Nhóm lệnh xử lý bit
5 Nhóm lệnh xử lý điều khiển
Nhóm lệnh dịch chuyển dữ liệu
MOV đích, nguồn
Toán hạng đích
Toán hạng nguồn
Thanh ghi đa năng
Thanh ghi đoạn
Ô nhớ Hằng số
Thanh ghi đa năng Có thể Có thể Có thể Không thể
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
MOV DS,ES MOV DS,0AH
31
Thanh ghi đa năng Có thể Có thể Có thể Không thể Thanh ghi đoạn Có thể Không thể Có thể Không thể
Ô nhớ Có thể Có thể Không thể Không thể Hằng số Có thể Không thể Có thể Không thể
Lệnh OUT
Dạng lệnh: OUT cổng,thanh_ghi_chứa Thao tác: Lệnh OUT xuất dữ liệu từ thanh ghi chứa
(AL) ra cổng
Lệnh IN
Dạng lệnh: IN thanh_ghi_chứa, cổng
Dạng lệnh: IN thanh_ghi_chứa, cổng Thao tác: Lệnh IN đọc dữ liệu từ cổng vào thanh
ghi (AL).
Trang 9Nhóm lệnh số học
Lệnh ADD, SUB
Dạng lệnh: ADD đích, nguồn
SUB đích, nguồn
Lệnh ADD/SUB thực hiện cộng/trừ nội dung của toán
hạng đích với toán hạng nguồn, kết quả lưu vào toán hạng đích, nguồn không thay đổi.
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
hạng đích, nguồn không thay đổi.
33
Toán hạng đích
Toán hạng nguồn
Thanh ghi
đa năng Ô nhớ Hằng số
Thanh ghi đa năng Có thể Có thể Không thể
Ô nhớ Có thể Không thể Không thể Hằng số Có thể Có thể Không thể
Lệnh DEC (DECrement)
Dạng lệnh: DEC đích
Thao tác: Giảm đích đi 1.
Tương đương với lệnh SUB đích,1.
Lệnh INC (INCrement)
Lệnh INC (INCrement)
Dạng lệnh: INC đích
Thao tác: Tăng đích thêm 1.
Tương đương với lệnh ADD đích,1.
Lệnh MUL (MULtiply)
Dạng lệnh: MUL nguồn
Thao tác: Lệnh MUL nguồn thực hiện nhân nội dung của AL với
nguồn nếu nguồn là một byte, tích mặc định chứa trong AX;
hoặc nhân nội dung của AX với nguồn nếu toán hạng nguồn là một word, tích mặc định chứa trong DX: AX.
Nguồn không được là hằng số.
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
Nguồn không được là hằng số.
Ví dụ: mov AL,3
mov BL,5 mul BL mov DX,AX mov AL,6 mov Bl,8 mul BL add AX,DX
35
Lệnh DIV (DIVide)
Thực hiện phép chia không dấu.
Dạng lệnh: DIV nguồn
Thao tác: Số chia là nguồn có thể là một ô nhớ hay thanh ghi.
Trong phép chia cho byte ( nguồn là 8 bit), số bị chia
là chứa trong AX, kết quả thương số chứa trong AL
và số dư trả về trong AH.
Khi thực hiện phép chia cho word ( nguồn là 16 bit),
số bị chia 32 bit chứa trong DX:AX Kết quả thương
số chứa trong AX và số dư trả về trong DX.
Trang 10Nhóm lệnh điều khiển rẽ nhánh
Nhảy ngay đến Nhãn_lệnh mà không cần điều kiện gì
Với các lệnh nhảy có điều kiện thì khi gặp lệnh nhảy, nếu như
điều kiện của lệnh nhảy được thoả mãn thì Nhãn_lệnh được thi hành còn nếu ngược lại thì thực hiện lệnh nằm ngay sau lệnh nhảy Nhãn_lệnh có thể đặt trước hoặc sau lệnh nhảy.
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
nhảy Nhãn_lệnh có thể đặt trước hoặc sau lệnh nhảy.
Phạm vi của lệnh nhảy có điều kiện trong khoảng 128 byte trước
lệnh nhảy và 127 byte sau lệnh nhảy
Dạng lệnh: Lệnh_nhảy Nhãn_lệnh
Điều kiện: dùng lệnh so sánh CoMPare:
CMP đích, nguồn
CMP: Trừ đích cho nguồn và thiết lập các cờ theo kết quả của phép tính, 2 toán hạng vẫn thay đổi giá trị.
Hiển thị các số từ 0 đến 8 trên
màn hình!
Hiển thị các số từ 0 đến 9 trên
màn hình?
Trang 11HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 41
Bài tập
Tính tổng: 1+2+…+100, lưu kết quả ở BX
Tính tổng: 1+3+…+101, lưu kết quả ở DX
Tính 7!, lưu kết quả ở BX
Nhóm lệnh xử lý bit
Các lệnh logic: AND, OR, XOR
Ứng dụng: xóa bit, thiết lập bit, đảo giá trị bit trong 1 byte/word bằng cách AND, OR, XOR với mặt nạ
Ví dụ:
and AL,0DFH; xoá bit 5 của AL
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering
and AL,0DFH; xoá bit 5 của AL
OR AH,81H; thiết lập bit 0 và bit 3 của AH XOR AH,81H; đảo bit 0 và bit 3 của AH
43
Các lệnh dịch: SHL và SHR
Trang 12VD: nhập 16 bit, lưu vào BX
Dùng hàm 01 của ngắt 21h để đọc bàn phím.
Nhập 0: Al chứa 30H; Nhập 1: AL chứa 31H
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 45
Bài tập
Nhập tối đa 16 bit để lưu vào BX, dừng
nhập khi nhấn Enter.
Các lệnh quay: ROL và ROR
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 47
Các lệnh quay qua cờ CF: RCL và RCR
Trang 13BT: xuất 16 bit của BX ra màn hình
Dùng hàm 02 của ngắt 21h để xuất ra màn hình.
Xuất 0: DL chứa 30H; xuất 1: DL chứa 31H
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 49
5 Ngăn xếp & thủ tục
Ngăn xếp: lưu trữ dữ liệu tạm thời kiểu LIFO
Cất vào ngăn xếp: PUSH
Lấy ra: POP
Ví dụ
Mov ax, 3 Mov bx,5 Mov bx,5 Mul bl Push ax Mov ax, 4 Mov bx,6 Mul bl Pop bx Add ax,bx
VD nhập 4 số có 1 chữ số, tính tổng
HANOI UNIVERSITY OF INDUSTRY Faculty of Electronic Engineering 51
Thủ tục
Trang 14 Làm các BT cuối chương 3 của Giáo trình.
Đọc trước Chương 4 của Giáo trình.