Tải bản đầy đủ (.docx) (90 trang)

Giáo trình assembly pot

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 (483.43 KB, 90 trang )

Giáo trình
Assembly
1
1
2
2
Chương 1: MỞ ĐẦU
1.1. Nhắc lại các hệ đếm
1.1.1. Các hệ đếm
Trong cuộc sống hàng ngày chúng ta thường dùng hệ cơ số 10 – hệ đếm
được hình thành từ 10 kí số từ 0 đến 9 - để biểu diễn các giá trị số. Điều này rất
tự nhiên vì từ xa xưa con người bình thường đã biết dùng 10 ngón tay của mình
để như là một công cụ tính toán sơ đẳng.
Trong thế giới máy tính thì khác, do máy tính được cấu tạo nên từ các mạch
điện tử và các mạch này chỉ có hai trạng thái có điện và không có điện. Do đó để
biễu diễn một giá trị số trong máy tính người ta sử dụng hệ đếm cơ số hai hay hệ
đếm nhị phân (Binary number system). Trong hệ đếm này chỉ tồn tại hai chữ số 0
và 1 tương ứng với hai trạng thái có điện và không có điện của các mạch điện tử.
Nếu dùng hệ cơ số hai để biểu diễn các số có giá trị lớn sẽ gặp bất tiện là số
hệ hai thu được quá dài, thí dụ:255 = 1111 1111
Để viết kết quả biễu diễn các số cho gọn lại người ta sử dụng các các hệ
đếm khác như hệ cơ số 8(bát phân) và hệ cơ số 16 (thập lục, hexa). Bảng sau đây
trình bày một số hệ đếm cơ bản:
Hệ đếm Cơ số Số kí số và kí tự Dạng kí số và kí tự
Nhị phân (Binary) 2 2 0,1
Bát phân (Octal) 8 8 0,1,2,3,4,5,6,7
Thập phân (Decimal) 10 10 0,1,2,3,4,5,6,7,8,9
Thập lục
phân(Hexadecimal)
16 16 0,1,2,3,4,5,6,7,8,9,
A,B,C,D,E,F


Bảng 1.1. Các hệ đếm cơ bản
Ngoài ra, hệ đếm BCD còn được sử dụng để biểu diễn các số từ 0 đến 9 với
4 bit (4 bit=1 nibble) nhị phân.
1.1.2. Chuyển đổi số giữa các hệ đếm
1.1.2.1. Chuyển đổi giữa hệ thập phân và hệ nhị phân
a. Chuyển từ hệ thập phân sang hệ nhị phân
Quy tắc: Lấy phần nguyên chia cho 2 và ghi lại phần dư, tiếp tục lấy
thương chia cho 2 và ghi lại phần dư. Lặp lại quá trình cho đến khi thương bằng
0. Sau đó viết các số dư theo chiều từ phép chia cuối cùng đến phép chia đầu
tiên.
Thí dụ:
3
3
33 2
1 16
2
0 8
2
0 4
2
0 2
2
0 1
2
1 0
(33)10 = (100001)2
0
0
1
0,125 x 2 =

0,250 x 2 =
0,50 x 2 =
(0,125)10 = (0,001)2
,250
,50
,0
Hình 1.1. Cách đổi một số hệ mười sang hệ hai
Quy tắc đổi số thập phân hệ mười sang hệ hai: Lấy số cần đổi nhân với 2,
tích gồm phần nguyên và phần lẻ. Lấy phần lẻ nhân tiếp với 2 cho đến khi nào
tích thu được bằng 1 thì dừng lại. Chọn riêng phần nguyên của các tích thu được
và viết theo thứ tự từ phép nhân đầu tiên đến phép nhân cuối cùng. Thí dụ:
Hình 1.2. Các đổi một số thập phân hệ mười sang hệ hai
b. Chuyển từ hệ nhị phân sang hệ thập phân:
Để chuyển từ hệ nhị phân sang thập phân ta tính tổng các tích số giữa các
hệ số với các trọng số 2
i
tại từng vị trí thứ i.
Thí dụ:
(1110,11)
2
= 1.2
3
+ 1.2
2
+ 1.2
1
+ 0.2
0
+ 1.2
-1

+ 1.2
-2
= 8 + 4 + 2 + 0,5 + 0,25 = (14,75)
10
1.1.2.2. Chuyển đổi giữa thập lục hoặc hệ bát phân sang hệ nhị phân
4
4
Quy tắc: Nhóm 4 bit (hoặc 3 bit cho hệ bát phân) bắt đầu từ bit ngoài cùng
bên phải, tính giá trị số học theo quy luật giá trị riêng cho từng nhóm. Viết các
giá trị này liên tiếp nhau.
Thí dụ:
Cho số nhị phân: 11110101chuyển sang hệ thập lục và hệ bát phân như sau:
(11 110 101)  3 6 5  trong hệ bát phân là số 365
(1111 0101)  15 5  F5  trong hệ thập lục là số F5
Khi cần chuyển ngược lại làm tương tự. Thí dụ:
(120)
8
= (001 010 000)
2
(120)
16
= (0001 0010 0000)
2
1.3. Các phép toán bit
1.3.1. Phép toán AND
Kí hiệu: &
Ý nghĩa: Nhân logic trên các bit. Phép toán này thực hiện trên từng cặp bit
tương ứng của các toán hạng theo quy tắc trong bảng sau:
A B A & B
0 0 0

0 1 0
1 0 0
1 1 1
Bảng 1.3. Bảng chân lý phép toán AND trên bit
1.1.3.Các phép toán logic
1.1.3.1. Phép toán OR
Kí hiệu: |
Ý nghĩa: Cộng logic trên các bit. Phép toán này thực hiện trên từng cặp bit
tương ứng của các toán hạng theo quy tắc trong bảng sau:
A B A | B
0 0 0
0 1 1
1 0 1
1 1 1
Bảng 1.4. Bảng chân lý phép toán OR trên bit
1.1.3.2. Phép toán XOR
Kí hiệu: ^
Ý nghĩa: Phép cộng logic trên các bit. Thực hiện trên từng cặp bit tương
ứng của các toán hạng theo quy tắc trong bảng sau.
A B A ^ B
0 0 0
5
5
0 1 1
1 0 1
1 1 0
Bảng 1.5. Bảng chân lý phép toán XOR trên bit
1.1.3.3. Phép toán NOT
Kí hiêu: ~
Ý nghĩa: phép đảo bit, đổi các giá trị trong mỗi bit của toán hạng x từ 0->1,

