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

Assembler 86

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 (91.2 KB, 8 trang )

11
CHƯƠNG 4 : ASSEMBLER 86
Ngữ pháp của các trình hợp dòch thông dụng hiện nay như MASM,TASM ... khá phức tạp, do đó tài
liệu này sẽ chỉ trình bày các phần căn bản mà hầu hết trình hợp dòch thông dụng đều chấp nhận. Những
phần căn bản nhất của ngữ pháp của assembler cho bộ xử lý 8088/86 sẽ được trình bày trong chương này.
Các phần khác sẽ được đề cập đến trong các chương sau.
4.1NGỮ PHÁP CỦA ASSEMBLER 86
4.1.1Khai báo segment
Chương trình của chúng ta có thể sử dụng đến nhiều segment khi được thực hiện :
Để truy nhập đến mỗi segment, ta phải gán đòa chỉ của segment tương ứng cho các thanh ghi
segment . Sau đó, các phần tử thuộc về segment sẽ được truy nhập thông qua offset của nó trong segment
ấy.
Lưu ý là việc gán giá trò cho các thanh ghi segment chỉ được thực hiện trong lúc chương trình đang
thực hiện . Trong quá trình hợp dòch, trình hợp dòch không thể kiểm soát được giá trò thực của thanh ghi
segment . Do đó sự phân chia chương trình thành các segment hoàn toàn là các ý niệm của người lập trình
.
Một trong các nhiệm vụ quan trọng của trình hợp dòch là xác đònh chính xác các offset theo các
segment của chương trình chúng ta . Nếu không có một sự lưu ý nào về segment sẽ được sử dụng, trình
hợp dòch sẽ cho rằng toàn bộ chương trình ở trong cùng một segment . Khi ấy các phần tử thuộc chương
trình đều được trình hợp dòch xác đònh đòa chỉ tương đối (offset) theo điểm đầu của chương trình . Thí dụ :
một vò trí thuộc SEGMENT-B sẽ được tính offset theo cự ly từ đầu SEGMENT-A cho đến vò trí của nó
trong toàn bộ đoạn mã chương trình được tạo ra .Khai báo về Segment sẽ lưu ý trình biên dòch về phạm vi
của các segment cùng các phần tử thuộc về chúng.Theo đó trình biên dòch sẽ xác đònh đúng các offset
tương ứng theo nguyên tắc : phần tử được xét thuộc segment nào sẽ được xác đònh cự ly theo điểm khởi
đầu của segment ấy .
SEGMENT-A
SEGMENT-B
SEGMENT-C
Var_X
Offset Var_X
nếu có khai


báo Segment
Offset Var_X
nếu không khai
báo Segment
12
Một Segment được khai báo với trình hợp dòch theo dạng thức sau :
Tên-segment Segment [word/byte] [Public]
.
.
( Phạm vi của segment )
.
.
Tên-segment ends
Các phần tử thuộc về segment nào phải được mô tả bên trong cấu trúc segment đó. Để xác đònh
thanh ghi segment sẽ dùng cho segment được mô tả ta dùng khai báo sau :
Assume Thanh-ghi:Tên-segment[,Thanh-ghi:Tên-segment [...] ]
TD : Assume CS:Code,DS:Code ;xác đònh với trình hợp dòch CS và DS sẽ cùng mang giá trò của
Code segment .
Lưu ý :
Chỉ thò Assume chỉ là sự khai báo cho trình hợp dòch biết các thanh ghi segment sẽ được sử dụng như
thế nào chứ không tạo ra phép gán giá trò cho các thanh ghi ấy !
4.1.2Khai báo thủ tục
Chương trình của chúng ta được viết thành các thủ tục (procedure) . Một procedure có cấu trúc như
sau :
Tên-procedure proc [near/far]
.
.
Tên-procedure endp
Bên trong thủ tục là các lệnh, các khai báo về dữ liệu ... Mỗi một lệnh, mỗi một khai báo đều được
viết dưới dạng một dòng lệnh .

Khai báo thủ tục trong hợp ngữ chỉ là hình thức . Chúng ta có thể bỏ qua các khai báo ấy mà vẫn tạo
lập được một số chương trình đơn giản . Tuy vậy viết chương trình dưới dạng các thủ tục sẽ làm chương
trình của chúng ta trở nên rõ ràng và dễ quản lý hơn .
Khi chương trình được viết dưới dạng các thủ tục, việc khai báo thủ tục rất quan trọng. Trình hợp
dòch sẽ căn cứ trên các khai báo ấy mà xác đònh chính xác các mã lệnh tương ứng với các chỉ thò JMP,
CALL và RET .
4.1.3Cấu trúc một dòng lệnh
A. Dòng lệnh mô tả :
Mô tả hằng ( không tạo ra mã lệnh )
Tên EQU Giá trò
Mô tả hằng dùng để đònh nghóa một số giá trò sẽ được dùng đến trong chương trình . Sau khi được
mô tả, mỗi khi sử dụng đến giá trò nào chúng ta chỉ cần dùng tên tương ứng . Trình hợp dòch sẽ tự động
thay thế giá trò thực của hằng vào đoạn mã tương ứng .
Mô tả biến
Tên Loại Danh sách giá trò
( Trong đó Loại có thể là [Byte/Word/Dword] )
Mô tả biến dùng để xác đònh một đòa chỉ,từ đó bắt đầu lưu chứa các thông tin với tính chất nêu trong
“Loại” và chi tiết được liệt kê trong “Danh sách giá trò”. Khi cần truy nhập đến các thông tin này chúng ta
dùng tên biến như một mốc đòa chỉ.

