Giáo trình Assembly

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

docx92 trang | Chia sẻ: lylyngoc | Lượt xem: 4023 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Giáo trình Assembly, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Giáo trình Assembly 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ụ: 33 2 1 16 2 0 8 2 0 4 2 0 2 2 0 1 2 1 0 (33)10 = (100001)2 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ụ: 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.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ố 2i tại từng vị trí thứ i. Thí dụ: (1110,11)2 = 1.23 + 1.22 + 1.21 + 0.20 + 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 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 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 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ề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. 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 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 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ô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 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. 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ỉ 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ể. Đị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 đá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