1->0.
1.1.3.4. Phép toán dịch trái/phải
- x SHR i: Phép dịch phải, cho giá trị có được từ số nguyên x sau khi dịch
sang phải i bit; các số 0 sẽ lấp đầy các kết quả bên trái nếu là số nguyên dương;
nếu không phải là số nguyên dương thì số 1 sẽ lấp đầy các kết quả bên trái.
Thí dụ:
5 >> 2 = 1 ( 0101 >> 2 = 0001)
- x SHL i: Phép dịch trái, cho giá trị có được từ số nguyên x sau khi dịch
sang trái i bit; các số 0 sẽ lấp đầy các kết quả ở bên phải.
5 << 2 = 20
1.2. Vi xử lý 8086, tập lệnh và các mode địa chỉ
1.2.1. Vi xử lý 8086
Vi xử lý(VXL)làm nhiệm vụ của bộ xử lý trung tâm CPU nên thường đươc
gọi là CPU và được đặt ở trung tâm bản mạch chính.VXL được chế tạo trên cơ
sở công nghệ chế tạo các mạch vi điện tử tích hợp rất lớn với các phần tử cơ bản
là các Transistor.
Các máy tính IBM tương thích với VXL của hãng Intel nên ta sẽ đi tìm hiểu
về VXL của intel. Họ VXL của Intel 80x86 với x là 1,2,3,4, đến số 5 thì đổi
thành Pentium.Ngoài ra còn có các VXL của các hãng khác.
80x86 là VXL 16 bit, tức là nó có bus dữ liệu 16 bit. Do vậy nó có khả năng
truy xuất dữ liệu 2 byte một lần. bus địa chỉ có độ rộng 20 bit. Tức là nó có khả
năng xác định địa chỉ của 2
20
ô nhớ = 1MB địa chỉ byte nhớ vật lý.
Vềmặt cấu trúc, CPU hay VXL có hai phần chức năng độc lập đó là BIU
và EU:
BIU là đơn vị ghép nối, nó thực hiện tất cả các công việc về BUS cho EU.
Nó thiết lập khâu nối với thế giới bên ngoài là các Bus địa chỉ, số liệu và điều
khiển. BIU bao gồm các thanh ghi đoạn nhớ, thanh ghi con trỏ lệnh và bộ điều
khiển logic Bus.

6
6
EU là đơn vị thi hành lệnh, EU gồm hai khối: khối tính toán số học và logic
ALU và khối điều khiển CU. EU có trách nhiệm xử lý dữ liệu, nó duy trì trạng
thái của VXL, kiểm soát các thanh ghi đa năng và toán hạng lệnh. EU gồm các
thanh ghi đa năng, thanh ghi cờ.
Khi VXL hoạt động, dữ liệu được truyền giữa VXL và thiết bị vào ra khi
có yêu cầu của EU. Chúng không được truyền trực tiếp tới EU mà phải qua một
vùng nhớ RAM có dung lượng nhỏ hơn 6 byte gọi là hàng nhập lệnh trước PQ.
Rồi sau đó mới được truyền vào đơn vị lệnh IU. Tiếp đó IU sẽ điều khiển EU để
cho lệnh được thực hiện bởi ALU.
Một chu kì lệnh của 8086 có thể coi đơn giản gồm hai thời khoảng: lấy lệnh
từ bộ nhớ và thực hiện lệnh.Khi EU đang thực hiện lệnh trước thì BIU đã tìm và
lấy lệnh tiếp theo từ bộ nhớ, giải mã nó và nạp vào PQ vào, khiến cho thời gian
lấy lệnh của 8086 có thể coi là bằng 0. Sau này chúng ta biết đến cơ chế này
trong các VXL về sau của Intel đó là cơ chế đường ống.
1.2.2. Các thanh ghi và mode địa chỉ trong 8086
Thanh ghi là một bộ nhớ dạng RAM được tích hợp ngay trong VXL. Vì tốc
độ truy cập các thanh ghi nhanh hơn RAM, nên thanh ghi được dùng để lưu trữ
các dữ liệu tạm thời cho quá trình xử lý và tính toán bên trong máy tính.
1.2.2.1. Cách định địa chỉ byte nhớ trong 8086
Bus địa chỉ của 8086 có 20 bit, định địa chỉ cho 1 MB bộ nhớ, trong khi đó
các thanh ghi trong 8086 đều có độ rộng là 16 bit, nên phải có cơ chế để đánh địa
chỉ logic và vật lý cho không gian nhớ 1MB. Cách đánh địa chỉ như sau:
Chương trình sẽ chia không gian nhớ vật lý thành các đoạn nhớ logic, với
kích thước 64Kbyte mỗi đoạn, các byte trong đoạn là liên tiếp nhau.Mỗi đoạn
nhớ được chương trình gắn cho một địa chỉ đoạn, đó là địa chỉ byte nhớ thấp
nhất trong đoạn nhớ. Hai đoạn nhớ liền kề nhau nhất thiết phải cách nhau 16
byte, do đó các đoạn có địa chỉ là bội số 16 của nhau. Như vậy chương trình có
thể chứa các đoạn tách rời, phủ lấp hoặc chồng lên nhau. Bên trong đoạn có địa

chỉ offset để chỉ khoảng cách từ địa chỉ thấp nhất trong đoạn tới ô nhớ đó.Giá trị
offset cho phép xác định chính xác địa chỉ logic của byte nhớ trong đoạn đó.
Như vậy, một byte nhớ được định địa chỉ logic bởi một cặp 2 thanh ghi 16
bit là chứa địa chỉ đoạn và địa chỉ độ lệch (segment:offset). Người lập trình chỉ
quan tâm tới địa chỉ logic nhưng khi truy xuất bộ nhớ, đơn vị ghép nối Bus BIU
7
7
trong VXL sẽ tính từ đó ra địa chỉ vật lý thật sự của byte nhớ cần truy cập theo
công thức:
Địa chỉ vật lý=địa chỉ đoạn ×16 + địa chỉ độ lệch (segment×16 + offset)
Điều này được BIU thực hiện dễ dàng bằng cách dịch trái giá trị thanh ghi
chứa địa chỉ đoạn đi 4 bit rồi cộng với giá trị offset trong thanh ghi chứa độ lệch
(vì khi một số nhị phân được dịch trái đi 4 digit, tương đương với việc nhân nó
với 2
4
= 16).
Vì mỗi thanh ghi đoạn dài 16 bit nên có thể định đến 64 k đoạn nhớ, và số
địa chỉ offset (tương ứng với kích thước mỗi đoạn) sẽ là 64 kbyte. Do đó không
gian địa chỉ logic sẽ lớn hơn và bằng 64 kbyte × 64 kbyte địa chỉ = 4 Gbyte nhớ.
1.2.2.2. Các thanh ghi trong 8086
8086 có 14 thanh ghi 16 bit.
Các thanh ghi đa năng AX, BX, CX, DX.Chúng được dùng để lưu trữ dữ
liệu tạm thời trong khi thực hiện chương trình. Ưu điểm của việc sử dụng thanh
ghi bên trong cho việc lưu trữ tạm thời dữ liệu là cho phép VXL có thể truy cập
dữ liệu nhanh hơn rất nhiều so với việc phải truy cập bộ nhớ ngoài. Các thanh
ghi này được tách thành hai phần, mỗi phần 8 bit, phần chứa 8 bit cao là AH,
BH, CH, DH và phần chứa 8 bit thấp là AL, BL, CL , DL. Mỗi phần đều có thể
được địa chỉ hóa tách biệt.
• Thanh ghi AX: Thanh ghi tích lũy (Accumulator Register) – là thanh ghi
đóng vai trò trung tâm đối với phép nhân và phép chia. Thanh ghi AH