13
Thí dụ : Biến-A đòa chỉ tại nơi khai báo Biến-A
Biến-A[1] đòa chỉ Biến-A + 1
Biến-A[2] đòa chỉ Biến-A + 2
Biến-A[-1] đòa chỉ Biến-A - 1

Trình hợp dòch sẽ tự động đổi ra đòa chỉ thực của biến trong các chỉ thò có dùng đến biến.
Mô tả nhãn
Tên LABEL Loại
( Trong đó Loại có thể là [Byte/Word/Dword/Near/Far] )

Mô tả nhãn dùng để xác đònh một vò trí trong chương trình,tính chất của đòa chỉ ấy tùy thuộc vào
“Loại” được khai báo . Trình hợp dòch sẽ tạo ra các đòa chỉ,các cự ly thực trong các chỉ thò có liên hệ đến
tên nhãn.
Mô tả biến và nhãn cho phép chúng ta chỉ đònh các vò trí trong chương trình theo vò trí logic của
chúng chứ không theo đòa chỉ thực của chúng . Khi hợp dòch, trình hợp dòch sẽ tính các cự ly thực sự và
thay thế chúng vào các mã lệnh tương ứng .
Để lấy đòa chỉ một phần tử dùng cấu trúc :

Offset Tên-phần-tử

Thí dụ : Mov dx,offset Biến-A
Các quy đònh chung :
Tên : là một chuỗi tạo bởi các ký tự, các ký số và - (dấu gạch dưới). Tên không được bắt đầu bằng
ký số.
Trình hợp dòch quy đònh sau dấu chấm phẩy (;) là các lời chú thích. Ta có thể đặt bất cứ ghi chú gì ở
đấy .
Mỗi giá trò trong mô tả hằng hoặc biến có thể là :
- Một hằng số, một tên hằng đã khai báo
- Một biểu thức gồm các hằng số,tên hằng tạo thành từ các phép toán:
- Số học : + - * /
- Logic : NOT AND OR XOR
- và dấu ()
Thí dụ :
GT-A equ 020h ; Có giá trò là 00100000b
GT-B equ 040h ; Có giá trò là 01000000b
Biến-A db NOT 010h ; Có giá trò là 11101111b
Biến-B db GT-A OR GT-B ; Có giá trò là 01100000b
B. Dòng lệnh thực hiện
[Nhãn:] Lệnh Đối tượng
Tên : là một chuỗi tạo bởi các ký tự, các ký số và - (dấu gạch dưới).

Tên không được bắt đầu bằng ký số. Sau dấu chấm phẩy (;) là các lời chú thích . Ta có thể đặt bất
cứ ghi chú gì ở đấy .
4.1.4Các loại (kiểu) cơ bản
Loại :
Loại byte : khai báo bằng từ khóa DB.
Mỗi phần tử trong danh sách giá trò chiếm 1 byte
14
Thí dụ:
a/ Số-học-viên DB 0,0,0 ;khai báo Số-học-viên là một giá trò kiểu byte, chiếm tất cả 3 byte, giá trò
ban đầu của cả 3 byte này là 0
b/ File-name DB ‘Thidu1.asm’,0 ;khai báo File-name là một giá trò kiểu byte, chiếm tất cả 11 byte,
giá trò ban đầu của các byte này lần lượt là mã của từng ký tự trong dấu nháy và cuối cùng là 0
c/ Buffer DB 20 dup (0) ;khai báo Buffer là một giá trò kiểu byte, chiếm tất cả 20 byte, các byte
mang giá trò được mô tả trong cặp dấu ngoặc đơn ( 0 ).
Chú ý :
- Chỉ có kiểu byte mới chấp nhận chuỗi ký tự
- Để biểu diễn một byte,ta có thể ghi giá trò của byte đó dưới dạng số thập phân, số thập lục, số
nhò phân hoặc là một ký tự (có mã tương ứng) đặt giữa hai dấu nháy đơn .
TD : 65, 041h, ‘A’ là các cách biểu diễn khác nhau của cùng một giá trò .
- Các vùng nhớ lưu chứa giá trò được khai báo được gọi là các biến của chương trình
- Kiểu được khai báo chỉ dùng làm giá trò ngầm đònh để xác đònh loại dữ liệu được thao tác
trong các lệnh . Ta hoàn toàn có thể chỉ đònh kiểu bất kỳ cho một biến trong các lệnh một
cách tường minh.
Loại word : khai báo bằng từ khóa DW
Mỗi phần tử trong danh sách giá trò chiếm 2 byte (1 word)
Loại double word : khai báo bằng từ khóa DD Mỗi phần tử trong danh sách giá trò chiếm 4 byte (2
word)
Chú ý :
Dữ liệu lưu chứa trong RAM có một số điểm khác với cách biểu diễn thông thường của chúng ta :
những số biểu diễn bằng nhiều byte như loại word, double word được ghi nhớ trong RAM theo quy tắc

