trong VXL sẽ tính từ đó ra địa chỉ vật lý thật sự của byte nhớ cần truy cập theocô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ệ
Trang 1Giáo trình
Assembly
Trang 3Chươ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 đâytrì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ự
Thập phân (Decimal) 10 10 0,1,2,3,4,5,6,7,8,9Thập lục
phân(Hexadecimal)
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 đầutiên
Thí dụ:
Trang 40,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àotí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
Trang 5Quy 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ácgiá trị này liên tiếp nhau
Ý 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:
Ý 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:
Ý 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
Trang 6- 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ì đổithà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ăngtruy 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 220 ô 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ềukhiển BIU bao gồm các thanh ghi đoạn nhớ, thanh ghi con trỏ lệnh và bộ điềukhiển logic Bus
Trang 7EU là đơn vị thi hành lệnh, EU gồm hai khối: khối tính toán số học và logicALU và khối điều khiển CU EU có trách nhiệm xử lý dữ liệu, nó duy trì trạngthá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ácthanh 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ộtvù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 gianlấ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àytrong 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 địachỉ 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ớikích thước 64Kbyte mỗi đoạn, các byte trong đoạn là liên tiếp nhau.Mỗi đoạnnhớ được chương trình gắn cho một địa chỉ đoạn, đó là địa chỉ byte nhớ thấpnhất trong đoạn nhớ Hai đoạn nhớ liền kề nhau nhất thiết phải cách nhau 16byte, 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ó địachỉ 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 16bit 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
Trang 8trong VXL sẽ tính từ đó ra địa chỉ vật lý thật sự của byte nhớ cần truy cập theocô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 ghichứ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 24 = 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ônggian đị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 thanhghi 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 thanhghi 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 AHthườ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ácloại định địa chỉ đặc biệt để tính toán địa chỉ, thường được dùng để chứacon trỏ trỏ tới bộ nhớ
• Thanh ghi CX: Thanh ghi đếm (Count Register) – chứa số đếm trong cáclệnh lặp vòng
• Thanh ghi DX: Thanh ghi dữ liệu (Data Register)–là thanh ghi mở rộngcủa thanh ghi AX trong các lệnh nhân và chia Thanh ghi này chứa nửacao của một tích 32 bit hoặc nửa cao của một số bị chia 32 bit Trongviệc thực hiện các lệnh đọc/viết các cổng vào/ra, thanh ghi này đượcdù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
Trang 9ngăn xếp SS, đoạn phụ ES Ngăn xếp (stack) là một vùng nhớ được đặt rangoà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ùngchứ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ủavùng dữ liệu mà chương trình đang thực hiện sử dụng, vùng nàythườ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àycũ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ỗithao 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ụngthê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ắpDS: 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ớilệ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ễnbằ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
Trang 10Ngườ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ệnhnhả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àmviệc với các số BCD AF = 1 khi có nhớ hoặc mượn từ một số BCDthấ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ạytừng lệnh( chế độ này cần dùng khi cần tìm lỗi trong một chươngtrình)
• I hoặc IF (Interrupt enable flag): cờ cho phép ngắt, IF = 1 thì CPU chophé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ớichuỗ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ủacá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ắpxế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 mongmuố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ằmtrong 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ỉ
Trang 11hoặc thông tin khác mô tả toán hạng đó ở đâu Một toán hạng như vậygọ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 trongtrườ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ừ địachỉ cơ sở đoạn là 437A vào thanh ghi BL Khi đó VXL sẽ tính toán địachỉ 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ủatoá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àothanh 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ệch437B 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ó địachỉ lệch 437A nội dung thanh ghi BL, và copy nội dung thanh ghi BHvà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ạngnguồ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 bitnào sang thanh ghi 16 bit khác, cũng có thể copy nội dung bất cứ thanhghi 8 bit nào sang thanh ghi 8 bit khác, các trường hợp còn lại là khôngthể
Trang 12• Đị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ómnà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ộttrong 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ệntạ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 thanhghi BX hoặc BP
-Thí dụ: MOV [BX] + displacement, AL; chuyển nội dung của thanhghi 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 thaotá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ựchiệ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 địachỉ 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 địachỉ B Lệnh MOV dùng 2 thanh ghi này làm các con trỏ và sau mỗi lầnsao 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ánhạ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 thanhghi 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ăngnội dung thanh ghi này lên một lượng bằng kích thích của từ sau khisao chép một từ, chỉ cần một thanh ghi cho vòng lặp sao chép Hơnnữa việc tăng thanh ghi sẽ nhanh hơn việc tăng một vị trí nhớ Việc
Trang 13đánh chỉ số được sử dụng rộng rãi để định địa chỉ một trường tại mộtkhoả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 ghichỉ 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ểnvào thanh ghi AL
MOV AH,[BX] [SI] + displacement; chuyểnnội dung của ô nhớ có địa chỉ offset bằng tổng của độ dịch chuyển vớinộ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ỗingă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àongăn xếp Lệnh này phải thực hiện việc sao chép phần tử đó và tăngcon trỏ ngăn xếp Ngược lại, lệnh POP lấy nội dung đỉnh ngăn xếp đưatrở lại thanh ghi hoặc ô nhớ phải thực hiện sao chép mới vào nơi thíchhợ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ănxếp
POP AX ;hồi phục giá trị thanh ghi AX từ nội dung đỉnhngă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ănxếp Định dạng lệnh này chỉ ra rằng 2 toán hạng được lấy ra khỏi ngănxế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
Trang 141.3 Ngắt
Ngắt (interrupt) là khả năng dừng chương trình chính đang chạy để thựchiệ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ìnhchính
Một trong những tình huống xảy ra ngắt như sau: trong khi vi xử lý đangthự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ớiphần cứng Các ngắt trong họ vi xử lý 80x86 có thể được phát ra từ một trong banguồ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ànphí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 ứngcũ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 saulệ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
Trang 15mềm còn có thể được gọi từ ngôn ngữ bậc cao, lúc đó nó sẽ được dịch ra thànhlệ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ươngtrì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êucầ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 trongthanh 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ănxế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ìnhcon 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ựchiệ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ươngtrình xử lí ngắt số 0 nằm ở 4 ô nhớ từ 0000: 0000 đến 0000: 0003, địa chỉ củachươ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
Trang 16Tuy 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ệnchươ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ưngvẫ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ụnghợ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ểmnhư sau:
+ 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ácnhau
• Ứ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ậ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
Trang 17• Mem: Toán hạng là biến nhớ
• Segreg: Toán hạng là thanh ghi segment
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ãngMicrosoft) và TASM (của hãng Borland) về cơ bản là hai chương dịch này rấtgiống nhau nhưng khác nhau ở chỗ: khi viết lệnh push
Trang 18Mua đĩa bản quyền nếu là đĩa mềm thì có 5 đĩa hoặc là 1 đĩa CD Hoặcdownload 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ạotrướ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
Trang 19+ 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
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úcphầ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ạnngă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)
Trang 20Mộ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ănxế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êncác segment khác nhau
a) Cấu trúc chương trình dạng Com
Trang 221 array ≤ 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ủangă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ố
Trang 23• Khai báo biến số
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 DSnhờ 2 lệnh sau:
mov reg16, @data
mov ds,reg16
Trang 24Ví 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:
1.4.4.2 Các directive điều khiển segment: dạng chuẩn
(SEGMENT, GROUP và ASSUME)
a) Directive SEGMENT
Trang 25Chứ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à:
PARA(16 byte)BYTE (1 byte)WORD(2 byte)DWORD(4 byte)PAGE(128 byte)
PUBLICCOMMONSTACKAT
USER16USER32
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ớinhau Các phần tử đứng sau SEGMENT đều là tùy chọn
- Align
Cú pháp:
AlignPARA (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à 16byte
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
Trang 26Tên segment ENDS
Chức năng 2: phục vụ chương trình đa tệp thuần tuý ASM, cách gộp cácsegment có cùng tên nằm ở các tệp khác nhau khi liên kết
Cú pháp:
COMMON
PUBLIC
PRIVATE (Default)
- USE : chỉ có từ thế hệ 80386 và chỉ được dùng với chỉ dẫn hướng 386.
use16 ASM 16 bit (default): Độ dài đoạn cực đại là 64Kbyte
use32 ASM 32 bit : Độ dài đoạn cực đại là 4Gbyte
- ‘CLASS’
Chức năng: cho phép gộp các segment có cùng lớp lại gần nhau khi liên kết.Tên lớp phải được đặt trong dấu nháy đơn '', có thể dùng một tên bất kỳ Tất cảcác segment có cùng tên nhưng có tên lớp khác nhau sẽ được nạp kế tiếp nhauvào trong bộ nhớ Thông thường thì ta chỉ cần có một tên lớp khi ta muốn kết nốicác chương trình hợp ngữ với các chương trình ngôn ngữ bậc cao
Cách khai báo 3 segment của chương trình:
Trang 27Dạng chuẩn Dạng đơn giản
Chú ý: mov ax, data
mov ds, ax
Chú ý: mov ax,@data mov ds, ax
ENDS Nhan CT
b) Drective GROUP
Chức năng:gộp các segment cùng loại cho dễ dàng qui chiếu.
Cú pháp:
tên nhóm GROUP tên các segment
Khai báo các segment
Ta làm group như sau:
Nhom_DL GROUP data1,data2
Data1 segment
Trang 28Chú ý: assume thường là dòng đầu của code segment
Ví dụ: Hiện xâu kí tự "hello world !$"
Trang 30Chương 2 Lập trình với Debug 2.1 Tổng quan về Debug
2.1.1 Đặc điểm của Debug
Debug là một chương trình chạy trong môi trường DOS Nó dùng để chongười lập trình có thể:
• nhập và dịch các lệnh dạng hợp ngữ sang mã máy và ngược lại
• nạp, xem và thay đổi nội dung của tệp ở trong khối nhớ
• chạy chương trình theo từng lệnh, nhóm lệnh hay cả chương trình
• sửa từng byte, nhiều byte hay cả chương trình
• xem và thay đổi nội dung các thanh ghi
Các lệnh của debug đều bắt đầu bằng một hay hai chữ cái, trong đó có mộtdấu ?
2.1.2 Khởi động và thoát khỏi Debug
Khởi động Debug tại dấu nhắc của DOS ta gõ lệnh:
Debug [ổ đĩa][đường dẫn][tên tệp]
Trong đó các tham số đi đằng sau lệnh Debug dùng để chỉ ra tên tệp EXEhay COM để kiểm tra
Sau khi khởi động Debug thì màn hình lúc này còn một dấu nhắc là dấugạch ngang nhỏ "_" Tại đây ta gõ các lệnh của Debug để thực hiện kết thúc lệnh
là ENTER và muốn thoát khỏi Delbug ta gõ lệnh q (quit)
Công dụng: Lệnh cho ta nhập các lệnh của chương trình dạng hợp ngữ vào
một địa chỉ ô nhớ
Ví dụ: A 200 hay A 0200
Khi đó màn hình sẽ hiện ra địa chỉ ô nhớ xxxx:0200 để ta gõ lệnh vào địachỉ trên, ví dụ ta gõ lệnh MOV AX, 09 (các giá trị trong Debug đều ở dạng hexa
Trang 31nên ta không cần đưa thêm ký tự h đằng sau giá trị đó Nếu có nó sẽ báo lỗi) Saukhi nhấn Enter thì dòng lệnh được:
• dịch ra mã máy
• ghi vào ô nhớ có địa chỉ trên
• màn hình hiện ra địa chỉ tiếp theo để chờ nhập lệnh tiếp theo
Cứ tiếp tục như vậy ta có thể nhập được cả chương trình
2) Lệnh E
Cú pháp: E <address> [list]
Thông số address là một số hexa gồm bốn chữ số để chỉ địa chỉ bắt đầu đểxem hay sửa đổi dữ liệu Địa chỉ có thể là CS:Offset hay chỉ là Offset vì ngầmđịnh là CS hiện hành
Thông số list là danh sách các dữ liệu mà ta muốn nhập vào các ô nhớ liêntiếp Nếu là một xâu ký tự thì tâ phải đặt trong hai dấu nháy kép "" hay hai dấunháy đơn ''
Công dụng: Dùng để xem và sửa nội dung của từng ô nhớ Ta chỉ cần chỉ
ra địa chỉ đầu tiên của ô nhớ và khi đó nó sẽ hiện ra nội dung của ô nhớ đầu tiên,nếu ta muốn sửa dữ liệu của ô nhớ thì ta cứ việc nhập dữ liệu mới bên cạnh dữliệu cũ, sau đó nhấn dấu cách để xem nội dung của ô nhớ tiếp theo Kết thúc lệnhnày là dấu Enter
3) Lệnh F
Cú pháp: F range list
Thông số range xác định một vùng nhớ, có thể là địa chỉ bắt đầu và địa chỉkết thúc hay địa chỉ bắt đầu và chiều dài của vùng nhớ
thông số list chỉ danh sách các dữ liệu muốn lấp đầy vùng nhớ range
Công dụng: Lấp đầy các ô nhớ bằng một danh sách các dữ liệu Lệnh này
có thể thay cho lệnh E để nhập đồng thời nhiều dữ liệu cùng một lúc
Ví dụ: F 0100 L 100 41 42 43
Lệnh này sẽ ghi đầy các ô nhớ từ 0100 đến 01FF (100 địa chỉ) bằng các con
số 41, 42, 43 Ba giá trị này sẽ lặp lại cho đến khi toàn bộ các ô nhớ được lấpđầy giá trị
Trang 32Thông số range xác định địa chỉ đầu và địa chỉ cuối hay địa chỉ đầu và chiềudài ô nhớ.
Công dụng: Có thể nói lệnh này trái ngược với lệnh A, nó dịch ngược các
lệnh từ mã máy sang lệnh dạng assembly trong các ô nhớ được chỉ ra vùng rangehay địa chỉ IP hiện hành
Ví dụ:
U 0100 : Dịch ngược 32 byte đầu tiên từ địa chỉ 0100
U CS:0100 110 : Dịch ngược dữ liệu từ địa chỉ CS:0100 tới CS: 110
U 0100 L 20 : Dịch ngược 20 dòng lệnh bắt đầu từ địa chỉ 0100
2.2.2 Nhóm các lệnh dịch chuyển dữ liệu
1) Lệnh I
Cú pháp: I <địa chỉ cổng>
Thông số địa chỉ cổng vào có thể mã hóa thành 16 bit
Công dụng: Đọc giá trị của cổng có địa chỉ được chỉ ra
Ví dụ: I 2F8 : Đọc giá trị của cổng có địa chỉ là 2F8 và in giá trị lên màn
hình
2) Lệnh O
Cú pháp: O <Địa chỉ cồng><giá trị>
Thông số địa chỉ cổng giống lệnh I
Thông số giá trị là byte số liệu đưa ra cổng
Công dụng: Lệnh này đưa một byte dữ liệu ra cổng
Ví dụ: O 61 3A : Đưa giá trị 3A ra cổng 61
3) Lệnh L
Cú pháp:
Dạng 1: L [address] ghi nội dung của một số byte đã được chỉ định trong
thanh ghi BX:CX của một tệp lên đĩa
Dạng 2: L address driver firstsector numernạp trực tiếp các cung được
chỉ định
Thông số address là địa chỉ mà ở đó ta muốn nạp tệp hay nội dung củacung Nếu không chỉ định địa chỉ thì Debug sẽ lấy địa chỉ mặc định trong CS.Thông số Driver chỉ định ổ đĩa trên đó các cung chỉ định sẽ được đọc Cócác giá trị 0=ổ A, 1=ổ B, 2=ổ C,
Thông số Fistsector là một số hexa chỉ số cung để nạp
Thông số number là một số hexa chỉ số các cung liên tiếp sẽ được đọc
Trang 33Công dụng:Dạng 1 nạp nội dung của tệp tin có tên N vào bộ nhớ của máy
tính có địa chỉ là address Nếu không có địa chỉ thì máy sẽ lấy địa chỉ CS:0100.Cặp thanh ghi BX:CX sẽ chứa kích thước tệp
Dạng 2: Nạp nội dung các cung trên đĩa vào bộ nhớ bắt đầu từ địa chỉaddress Sector đầu tiên trên đĩa cần được xác định trong firstsector và số sectorcần đọc được cho vào trong number
Ví dụ: Nạp tệp a.txt vào địa chỉ bắt đầu là CS:0000h
Ghi nội dung của số byte được chỉ trong BX:CX bắt đầu tại address vào tệp
có tên được đặt bởi lệnh N
Dạng 2: W address driver firstsector number
Các tham số giống lệnh L
Ví dụ: W 0000 0 200 10 : Ghi 10 sector trong bộ nhớ bắt đầu tại địa chỉ
CS:0000 vào sector thứ 200 của đĩa A
6) Lệnh M
Cú pháp: M range address
Thông số range chỉ định các địa chỉ bắt đầu hoặc kết thúc hay địa chỉ bắtđầu và chiều dài vùng nhớ mà ta muốn chép nội dung
Trang 34Thông số address là địa chỉ bắt đầu mà ta muốn chép nội dung của vùngnhớ range đến
Công dụng: Chép nội dung của vùng nhớ range sang vùng khác có địa chỉ
Cú pháp: D [address] hay D[range]
Thông số address là địa chỉ bắt đầu của một vùng nhớ 128 byte để hiển thịThông số range là đại chỉ đầu và địa chỉ cuối hay địa chỉ đầu và độ dài củavùng nhớ để hiển thị
Công dụng: Lệnh này sẽ so sánh hai vùng nhớ trên nếu giống nhau toàn bộ
thì Debug không hiện thông báo gì cả Còn nếu không đồng nhất thì Debug sẽhiển thị nội dung của các ô nhớ khác nhau
Trang 35Thông số value chỉ số lệnh cần thực hiện, giá trị ngầm định là 1
Công dụng: Thực hiện từng lệnh một hay một số các lệnh Sau mỗi lệnh thì
nội dung các thanh ghi cờ và thanh ghi chức năng được hiện lên màn hình cùngvới câu lệnh tiếp theo
2) Lệnh P
Cú pháp: P [=address][range]
Thông số: Các thông số giống lệnh T
Công dụng:Lệnh này cũng thực hiện từng lệnh một giống lệnh T chỉ có một
điểm khác là khi gặp lệnh gọi chương trình con, lệnh lặp hay lệnh ngắt thì nóthực hiện cả nhóm lệnh trên
3) Lệnh G
Cú pháp: G [=address][điểm dừng]
Thông số address giống lệnh T
Thông số điểm dừng chỉ định điểm dừng cho lệnh G
Công dụng: Lệnh này thực hiện toàn bộ chương trình hay thực hiện từ đầu
đến điểm dừng Một điều khác biệt so với lệnh P và T là con trỏ lệnh IP khôngtăng
Ví dụ:G=0100 hay G : Thực hiện toàn bộ chương trình bắt đầu tại địa chỉ
CS:0100
G =0100 200 : Thực hiện chương trình từ cs:0100 đến cs:0200
Trang 36Chương 3:Các lệnh của Assembly 3.1 Các lệnh vận chuyển dữ liệu
Tất cả lệnh trong nhóm này khi thực hiện không làm thay đổi trạng thái củacác bit cờ
1) Lệnh mov
Chức năng: Đưa nội dung từ SRC đến DST
Cú pháp: mov DST, SRC
Chú ý:
• Không được di chuyển giữa hai biến nhớ (mov mem1,mem2)
Thực hiện gián tiếp:
• Sự khác nhau khi sử dụng các chế độ địa chỉ
( mov ax,bx khác với mov ax,[bx] ; đưa nội dung mà bx trỏ đến vào ax) mov ax,[bx] tương đương với
mov ax, ds:[bx] (SI,DI hay BP)
Ví dụ: push ax
Trang 37Toán hạng gốc có thể tìm được theo các chế độ địa chỉ khác nhau: có thể làthanh ghi đa năng, thanh ghi đoạn hay là ô nhớ Lệnh này thường được dùng vớilệnh POP như là một cặp đỗi ngẫu để xử lý các dữ liệu và trạng thái của chươngtrình chính(CTC) khi vào ra chương trình con(ctc).
- Cơ chế PUSH/POP là LIPO( last in first out)
- Cách viết trên chỉ được sử dụng trong MASM còn trong TASM được viếtnhư sau:
Sau lệnh này dữ liệu tại ngăn xếp không thay đổi, SS không thay đổi
6) Lệnh XCHG (Exchange 2 Operands) Tráo nội dung 2 toán hạng
Chức năng: Tráo nội dung 2 toán hạng DST và SRC
Cú pháp:
Trang 38Trong toán hạng đích có thể tìm theo chế độ địa chỉ khác nhau nhưng phảichứa dữ liệu có cùng độ dài và không được phép đồng thời là 2 ô nhớ và cũngkhông được là thanh ghi đoạn Sau lệnh XCHG toán hạng chứa nội dung cũ củatoán hạng kia và ngược lại.
IN AL,1fh ; nội dung cổng 1fh đưa vào AL
+ Nếu địa chỉ cổng ≥ 256 thì phải nhờ đến thanh ghi DX
Ví dụ: địa chỉ COM1 = 378h
mov dx,378h
in al,dx
8) Lệnh OUT
Chức năng: đưa dữ liệu từ thanh ghi AL/AX ra cổng
Cú pháp: OUT địa chỉ cổng,AL/AX
Chú ý:
• Nếu địa chỉ cổng <256 thì số địa chỉ đứng trực tiếp trong lệnh OUT
Ví dụ: địa chỉ cổng là 1fh
OUT 1fh,AL ; nội dung cổng 1fh đưa vào AL
• Nếu địa chỉ cổng ≥ 256 thì phải nhờ đến thanh ghi DX
Ví dụ: địa chỉ COM1 = 378h
mov dx,378h
out dx,al
Lệnh này không tác động đến cờ
9) Lệnh LEA (load Efective address)
Chức năng: lấy phần địa chỉ offset của biến đưa vào thanh ghi 16 bit
Cú pháp: lea reg16, mem
Ví dụ: lea bx, Value hay mov bx, OFFSET Value
Đích thường là các thanh ghi: BX, CX, DX, BP, SI, DI
Nguồn là tên biến trong đoạn DS được chỉ rõ trong lệnh hay ô nhớ cụ thể
Ví dụ: lea dx, msg; Nạp địa chỉ offset của bản tin msg vào dx
Trang 3910) Lệnh LES (Load register and ES with words from memory)
Chức năng: chuyển giá trị của 1 từ từ một vùng nhớ vào thanh ghi đích vàgiá trị của từ tiếp theo sau của vùng nhớ vào thanh ghi ES
Cú pháp: les reg, mem
Trong đó: Đích là một trong các thanh ghi AX, BX,CX, DX, SP, BP, SI, DI.Gốc là ô nhớ trong đoạn DS được chỉ rõ trong lệnh
11) Lệnh LDS (Load resgister and DS with words from memory)
Chức năng: Nạp một từ từ bộ nhớ vào thanh ghi cho trong lệnh và 1 từ tiếptheo vào DS
Trang 40Cú pháp: adc DST, SRC
Tác động đến cờ: C, P, A, Z, S, O
Ví dụ: adc ax, bx
3) Lệnh INC(Increment Destination Register or Memory)
Chức năng: Tăng toán hạng đích thêm 1 DST← DST + 1
Cú pháp: inc DST
Tác động đến cờ: C, P, Z, S, O
Ví dụ: reg→ inc ax
mem→ inc value
4) Lệnh INC(Increment Destination Register or Memory)
Chức năng: Tăng toán hạng đích thêm 1 DST ←DST + 1