thường được sử dụng để truy nhập qua một kênh vào/ra.
• Thanh ghi BX: Thanh ghi cơ sở (Base Register) – được dùng cho các
loại định địa chỉ đặc biệt để tính toán địa chỉ, thường được dùng để chứa
con trỏ trỏ tới bộ nhớ.
• Thanh ghi CX: Thanh ghi đếm (Count Register) – chứa số đếm trong các
lệnh lặp vòng.
• Thanh ghi DX: Thanh ghi dữ liệu (Data Register)–là thanh ghi mở rộng
của thanh ghi AX trong các lệnh nhân và chia. Thanh ghi này chứa nửa
cao của một tích 32 bit hoặc nửa cao của một số bị chia 32 bit. Trong
việc thực hiện các lệnh đọc/viết các cổng vào/ra, thanh ghi này được
dùng để chứa địa chỉ của các cổng cần đọc/viết có giá trị lớn hơn FFh.
Các thanh ghi đoạn CS, DS, SS, ES:có 4 thanh ghi đoạn dùng để lưu trữ địa
chỉ 16 bit của 4 loại đoạn nhớ logic: đoạn mã lệnh CS, đoạn dữ liệu DS, đoạn
8
8
ngăn xếp SS, đoạn phụ ES. Ngăn xếp (stack) là một vùng nhớ được đặt ra
ngoài để lưu trữ địa chỉ và dữ liệu trong khi thực hiện chương trình con.
• Thanh ghi đoạn mã lệnh CS: là thanh ghi chứa địa chỉ đoạn của vùng
chứa mã lệnh của chương trình đang thực hiện.
• Thanh ghi đoạn dữ liệu DS: là thanh ghi địa chứa địa chỉ đoạn của
vùng dữ liệu mà chương trình đang thực hiện sử dụng, vùng này
thường chứa các biến của chương trình.
• Thanh ghi đoạn ngăn xếp SS: là thanh ghi chứa địa chỉ đoạn bộ nhớ
ngăn xếp (stack) của chương trình.
• Thanh ghi đoạn phụ (mở rộng, bổ xung): là thanh ghi chứa địa chỉ
đoạn của vùng nhớ bổ xung mà chương trình đang sử dụng, vùng này
cũng thường chứa các biến của chương trình.
Các thanh ghi con trỏ và chỉ số:gồm có các thanh ghi: BP, SP, SI, DI, IP.
• SP (Stack Pointer) – thanh ghi con trỏ stack: nó luôn kết hợp với SS để
chỉ ra đỉnh tức thời của ngăn xếp. Sau mỗi thao tác cất một từ (word)

vào ngăn xếp SP sẽ tự động giảm đi 2 đơn vị, và ngược lại sau mỗi
thao tác lấy một từ ra khỏi ngăn xếp SP sẽ tự động tăng lên 2 đơn vị.
• BP (Base Stack Pointer) – thanh ghi con trỏ cơ sở: là thanh ghi con trỏ
để đánh dấu ngăn xếp, Trong nhiều thao tác với stack cần sử dụng
thêm thanh ghi này, chẳng hạn như truyền thông số thông qua stack.
• SI (Source Index) và DI (Destination Index) – thanh ghi con trỏ chỉ số
nguồn và thanh ghi con trỏ chỉ số đích: được thiết kế để chuyên sử
dụng trong các thao tác vận chuyển dữ liệu. Trong một số lệnh của
8086 các thanh ghi này luôn được kết hợp với các thanh ghi đoạn DS,
ES để trỏ tới nguồn và đích của thao tác vận chuyển dữ liệu. Đó là cắp
DS: SI và ES:DI.
Thanh ghi con trỏ lệnh IP (Intruction Pointer): Thanh ghi con trỏ lệnh
luôn chứa địa chỉ lệch của lệnh tiếp theo sẽ được thi hành trong đoạn nhớ CS.
Sau khi một lệnh được thi hành thì IP lại được bộ VXL thay đổi giá trị để trỏ tới
lệnh tiếp theo sẽ được thi hành.
Thanh ghi cờ Flag (Flags Register): đây là thanh ghi 16 bit, trong đó mỗi
bit được sử dụng để thể hiện một trạng thái của bộ VXL tại một thời điểm nhất
định trong quá trình thực hiện chương trình, trong VXL 8086 mới chỉ có 9 bit
được sử dụng, người ta gọi mỗi bit đó là một cờ, mỗi cờ thường được biểu diễn
bằng một kí hiệu gợi nhớ, mỗi cờ đều có hai trạng thái khác nhau là 0 và 1.
9
9
Người lập trình ASM hay dùng trạng thái các bit cờ làm điều kiện cho các lệnh
nhảy có điều kiện.
x x

x

x


O D