byte thấp đứng trước, byte cao đứng sau.
Thí dụ : giá trò hai byte 01234h được ghi nhớ tại đòa chỉ 0462:0180 như sau :
0462:0180 034h
0462:0181 012h
Chú ý : Khi nói một giá trò được ghi nhớ tại một đòa chỉ nào đó ta phải hiểu là “được ghi nhớ bắt đầu từ
đòa chỉ đã chỉ ra” !
4.1.5Phân loại chương trình
Đối với hệ điều hành DOS, chương trình của chúng ta được chia thành hai loại chính :
- Loại COM : chỉ sử dụng 1 segment, có kích thước tối đa gần 64 KB khi được thực thi, các thanh
ghi segment đều được gán giá trò của segment hiện lưu chứa chương trình . Do đó trong một file COM,
nếu không có nhu cầu truy nhập đến các vùng nhớ ngoài segment của chương trình, không cần phải chú ý
đến việc xác đònh giá trò các thanh ghi segment. Giá trò của IP khi chương trình được thực thi luôn luôn
bằng 0100h .
- Loại EXE : sử dụng nhiều segment, không hạn chế về kích thước khi được thực thi, các thanh ghi
segment cần được gán giá trò của segment có liên quan . Giá trò của IP khi chương trình được thực thi tùy
thuộc từng chương trình cụ thể .
Trong tài liệu này, các chương trình thí dụ đều được viết dưới dạng COM .
4.2CÁC LỆNH CĂN BẢN
4.2.1Lệnh MOV
Dạng lệnh : MOV đích,nguồn
15
Kết quả : dữ liệu sẽ được đem từ “nguồn” vào “đích”
(giá trò của nguồn vẫn giữ nguyên)
Trong đó “nguồn” và “đích” có thể là :
- Thanh ghi
- Số
- Offset .
Nếu là offset thì phải chỉ ra sẽ sử dụng byte hay word bằng cách sử dụng các khai báo :
Byte PTR offset ( 8 bit )
Word PTR offset ( 16 bit )


Thí dụ :
MOV AX,BX MOV AX,word PTR [SI+3]
MOV AH,0Fh MOV word PTR [SI+BX],BX
MOV AH,byte PTR [BX] MOV byte PTR [DI+4],9

Để lấy đòa chỉ của một tên ( nhãn hoặc biến ) ta thực hiện như sau :
MOV DX,offset chuoi1 hoặc LEA DX,chuoi1
Lệnh trên sẽ đưa vào DX offset của chuoi1
Chú ý :
- Đích và nguồn phải có kích thước bằng nhau
- Bộ vi xử lý 8088 không thể thực hiện các tác vụ với cả hai đối tượng cùng được đònh vò bởi
offset . Do đó lệnh sau là không hợp lệ :
Mov byte ptr [SI],byte ptr [DI+2]
4.2.2Lệnh XCHG
Dạng lệnh : XCHG đích,nguồn
Kết quả : dữ liệu giữa “nguồn” vào “đích” sẽ được đổi chỗ cho nhau
4.2.3Các lệnh cộng,trừ
Dạng lệnh : ADD đích,nguồn ADC đích,nguồn (cộng)
SUB đích,nguồn SBB đích,nguồn (trừ)
Kết quả : giá trò của “đích” được cộng (hay trừ) với nguồn, kết quả được đặt vào “đích” .Giá trò của
“nguồn” không đổi Nếu là ADC hay SBB, kết quả được cộng thêm hay trừ bớt 1 khi bit CF = 1.


4.2.4Các lệnh nhân,chia
*Lệnh nhân : MUL giá trò 8 bit (thanh ghi/offset)
Thanh ghi AL được nhân với giá trò 8 bit,kết quả là giá trò 16 bit đặt trong AX
Thí dụ :
Mov AL,3
Mov CL,2

Mul CL

kết quả AX=6
MUL giá trò 16 bit (thanh ghi/offset)
Thanh ghi AX nhân với giá trò 16 bit, kết quả là giá trò 32 bit đặt trong DX và AX

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×