Tải bản đầy đủ (.pdf) (17 trang)

Chng 3 nhp mon ASM ngon ng assembly

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (238.15 KB, 17 trang )

Chương 3
Nhập mơn ASM
Khoat Nguyen

Ngơn ngữ Assembly
{

{
{

{

Chương trình Assembly được dịch ra mã máy bằng
một trình biên dịch, vì thế chúng cần được viết sao
cho phù hợp với các khuôn mẫu của trình biên dịch.
Trong chương này chúng ta sẽ sử dụng trình biên
dịch của Microsoft Marco Assembler(MASM).
Mã lệnh Assembly không phân biệt chữ hoa hay chữ
thường như trong ngôn ngữ C(C++).
Các dịng lệnh: Cũng giống như các ngơn ngữ lập
trình bậc cao khác, chương trình bao gồm các dịng
lệnh, tuy nhiên ở ngơn ngữ này mỗi dịng lệnh chỉ
được viết trên một dòng. Một dòng lệnh là một lệnh
mà trình biên dịch sẽ dịch ra mã máy, hay là một
hướng dẫn biên dịch để trình biên dịch thực hiện
một số thao tác đặc biệt nào đó. Mỗi lệnh trong
Assembly bao gồm 4 trường
Tên Tốn tử
Tốn hạng
Chú thích


1


{

{

{

{

Các trường phải được phân cách nhau bằng ít nhất
một ký tự trống hay TAB
Vd: DCH
MOV AH,2
;Hàm hiển thị ký
tự.
MAIN
PROC
Trong Vd trên, trường tên là nhãn DCH, toán tử là
MOV, tốn hạng là AH và 2, chú thích là “Hàm hiển
thị ký tự”. MAIN là tên, và toán hạng là PROC. Dẫn
hướng biên dịch này khai báo một chương trình con
có tên là PROC.

Trường tên
z Trường tên được sử dụng làm nhãn lệnh,
tên các hàm, thủ tục, và tên các
biến.Trình biên dịch sẽ chuyển các tên
này thành các địa chỉ trong bộ nhớ.

z Các tên có chiều dài 1÷ 31 ký tự bao
gồm cả chữ số, chữ cái và các ký tự đặc
biệt (Các tên không được bắt đầu bằng
một chữ số).

2


{

{

{

Trường toán tử
z Chứa mã lệnh dạng tượng trưng (symbolic). Trình
biên dịch sẽ chuyển mã lệnh tượng trưng sang
mã lệnh của ngơn ngữ máy.
Trường tốn hạng
z Trường tốn hạng xác định dữ liệu sẽ được các
thao tác động đến đối với lệnh có một tốn hạng,
đối với lệnh hai tốn hạng, toán hạng đầu tiên là
một thanh ghi hoặc một ô nhớ, đây có thể là nơi
lưu trữ dữ liệu, toán hạng thứ hai là toán hạng
nguồn, toán hạng này khơng bị thay đổi nội
dung.

Trường chú thích
z được sử dụng để giải thích xem tại dịng
lệnh đó người viết chương trình định làm

gì. Mở đầu trường phải là một dấu “;”, khi
đó trình biên dịch sẽ bỏ qua mọi thứ được
viết đằng sau dấu “;”.

3


Dữ liệu
{

{

Bộ VXL làm việc với dữ liệu nhị phân, vì thế trình biên dịch
sẽ chuyển tất cả các dạng dữ liệu khác nhau thành dữ liệu
nhị phân.
Các cách biểu diễn số liệu trong MASM:
z Một số nhị phân biểu diễn bằng chuỗi các bit kết thúc
bằng chữ cái “b” (01010b)
z Một số thập phân biểu diễn bằng chuỗi các chữ số thập
phân kết thúc bằng chữ cái “d”
z Một số hexa biểu diễn luôn bắt đầu bằng một chữ số
thập phân và kết thúc bằng chữ cái “h”
z Các ký tự và chuỗi được biểu diễn trong dấu nháy đơn ‘ ‘
hoặc nháy kép “”

{

Một số toán tử giả định nghĩa các kiểu số liệu:

Toán tử


Biểu diễn kiểu số liệu

DB

Định nghĩa byte

DW

Định nghĩa word

DD

Định nghĩa từ kép

DQ

Định nghĩa 4 word

DT

Định nghĩa 10 byte

4


Các biến
{

{


{

Các biến trong ngơn ngữ Assembly có
vai trị giống như các biến sử dụng
trong các ngơn ngữ lập trình bậc cao
khác (C,C++, Pascal…).
Mỗi biến có một kiểu dữ liệu, và được
gán một địa chỉ trong bộ nhớ
Các biến kiểu byte

Khai báo có dạng:
Tên DB
giá trị khởi tạo
Vd:
Count_1
DB
10 ; Sẽ báo cho trình
biên dịch gán cho tên Count_1 một ơ nhớ có
độ dài là 1 byte, với giá trị thiết lập ban đầu
là 10.
Nếu không muốn thiết lập giá trị ban đầu thì
ta có thể khai báo:
Count_1
DB
?
z

5



{

{

Các biến kiểu word
Khai báo có dạng:
Tên
DW giá trị khởi tạo
Vd:
Count_2 DW 10 ; Sẽ báo
cho trình biên dịch gán cho tên
Count_2 một ơ nhớ có độ dài là 1 word
, với giá trị thiết lập ban đầu là 10.
Nếu khơng muốn thiết lập giá trị ban
đầu thì ta có thể khai báo:
Count_2 DW ?

Mảng
z

Là một chuỗi các byte, hay word nhớ

Khai báo có dạng:
Tên DB
arr1, arr2,….., arrn
Vd:
String_b
DB
12h, 13h, 14h ; Sẽ báo cho trình

biên dịch gán cho tên String_b byte nhớ đầu tiên,
String_b+1 byte nhớ thứ hai, String_b+2 byte nhớ
thứ ba
Khai báo có dạng:
Tên DW
arr1, arr2,…… arrn
Vd: String_ w
DW
12Ah, 13Bh, 14Ch ; Sẽ
báo cho trình biên dịch gán cho tên String_ w word
nhớ đầu tiên, String_ w+2 word nhớ thứ hai, String_
w+4 word nhớ thứ ba

6


Phần tử
Sring_b
String_b+1
String_b+2

Địa chỉ
112h
113h
114h

String_w
String_w+2
String_w+4


112h
114h
116h

{

{

Nơi dung
12h
13h
14h
12Ah
13Bh
14Ch

Khai báo hằng
z Khai báo có dạng:
Tên
EQU
const ; EQU=
EQUATES
Vd: First
equ
0Dh ; Gán tên First
cho 0Dh, là mã Ascii của ký tự trở về đầu
dòng, và tên First sẽ được sử dụng trong
chương trình
MOV
DL, First.


7


Cấu trúc chương trình
{

{

Các chương trình bằng ngơn ngữ máy gồm
có mã , dữ liệu, và ngăn xếp. Mỗi phần này
chiếm một đoạn bộ nhớ, đây cũng chính là
tổ chức chương trình của ngơn ngữ
Assembly. Mã,dữ liệu, và ngăn xếp được
cấu trúc như các đoạn chương trình. Mỗi
đoạn chương trình sẽ được dịch thành một
đoạn bộ nhớ bởi trình biên dịch

Các chế độ bộ nhớ
z Kích thước của mã và dữ liệu trong một
chương trình được xác định bằng cách
chỉ ra chế độ bộ nhớ nhờ sử dụng cú
pháp:
{ .MODEL

z

kiểu bộ nhớ

Các kiểu bộ nhớ thường dùng:


8


Kiểu

Mô tả

SMALL

Mã lệnh trong một đoạn, dữ liệu trong một đoạn

MEDIUM

Mã lệnh chiếm nhiều hơn một đoạn, dữ liệu trong
một đoạn.

COMPACT

Mã lệnh trong một đoạn, dữ liệu chiếm nhiều hơn
một đoạn.

LARGE

Mã lệnh chiếm nhiều hơn một đoạn, dữ liệu chiếm
nhiều hơn một đoạn.
Các mảng <64K.

HUGE


Mã lệnh chiếm nhiều hơn một đoạn, dữ liệu chiếm
nhiều hơn một đoạn.
Các mảng có thể >64K.

{

{

Các chế độ bộ nhớ thường được sử dụng
là: SMALL, MEDIUM, COMPACT, và
LARGE. Trừ khi có nhiều mã lệnh hay số
liệu, thì kiểu thích hợp nhất là SMALL.

Chú ý: .MODEL phải được khai báo vào
trước bất kỳ một định nghĩa đoạn nào.

9


Đoạn dữ liệu
{

Đoạn dữ liệu của một chương trình chứa
các định nghĩa biến, hằng.
Cú pháp: .DATA
Vd: Mess_1
Mess_2
DW
MSG
DB

Portb
EQU

{

DW 2
4
‘This is a Message’
0x85h

Đoạn ngăn xếp
z Dùng để tạo một khối bộ nhớ để chứa ngăn xếp
z

z

Cú pháp: .STACK

kích thước

Kích thước: một số tuỳ ý xác định vùng kích
thước ngăn xếp được tính theo byte.Chú ý: Trình
biên dịch mặc định kích thước nếu không khai
báo là: 1Kb

Vd:
.STACK

z


100h

;Tạo ra 100h byte vùng ngăn xếp

10


{

Đoạn mã
z

Chứa các lệnh của chương trình

z

Cú pháp: .CODE

z

Tên: Đây là một tên đoạn, có thể có hoặc khơng.

z

z

Bên trong một đoạn mã, các lệnh được tổ chức
các thủ tục: Khai báo một thủ tục trong ngôn ngữ
Assembly là:


Tên_thủ_tục
{

z

z

tên

PROC

; thân thủ tục

Tên_thủ_tục

ENDP

Vd:
.CODE
MAIN
PROC
; Các lệnh của chương trình
MAIN
ENDP
;Các thủ tục khác

11


{


{

Khn mẫu chương trình
.MODEL
SMALL
.STACK
100h
.DATA
; Các định nghĩa có các biến
.CODE
MAIN PROC
;Các lệnh người dùng
MAIN
ENDP
; Các thủ tục khác
END
;
Kết thúc một chương trình chính ln ln phải có
END

Xây dựng chương trình
{
z

Tìm hiểu một số lệnh vào ra
Lệnh INT: Lệnh này đựơc dùng để gọi các hàm
của DOS và BIOS.
{
Cú pháp:

INT
Số_hiệu_ngắt ;Số hiệu
ngắt xác định hàm mà DOS, BIOS cung cấp,
trong phần này chúng ta sẽ xem qua ngắt 21
của DOS
{
Ngắt 21: được dùng để gọi rất nhiều hàm của
DOS, mỗi hàm được gọi bằng cách đặt số hàm
vào trong thanh ghi AH, ở đây ta sử dụng các
hàm có số hiệu: 1, 2, 9.Trong đó hàm có số
hiệu 1 là hàm vào một ký tự từ bàn phím, số
hiệu 2 là hàm đưa một ký tự ra màn hình, và
số hiệu 9 là hàm đưa một chuỗi ký tự ra màn
hình.

12


Hàm 1
Vào

Ra

AH=1 AL=0:
phím
điều
khiển
=1;Mã
Ascii


z

z

Hàm 2

Hàm 9

Vào

Ra

Vào

AH=2
DL=Mã
Ascii của
ký tự hiển
thị hay ký
tự
điều
khiển

AL= Mã
Ascii của
ký tự hiển
thị hay ký
tự
điều
khiển


AH=9
DX: địa chỉ
tương đối
của chuỗi.
Kết
thúc
chuỗi bằng
‘$’.

Ra

Khi kết thúc một chương trình cần trả lại quyền
điều khiển cho DOS, chúng ta thực hiện điều này
bằng cách gọi hàm 4Ch của ngắt 21.
Chương trình
{

Xây dựng một chương trình để đọc một ký tự
từ bàn phím và hiển thị.

13


.MODEL
SMALL
;Xuống dòng
.STACK
100h
MOV AH, 2

.CODE
MOV DL, 0Dh ;Ký tự điều
MAIN
PROC
khiển
;Hiển thị dấu ‘?’
INT 21h
MOV AH, 2
MOV DL, 0Ah ;Ký tự điều
;Hàm hiển thị ký tự
khiển
MOV DL, ’?’
INT 21h
;Ký tự hiển thị ‘?’
;Hiển thị ký tự
INT 21h
MOV AX,BL
;Hiển thị ký tự.
INT 21h
; Đọc một ký tự từ bàn phím
;Trả quyền điều khiển về
DOS
MOV AH,1 ;Hàm đọc một
ký tự
MOV AX, 4C00h
INT 21h
INT 21h
MOV BL, AL
MAIN ENDP
;Cất ký tự vào trong BL

END
MAIN

{

Biên dịch và chạy chương trình
z Sau khi dùng một chương trình soạn thảo văn bẳn tạo ra
một tệp (File) chương trình nguồn với tên là *.asm
(Phần mở rộng luôn phải là asm, đây là quy ước của
trình biên dịch Assembly), với ví dụ ở trên giả sử sau
soạn thảo ta đặt tên là Prog_in.asm.
z

Sử dụng trình biên dịch MASM để dịch tệp nguồn
Prog_in. asm sang tệp ngôn ngữ máy Prog_in.obj. Cú
pháp biên dịch là: C:\ MASM Prog_in. asm; ↵, dấu ‘;’
theo sau câu lệnh có nghĩa là ta chỉ muốn trình biên dịch
tạo ra một tệp biên dịch duy nhất. Nếu không có dấu ‘;’,
trình biên dịch sẽ tạo ra thêm tệp có tên là *.lst, và tệp
*.crf. MASM sẽ kiểm tra lỗi cú pháp của tệp *.asm, nếu
tìm thấy lỗi nó sẽ hiển thị dòng của lệnh hay cú pháp
gây lỗi và nguyên nhân gây lỗi, nếu không thấy lỗi nào,
MASM sẽ dịch mã ngôn ngữ Assembly thành tệp đối
tượng ngôn ngữ máy với tên *.obj mà cụ thể ở đây là
Prog_in.obj

14


z


z

Sau khi có tệp Prog_in.obj ta cần dịch
chúng ra tệp Prog_in.exe để thực hiện
chương trình. Cú pháp: C:\Link
Prog_in.obj;↵
Sau đó chạy tệp *.exe vừa dịch, cụ thể ở
đây là: C:\Prog_in.exe

Soạn thảo
Tệp *.asm
Trình biên dịch

Tệp *.obj
Trình liên kết

Tệp *.exe

15


Ví dụ
{

{

{

Hiển thị chuỗi ký tự “Chao mưng ban den voi ngon

ngu Assembly”. Trong chương trình này ta sẽ sử
dụng hàm 9 của ngắt 21
Hàm 9 của ngắt 21: Hàm này yêu cầu địa chỉ tương
đối của chuỗi ký tự chứa trong DX
Sử dụng lệnh LEA(Load Effective Adress, nạp địa chỉ
thực)
z

{

Cú pháp : LEA dest, source

Trong đó
z dest:là một thanh ghi công dụng chung
z source là một ô nhớ
z lệnh thực hiện copy địa chỉ tương đối của source(nguồn)
sang dest(đích)
z tại sao ta lại phải sử dụng câu lệnh này?
Do ở ví dụ này chúng ta sử dụng đoạn dữ liệu là chuỗi ký
tự mà khi một chương trình được nạp vào bộ nhớ, DOS sẽ
dành 256 byte đoạn mở đầu chương trình (Program
Segment Prefix, PSP), PSP chứa các thơng tin về chương
trình vì thế chương trình có thể truy nhập vùng nhớ này.
DOS sẽ đưa địa chỉ của PSP vào trong DS lẫn ES trước khi
chạy chương trình do đó DS sẽ khơng chứa địa chỉ đoạn
dữ liệu mà ta viết trong chương trình ví dụ.

16



.MODEL
SMALL
.STACK
.DATA
String_in
Assembly”
.CODE
MAIN
;Khỏi tạo DS
MOV AX, @DATA
MOV DS, AX
;Hiển thị thông báo
LEA DS, String_in
MOV AH, 9
INT 21h
;Trở về DOS
MOV AH, 4Ch
INT 21h
MAIN
ENDP
END MAIN

100h
DB

“Chao mưng ban den voi ngon ngu

PROC
;Tên của đoạn dữ liệu được định nghĩa
; bởi .DATA, trình biên dịch sẽ dịch @DATA

; thành địa chỉ
;Lấy chuỗi ký tự
;Hàm hiển thị

Bài tập
{

{

{

Viết chương trình thực hiện các cơng việc sau:
z Hiển thị ký tự “!”
z Đọc hai chứ số thập phân có tổng nhỏ hơn 10
z Hiển thị các số đó và thơng báo tổng của hai số đó
Viết chương trình thực hiện các công việc sau:
z Hiển thị thông báo nhập số liệu
z Nhập vào 3 chữ cái đầu tương ứng với :Họ, Tên đệm,
Tên
z Hiển thị lên màn hình
Viết một chương trình đọc một chữ số Hex rồi hiển thị
chúng dưới dạng nhị phân

17



×