I T S Z x A x P x C
x: không được định nghĩa.
• C hoặc CT (Carry flag): cờ nhớ. CF = 1 khi số nhớ tràn khỏi bit có
trọng số lớn nhất.
• P hoặc PF (Parity flag): cờ parity. PF phản ánh tính chẵn lẻ (parity)
của tổng số bit có trong kết quả. PF = 1 khi tổng số bit 1 trong kết quả
là chẵn.
• A hoặc AF (Auxiliary carry flag): cờ nhớ phụ, rất có ý nghĩa khi ta làm
việc với các số BCD. AF = 1 khi có nhớ hoặc mượn từ một số BCD
thấp (4 bit thấp) sang một số BCD cao (4 bit cao).
• Z hoặc ZF ( Zero flag): cờ rỗng, ZF = 1 khi kết quả bằng 0.
• S hoặc SF (Sign flag): cờ dấu, SF = 1 khi kết quả âm.
• hoặc OF (Overflow flag): cờ tràn, OF = 1 khi có hiện tượng tràn số
học, đó là trường hợp số quá lớn vượt ra khỏi dung lượng nơi gửi đến.
• T hoặc TF (Trap flag): cờ bẫy, TF = 1 thì CPU làm việc ở chế độ chạy
từng lệnh( chế độ này cần dùng khi cần tìm lỗi trong một chương
trình).
• I hoặc IF (Interrupt enable flag): cờ cho phép ngắt, IF = 1 thì CPU cho
phép các yêu cầu ngắt được tác động.
• D hoặc DF (Direction flag): cờ hướng, DF = 1 khi CPU làm việc với
chuỗi kí tự theo thứ tự từ trái sang phải (hay còn gọi D là cờ lùi).
1.2.3. Các mode địa chỉ của 8086
Hay còn gọi là các chế độ địa chỉ, các phương pháp xác định địa chỉ của
các toán hạng có trong lệnh. Lưu ý rằng tập các thanh ghi của bộ xử lý được sắp
xếp cũng tạo nên một bộ nhớ tốc độ cao và cũng có một không gian địa chỉ.
Địa chỉ hiệu dụng EA ~ offset hay độ lệch của ô nhớ chứa toán hạng mong
muốn tính từ địa chỉ cơ sở đoạn. Địa chỉ vật lý của ô nhớ chứa toán hạng được
8086 xác định bằng cách cộng địa chỉ hiệu dụng với địa chỉ cơ sở đoạn nằm

trong các thanh ghi đoạn. Thanh ghi đoạn thông dụng nhất là thanh ghi DS.
8086 có các mode địa chỉ sau:
• Định địa chỉ tức thời:các đơn giản nhất để xác định một toán hạng là
phần địa chỉ của lệnh chứa chính toán hạng đó chứ không cần địa chỉ
10
10
hoặc thông tin khác mô tả toán hạng đó ở đâu. Một toán hạng như vậy
gọi là toán hạng tức thời bởi vì toán hạng được tìm và nạp tự động từ
bộ nhớ cùng lúc với lệnh và được sử dụng ngay lập tức. Định địa chỉ
tức thời có ưu điểm là không cần một truy xuất bộ nhớ nào. Tuy nhiên
nó có nhược điểm là toán hạng bị giới hạn bởi một số chỉ đặt vừa trong
trường địa chỉ.
Thí dụ: MOV CX, 437Bh
• Định địa chỉ trực tiếp:phương pháp này xác định một toán hạng bằng
cách cung cấp địa chỉ của từ nhớ chứa toán hạng cho bộ xử lý.Với chế
độ định địa chỉ bộ nhớ đơn giản nhất, địa chỉ hiệu dụng chỉ là số 16 bit
được viết tiếp trong câu lệnh.
Thí dụ:MOV BL, [437Ah], nạp nội dung ô nhớ có độ lệch tính từ địa
chỉ cơ sở đoạn là 437A vào thanh ghi BL. Khi đó VXL sẽ tính toán địa
chỉ của ô nhớ bằng cách cộng thêm địa chỉ hiệu dụng 437A vào địa chỉ
cơ sở đoạn dữ liệu.
Chế độ định địa chỉ này được gọi là trực tiếp vì độ dịch chuyển của
toán hạng được chỉ ra trực tiếp trong câu lệnh.
Thí dụ khác: MOV BX, [437Ah], copy một từ 16 bit từ ô nhớ vào
thanh ghi BX. Bởi mỗi địa chỉ trong 8086 đại diện cho 1 byte, do đó
nội dung của ô nhớ có địa chỉ lệch so với địa chỉ đoạn dữ liệu DS là
437A sẽ được copy vào thanh ghi BL, nội dung ô nhớ có địa chỉ lệch
437B sẽ được copy vào thanh ghi BH.
Ngoài ra định địa chỉ trực tiếp còn được dùng để xác định toán hạng
đích trong bộ nhớ, ví dụ: MOV [437Ah], BX sẽ copy vào ô nhớ có địa

chỉ lệch 437A nội dung thanh ghi BL, và copy nội dung thanh ghi BH
vào ô nhớ có địa chỉ lệch là 437B.
• Định địa chỉ thanh ghi:Trong chế độ này, thanh ghi sẽ là toán hạng
nguồn của câu lệnh. Thí dụ: MOV CX, AX. Trong đó, toán hạng
nguồn là toán hạng đứng sau dấu phẩy, toán hạng đích là toán hạng
đứng trước dấu phẩy, lệnh MOV CX, AX sẽ copy nội dung thanh ghi
AX vào thanh ghi CX. Ta có thể copy nội dung bất cứ thanh ghi 16 bit
nào sang thanh ghi 16 bit khác, cũng có thể copy nội dung bất cứ thanh
ghi 8 bit nào sang thanh ghi 8 bit khác, các trường hợp còn lại là không
thể.
11
11
• Định địa chỉ gián tiếp: trong chế độ này, trường địa chỉ cho biết từ
nhớ nào hoặc thanh ghi nào chứa địa chỉ của toán hạng. Trong nhóm
này có các loại như sau:
- Định vị gián tiếp thanh ghi: lúc này địa chỉ hiệu dụng nằm ở một
trong các thanh ghi BX, BP, SI hoặc DI.
Thí dụ: MOV AX, [SI] ; chuyển nội dung của ô nhớ trong đoạn hiện
tại có offset là nội dung của thanh ghi SI và thanh ghi AX.
- Định vị cơ sở: EA là tổng của độ dịch chuyển và nội dung của thanh
ghi BX hoặc BP.
-Thí dụ: MOV [BX] + displacement, AL; chuyển nội dung của thanh
ghi AL vào ô nhớ có địa chỉ offset bằng tổng nội dung của BX với độ
dịch chuyển.
• Định vị chỉ số(indexed addressing): EA là tổng của độ dịch chuyển
và nội dung của thanh ghi SL hoặc DI.
Lý do có chế độ này như sau. Nhiều thuật toàn cần thực hiện một thao
tác nào đó trên một chuỗi cấu trúc dữ liệu lưu giữ trong những vị trí
nhớ liên tiếp. Thí dụ xét một khối gồm n từ lệnh máy chiếm các vị trí
A, A + 1, A + 2, …, A + n-1. Các từ này cần được di chuyển đến các

vị trí B, B + 1, B + 2, … ,B + n-1. Trong trường hợp này có thể thực
hiện lệnh MOV A, B rồi thay đổi chính lệnh đó thành MOVE A + 1, B
+ 1 và lặp lại cho tới khi cả n từ được sao chép hết. Bằng cách định địa
chỉ gián tiếp có thể thực hiện được điều này. Một thanh ghi hoặc từ
nhớ được nạp địa chỉ A, một thanh ghi hoặc từ nhớ khác được nạp địa
chỉ B. Lệnh MOV dùng 2 thanh ghi này làm các con trỏ và sau mỗi lần
sao chép một từ con trỏ được tăng lên 1. Các con trỏ là một phần của
dữ liệu chứ không phải là phần của chương trình và những người sử
dụng không được dùng chung đồng thời. Một giải pháp khác là có một
số thanh ghi gọi là thanh ghi chỉ số hoạt động như sau. Địa chỉ có 2
phần: số của một thanh ghi chỉ số và một hằng số. Địa chỉ của toán
hạng là tổng của hằng số với nội dung của thanh ghi chỉ số. Trong thí
dụ này, nếu cả hai địa chỉ được định chỉ số bằng cách dùng một thanh
ghi chỉ số chứa số nguyên k, lệnh MOV A, B sẽ chuyển nội dung vụ trí
nhớ A + k tới B + k. Bằng cách khởi động thanh ghi chỉ số là 0 và tăng
nội dung thanh ghi này lên một lượng bằng kích thích của từ sau khi
sao chép một từ, chỉ cần một thanh ghi cho vòng lặp sao chép. Hơn
nữa việc tăng thanh ghi sẽ nhanh hơn việc tăng một vị trí nhớ. Việc
12
12
đánh chỉ số được sử dụng rộng rãi để định địa chỉ một trường tại một
khoảng cách đã biết tính từ điểm đầu của một cấu trúc dữ liệu đã cho.
Các biến cục bộ trong một thủ tục được truy cập theo cách này.
Việc tăng hoặc giảm giá trị thanh ghi chỉ số trước hoặc sau khi nó
được sử dụng là việc làm thường xuyên xảy ra. Vì vậy người ta thường
đưa các lệnh định địa chỉ đặc biệt hoặc thậm chí có những thanh ghi
chỉ số đặc biệt mà tự chúng có thể tăng hoặc giảm giá trị. Việc sửa đổi
tự động một thanh ghi chỉ số được gọi là đánh chỉ số tự động
(autoindexing).
Thí dụ lệnh: MOV AL, [SI] + displacement; chuyển nội dung ô

nhớ có địa chỉ offset bằng tổng của nội dung SI với độ dịch chuyển
vào thanh ghi AL.
MOV AH,[BX] [SI] + displacement; chuyển
nội dung của ô nhớ có địa chỉ offset bằng tổng của độ dịch chuyển với
nội dung của BX và SI vào thanh ghi AH.
Đây là kiểu định địa chỉ chỉ số và cơ sở, EA là tổng của nội dung
thanh ghi cơ sở, thanh ghi chỉ số và độ dịch chuyển.
• Định địa chỉ ngăn xếp (stack addressing): Ngăn xếp gồm các phần tử
dữ liệu (từ, kí tự, bit v.v…) được lưu trữ theo một trật tự liên tiếp trong
bộ nhớ. Phần tử đầu tiên được cất vào ngăn xếp sẽ ở đáy ngăn xếp.
Phần tử mới nhất được cất vào sẽ ở đỉnh ngăn xếp. Kết hợp với mỗi
ngăn xếp là một thanh ghi hoặc từ nhớ chứa địa chỉ của đỉnh ngăn xếp
được gọi là con trỏ ngăn xếp (stack pointer).
Máy tính có lệnh PUSH cất các nội dung của ô nhớ hoặc thanh ghi vào
ngăn xếp. Lệnh này phải thực hiện việc sao chép phần tử đó và tăng
con trỏ ngăn xếp. Ngược lại, lệnh POP lấy nội dung đỉnh ngăn xếp đưa
trở lại thanh ghi hoặc ô nhớ phải thực hiện sao chép mới vào nơi thích
hợp và giảm con trỏ ngăn xếp.
Thí dụ lệnh: PUSH AX ;cất nội dung của thanh ghi AX vào ngăn
xếp
POP AX ;hồi phục giá trị thanh ghi AX từ nội dung đỉnh
ngăn xếp.
Một số lệnh không địa chỉ cũng có thể được sử dụng cùng với ngăn
xếp. Định dạng lệnh này chỉ ra rằng 2 toán hạng được lấy ra khỏi ngăn
xếp, toán hạng này tiếp sau toán hạng kia, phép toán được thực hiện
(thí dụ nhân hoặc AND) và kết quả được cất trở lại ngăn xếp.
13
13
1.3. Ngắt
Ngắt (interrupt) là khả năng dừng chương trình chính đang chạy để thực

hiện một chương trình khác rồi sau đó lại quay về thực hiện tiếp chương trình
chính.
Một trong những tình huống xảy ra ngắt như sau: trong khi vi xử lý đang
thực hiện chuỗi lệnh của chương trình chính nếu một thiết bị ngoại vi nào đó cần
trao đổi thông tin vơi vi xử lý, nó sẽ gửi một tín hiệu yêu cầu gọi là yêu cầu ngắt
(thí dụ INTR) tới vi xử lý. Vi xử lý sẽ thực hiện nốt lệnh hiện tại và trả lời bằng
tín hiệu chấp nhận ngắt (thí dụ INTA). Chương trình chính lúc này sẽ bị dừng lại
(ngắt) và vi xử lý cất giữ nội dung của các thanh ghi đang dùng bằng lệnh PUSH
vào một vùng nhớ đặc biệt (gọi là ngăn xếp) rồi chuyển sang chương trình con
phục vụ ngắt tức là chương trình trao đổi thông tin mà đơn vị yêu cầu.
Sau khi xong việc, nhờ lệnh RET và các lệnh POP hồi phục ngăn xếp, vi
xử lý sẽ quay về đúng chỗ bị ngắt và tiếp tục thực hiện chương trình chính như
hình 2.10 chỉ ra.
Các ngắt không chỉ có ý nghĩa quan trọng đối với phần mềm mà cả với
phần cứng. Các ngắt trong họ vi xử lý 80x86 có thể được phát ra từ một trong ba
nguồn sau:
Ngắt cứng: do tín hiệu được sinh ra bởi các chip điện tử hoặc thiết bị ngoại
vi bên ngoài vi xử lí gây nên. Đó là một cơ cấu đơn giản và hiệu quả cho phép vi
xử lý phản ứng một cách kịp thời với các yêu cầu ngắt. Thí dụ, ấn hay nhả bàn
phím sẽ gây nên ngắt cứng số 9 (ngắt bàn phím), chương trình xử lí ngắt sẽ phản
ứng bằng cách đưa kí tự được ấn vào vùng đệm của bàn phím, vào vị trí ngay sau
kí tự được ấn lần trước.
Ngắt có thể bị che (maskable) do tín hiệu yêu cầu ngắt được đưa tới chân
INTR của vi xử lý. Ngắt này sẽ bị vô hiệu hóa (bị che) bằng lệnh hợp ngữ CLI
(xóa cờ ngắt). Nếu bị che thì mặc dù được gọi, chương trình xử lí ngắt tương ứng
cũng không được thực hiện. Lệnh STI (đặt cờ ngắt) cho phép các ngắt bị che trở
lại hoạt động.
Ngắt không thể bị che (non-maskable) do tín hiệu yêu cầu ngắt được đưa tới
chân NMI của vi xử lý. Ngắt luôn được thực hiện kể cả khi được gọi ngay sau
lệnh CLI. Ngắt này liên quan tới các hỏng hóc phần cứng nghiêm trọng (thí dụ,

hỏng RAM).
Ngắt mềm: với nguồn gây ngắt là các câu lệnh gọi ngắt INT được sử dụng
cùng số thứ tự ngắt. Thí dụ, lệnh gọi ngắt số 5 (in trang màn hình) được viết là
INT 5. Các ngắt mềm cho phép gọi các chương trình phụ của hệ điều hành. Ngắt
14
14
mềm còn có thể được gọi từ ngôn ngữ bậc cao, lúc đó nó sẽ được dịch ra thành
lệnh hợp ngữ INT.
Ngoại lệ: là nguồn ngắt thứ 3 do các lỗi phát sinh trong quá trình thực hiện
câu lệnh (thí dụ, ngắt chia cho một số cho 0), vi xử lý sẽ tự động ngắt chương
trình đang chạy bằng ngắt số 0.
Vào cuối mỗi chu trình lệnh, 8086 sẽ kiểm tra xem có ngắt nào được yêu
cầu không. Nếu có yêu cầu ngắt, 8086 sẽ phản ứng theo các bước sau:
Giảm con trỏ ngăn xếp đi 2 và cất thanh ghi cờ vào ngăn xếp.
Không cho phép ngắt cứng từ chân INTR bằng cách xóa cờ ngắt IF trong
thanh ghi cờ.
Xóa cờ bước TF trong thanh ghi cờ.
Giảm con trỏ ngăn xếp đi 2 và cất nội dung thanh ghi đoạn mã vào ngăn
xếp.
Giảm con trỏ ngăn xếp đi 2 một lần nữa và cất nội dung thanh ghi con trỏ
lệnh hiện thời vào ngăn xếp.
Thực hiện một lệnh nhảy gián tiếp far jump tới phần đầu của chương trình
con phục vụ ngắt do người dùng viết.
Vi xử lý 8086 có thể phục vụ được tới 256 ngắt khác ngau, được đánh số từ
0 đến 255. Mỗi ngắt ứng với một chương trình con phục vụ ngắt và sẽ được thực
hiện khi được gọi lại. Địa chỉ lôgic ô nhớ bắt đầu của mỗi chương trình này gọi
là một véctơ ngắt dài 4 byte gồm địa chỉ đoạn và địa chỉ offset 16 bit, địa chỉ
offset được đặt trước địa chỉ đoạn. 256 địa chỉ này được lưu trữ lần lượt trong
vùng nhớ thấp nhất của bộ nhớ gọi là bảng các vectơ ngắt có độ dài là 4 x 256 =
1024 byte từ địa chỉ 0000: 0000 đến 0000: 03FF. Như vậy, địa chỉ của chương

trình xử lí ngắt số 0 nằm ở 4 ô nhớ từ 0000: 0000 đến 0000: 0003, địa chỉ của
chương trình ngắt số 1 từ 0000: 0004 đến 0000: 0007 v.v… Dó đó để xác định ô nhớ
chứa địa chỉ bắt đầu của chương trình con phục vụ ngắt ta chỉ việc nhân số ngắt với 4.
1.4. Giới thiệu về hợp ngữ
1.4.1. Lập trình bằng hợp ngữ
Việc lập trình bằng ngôn ngữ máy đòi hỏi ta phải nhớ các mã lệnh bằng số
(dưới dạng nhị phân), còn được gọi là mã máy, phải sắp đặt vị trí của mã lệnh và
các số liệu trong bộ nhớ của máy tính, ngay cả số liệu cũng phải viết dưới dạng
số. Công việc này rất nặng nhọc, tốn công, dễ nhầm lẫn và khó chỉnh sửa.
15
15
Tuy nhiên việc viết chương trình bằng ngôn ngữ máy cũng có những ưu
điểm của nó như phát huy tối đa được khả năng của tập lệnh của bộ vi xử lý,
cũng như sử dụng có hiệu quả nhất bộ nhớ của máy tính, tốc độ thực hiện
chương trình là nhanh nhất và chương trình có kích thước nhỏ nhất.
Để tránh các khó khăn của việc viết chương trình bằng ngô ngữ máy nhưng
vẫn đạt được ưu điểm của việc lập trình bằng ngôn ngữ máy người ta sử dụng
hợp ngữ. Hợp ngữ là một ngôn ngữ lập trình gợi nhớ, nó có các ưu nhược điểm
như sau:
• Ưu điểm :
Vì ngôn ngữ Assembler rất gần gũi với ngôn ngữ máy nên chương trình
+ Chạy nhanh.
+ Tiết kiệm bộ nhớ.
+ Có thể lập trình truy cập qua các giao diện vào ra nhưng hiện nay các
ngôn ngữ bậc cao cũng có thể làm được.
• Nhược điểm
+ Khó viết bởi vì yêu cầu người lập trình rất am hiểu về phần cứng.
+ Khó tìm sai: bao gồm sai về cú pháp (syntax) và sai về thuật toán (Algorithm).
Chương trình dịch sẽ thông báo sai ta sẽ dùng debug của DOS để kiểm tra.
+ Không chuyển chương trình Assembler cho các máy tính có cấu trúc khác

nhau.
• Ứng dụng
+ Viết lõi của hệ điều hành.
+ Các chương trình trò chơi ( ngày trước).
+ Tạo virus.
+ Các chương trình đo và điều khiển sử dụng trong công nghiệp, ngày nay
các vi điều khiển được sử dụng một cách rộng rãi.
1.4.2. Hệ lệnh Assembler
a) Hệ lệnh assembler gồm có:
• Tập lệnh MNEMONIC sinh mã máy để chạy chương trình.
• Các DIRECTIVE điều khiển khi dịch chương trình.
b) Cú pháp của một dòng lệnh ASM
• Mỗi một dòng chỉ được viết một lệnh.
• [Label] [Directive/Mnemonic] [Operands] [;Commnet]
[Nhãn] [Loại lệnh] [Toán hạng][Ghi chú]
Từ ; cho đến hết dòng là ghi chú và nó có hiệu lực chỉ trên 1 dòng.
16
16
ví dụ:
L1:
mov ax,bx
c) Tập lệnh Mnemonic
- Tập lệnh Mnemonic là gì? Đó là lệnh của ASM được thể hiện bằng viết tắt
của tiếng Anh cho dễ hiểu.
Ví dụ:
Tiếng Anh Lệnh dạng Mnemonic
Move mov
Addition add
Multiplication mul
Các quy ước về toán hạng:

• SRC: Toán hạng nguồn.
• DST: Toán hạng đích.
• REG(reg8/reg16): Toán hạng là thanh ghi
• Data: Toán hạng là hằng số.
• Mem: Toán hạng là biến nhớ.
• Segreg: Toán hạng là thanh ghi segment.
Tập lệnh MNEMONIC gồm có 6 nhóm:
• Nhóm 1: Các lệnh di chuyển dữ liệu
• Nhóm 2: Các lệnh số học.
• Nhóm 3: Các lệnh thao tác bit
• Nhóm 4: Các lệnh thao tác xâu ký tự.
• Nhóm 5: Các lệnh rẽ nhánh
• Nhóm 6: Các hệ thống cờ
1.4.2. Các bước viết chương trình hợp ngữ
Hiện nay có hai chương trình dịch rất phổ biến là MASM (của hãng
Microsoft) và TASM (của hãng Borland) về cơ bản là hai chương dịch này rất
giống nhau nhưng khác nhau ở chỗ: khi viết lệnh push
Nếu viết :
push ax
push bx
push cx
thì cả hai chương trình đều biên dịch được. ( cách viết này theo MASM).
Còn trong TASM thì cho phép viết
push ax bx cx
1.4.2.1. Cài đặt chương trình dịch TASM:
• Cách 1:
17
17
Mua đĩa bản quyền nếu là đĩa mềm thì có 5 đĩa hoặc là 1 đĩa CD. Hoặc
download phần mềm TASM hoặc MASM về.

Run cmd
A:\ install
• Cách 2:
+ Tạo thư mục: C:\TASM
+ Copy 4 tệp lõi từ máy khác đã cài đặt theo cách 1 về thư mục đã tạo
trước.
1.4.2.2. Các bước thực hiện một chương trình Assember trên máy PC :
(soạn thảo chương trình, dịch chương trình, liên kết, chạy thử và
cách tìm sai bằng DEBUG của DOS và TD (Turbo Debug) của Borland)
Bao gồm 4 bước:
+ Bước 1: Dùng chương trình soạn thảo bất kì (Edit, NC, TC, ….) để soạn
thảo chương trình. Sau khi soạn thảo xong phải cất tệp có đuôi là .ASM.
+ Bước 2: Dịch chương trình gốc có đuôi .ASM thành tệp có đuôi là .OBJ
Cú pháp: C:\BT> tasm ten tep[.ASM]
ten tep.OBJ
Chú ý: khi chương trình dịch có lỗi thì không sinh ra tệp có đuôi là .OBJ
Cách khai báo sai
** Error**ten tep.asm[10] Illegal Instruction
dòng thứ bao nhiêu lỗi gì
+ Bước 3: Liên kết để chuyển tên tệp có đuôi .OBJ sang tệp .EXE hay
.COM
Cú pháp: C:\BT> tlink ten tep[.OBJ]
ten tep.EXE hay ten tep.COM
18
18
+ Bước 4: Chạy thử chương trình
Khi chạy nếu có lỗi thì dùng debug để kiểm tra.
Ví dụ:
.model small
.stack

.data
message db "Hello$"
.code
main proc
mov ax,seg message
mov ds,ax
mov ah,09
lea dx,message
int 21h
mov ax,4ch
int 21h
main endp
end main
1.4.3. Cấu trúc một chương trình hợp ngữ dạng segment đơn giản
Cấu trúc của một chương trình hợp ngữ có liên quan chặt chẽ với cấu trúc
phần cứng của bộ vi xử lý. Người ta đã tạo dựng bốn đoạn (segment) được dự
tính cho bộ vi xử lý trong quá trình lập trình: đoạn mã lệnh, đoạn dữ liệu, đoạn
ngăn xếp và đoạn mở rộng. Trong đó, ít nhấtmột chương trình hợp ngữ phải có
một đoạn mã lệnh.
Do chương trình hợp ngữ có cấu trúc như vậy mà ta có khái niệm vềchương
trình hợp ngữ dạng segment. Một chương trình segment dạng chuẩn phải định
nghĩa đầy đủ bốn đoạn, mỗi đoạn được bắt đầu bằng chỉ dẫn hướng (directive)
segment và kết thúc bằng chỉ dẫn hướng ENDS, mỗi đoạn đều được người lập
trình cho trước một tên độc lập với kiểu của nó.
Ở cuối mỗi chương trình hợp ngữ có chỉ dẫn hướng END để hướng dẫn cho
bộ dịch hợp ngữ biết rằng chương trình đã kết thúc.
Tuy nhiên, việc viết một chương trình hợp ngữ dạng segment chuẩn quá
phức tạp, nên chúng ta thường dùng dạng giản lược của nó hay chương trình hợp
ngữ dạng segment đơn giản.
1.4.3.1. Dạng thường thấy 1 chương trình ASM đơn giản

(Khai báo theo directive điều khiển segment dạng đơn giản)
19
19
.MODEL
.STACK
.DATA
Khai báo biến
.CODE
Nhãn chương trình:
Thân chương trình
END Nhãn chương trình
Một chương trình asm được biên dịch thành công sẽ trở thành một file chạy
có phần mở rộng là .com hoặc .exe. Sự khác nhau của chương trình dạng .com và
chương trình dạng .exe là:
• Chương trình dạng .com có tất cả các phần mã lệnh, dữ liệu và ngăn
xếp đều cùng nằm trong một segment
• Chương trình dạng .exe có phần mã lệnh, dữ liệu và ngăn xếp nằm trên
các segment khác nhau.
a) Cấu trúc chương trình dạng .Com
Cấu trúc:
.MODEL SMALL
.CODE org 0100h
Nhãn chương trình:
[JMP nhãn khác
khai báo biến
nhãn khác:]
Thân chương trình
int 20h
[các chương trình con]
END Nhãn chương trình

Ví dụ: Viết chương trình hiện một xâu lên màn hình:
.model small
.code
org 100h
begin:
jmp var
str db "hello world!$"
var:
20
20
lea dx,str
mov ah,9
int 21h
mov ah,1
int 21h
mov ah,4ch
int 21h
end begin
a) Cấu trúc chương trình dạng .exe
Cấu trúc:
.MODEL SMALL
.STACK 100h
.DATA
Khai báo biến
.CODE
Nhãn chương trình:
mov ax,@data
mov ds,ax
Thân chương trình
mov ah,4ch

int 21h
END Nhãn chương trình
Ví dụ: Chương trình hiện một xâu lên màn hình
.model small
.stack 100h
.data
str db "hello world!$"
.code
begin:
mov ax,@data
mov ds,ax
lea dx,str
mov ah,9
int 21h
21
21
mov ah,1
int 21h
mov ah,4ch
int 21h
end begin
1.4.3.2. Các Directve (.MODEL, .STACK, .DATA, .CODE, )
a) Directive .MODEL
Chức năng: Cho phép người lập trình xác lập vùng nhớ RAM thích hợp cho
chương trình.
Cú pháp
. Model Kiểu
Tiny Code + data ≤ 64k
Small Code ≤ 64k; data ≤ 64k
Compact Code ≤ 64k; data ≥ 64k

Medium Code ≥ 64k; data ≤ 64k
Large Code ≥ 64k; data ≥ 64k
1 array ≤ 64k
Huge Code ≥ 64k; data ≥ 64k
1 array ≥ 64k
b) Directive .STACK
Chức năng: Báo cho chương trình dịch của ASM biết xác lập một vùng nhớ
RAM cho Stack. Với lệnh điều khiển này thì DOS sẽ xác lập địa chỉ đầu của
ngăn xếp và giá trị đó được đưa vào thanh ghi segment SS.
Cú pháp: . stack độ dài (tính theo byte)
Ví dụ: . stack 100h
Nếu không có khai báo . stack thì lấy độ dài mặc định default.
c) Directive . DATA
Chức năng: Báo cho chương trình dịch của ASM biết để xác lập một vùng
nhớ RAM cho dữ liệu chương trình.
Cú pháp:
.DATA
Khai báo biến
Biến trong ASM có ba loại: biến số, biến xâu kí tự và biến trường số
22
22
• Khai báo biến số
. DATA
Tên_biến Kiểu Giá_trị_ban_đầu/?
Các kiểu dữ liệu:
db ( 1 byte)
dw (2 byte)
dd ( 4 byte)
dp ( 6 byte)
dq ( 8 byte)

dt ( 10 byte)
trong đó 2 biến db và dw hay dùng.
Ví dụ:
.DATA Value dw ?
Value db 10
• Khai báo biến xâu kí tự
. DATA
Tên_biến db Các_kí_tự_cách_nhau_bởi_dấu_phẩy độ_lớn dup (1 kí
tự/ ?)
Ví dụ:
.DATA
xau1 db ‘H’,’e’,’l’,’l’,’l,’o’
xau2 db 100h dup(‘A’)
xau2 db 100 dup(?)
• Khai báo biến trường số
.DATA
Tên_trường_số kiểu_của_thành_phần (Các số cách nhau bởi dấu ',') Độ_lớn
dup( 1 số/?)
Ví dụ:
.DATA
array1 db 100,2,21,31
array2 dw 100h dup(-100)
Chú ý: Nếu chương trình có khai báo biến (tức là có .DATA) thì người lập
trình ASM phải đưa phần địa chỉ segment của vùng nhớ dữ liệu vào trong DS
nhờ 2 lệnh sau:
mov reg16, @data
mov ds,reg16
23
23
Ví dụ:

mov ax, @data
mov ds,ax
d) Directive .CODE
Chức năng: Báo cho chương trình dịch ASM biết để xác lập 1 vùng nhớ
RAM cho phần tử mã máy của chương trình.
Cú pháp: .CODE
1.4.4. Cấu trúc của một chương trình segment dạng chuẩn
Ta có thể hình dung dạng thường thấy của một chương trình segment như
sau:
Segment_Name SEGMENT



Segment_Name ENDS
END
1.4.4.1. Chương trình segment đơn giản dạng chuẩn
Stack segment
db 100h dup (?)
Stack ends
Data segment
Khai báo biến
Data ends
Code segment
Assume cs:code, ds:data, ss:stack
Nhan CT:
mov ax, data
mov ds,ax
mov ah, 4ch
int 21h
code ends

END Nhan CT
1.4.4.2. Các directive điều khiển segment: dạng chuẩn
(SEGMENT, GROUP và ASSUME)
a) Directive SEGMENT
24
24
Chức năng: báo cho chương trình dịch ASM xác lập các segment cho
chương trình.
Cú pháp:
Khuân mẫu đầy đủ của chỉ dẫn hướng SEGMENT là:
Segment_Name SEGMENT Align Combine Use Class
PARA(16 byte)
BYTE (1 byte)
WORD(2 byte)
DWORD(4 byte)
PAGE(128 byte)
PUBLIC
COMMON
STACK
AT
USER16
USER32
Class
-Segment_Name: bất kỳ một định danh nào. Tên segment chỉ được phép
bao gồm một từ, nếu gồm nhiều từ thì phải có dấu gạch dưới để nối các từ với
nhau. Các phần tử đứng sau SEGMENT đều là tùy chọn.
- Align
Cú pháp:
Align
PARA (16 byte)

BYTE (1 byte)
WORD (2 byte)
DWORD (4 byte)
PAGE (128 byte)
Chức năng: xác lập khoảng trống giữa segment đang khai báo với segment
trước nó. Nếu là BYTE thì khoảng trống giữa hai segment là 1 byte, PARA là 16
byte
hình:
Xác lập khoảng trống giữa hai segment là 1 byte (BYTE)
Nếu như Align không được định nghĩa thì chỉ thị mặc định PARA sẽ được
sử dụng.
25
25

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

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