intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng vi xử lý 8086/8088

Chia sẻ: Until You | Ngày: | Loại File: PDF | Số trang:48

380
lượt xem
43
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Khối điều khiển:có mạch giải mã lệnh. Mã lệnh đọc vào từ bộ nhớ đưa đến đầu của bộ giải mã, các thông tin thu được từ đầu ra củc nó sẽ được đưa đến mạch tạo xung điều khiển, kết quả là thu được các dãy xung khác nhau để điều khiển hoạt động của các bộ phận bên trong và bên ngoài CPU.

Chủ đề:
Lưu

Nội dung Text: Bài giảng vi xử lý 8086/8088

  1. 8/29/2011 1 CÁC NỘI DUNG CHÍNH 1. CẤU TRÚC VI XỬ LÝ 8086/8088 2. MÔ TẢ TẬP LỆNH CỦA BỘ VI XỬ LÝ 8086/88 3. CÁCH MÃ HOÁ LỆNH 4. CÁC CHẾ ĐỘ ĐIA CHỈ 5. HỆ THỐNG NGẮT 6. LẬP TRÌNH HỢP NGỮ 7. GHÉP NỐI VÀ VÀO/RA DỮ LIỆU 2 1
  2. 8/29/2011 I. Giới thiệu cấu trúc bên trong và hoạt động của bộ vi xử lý 8086/88. 1. Cấu trúc VXL Intel 8086/88 3 Khối thực thi EU • Khối điều khiển (Control System - CS): có mạch giải mã lệnh. Mã lệnh đọc vào từ bộ nhớ đưa đến đầu của bộ giải mã, các thông tin thu được từ đầu ra củc nó sẽ được đưa đến mạch tạo xung điều khiển, kết quả là thu được các dãy xung khác nhau (tùy theo mã lệnh) để điều khiển hoạt động của các bộ phận bên trong và bên ngoài CPU. • Khối logic và số học (Arithmetic and Logic Unit ALU): dùng để thực hiện các thao tác khác nhau với các toán hạng cuả lệnh. 4 2
  3. 8/29/2011 Khối phối ghép bus BIU • Khối BIU có nhiệm vụ đưa ra điạ chỉ, đọc mã lệnh từ bộ nhớ. Nói cách khác BIU chiu trách nhiệm đưa điạ chỉ ra bus và trao đổi dữ liệu với bus. • Trong BIU còn có bộ nhớ đệm lệnh với dung lượng 4 byte dùng để đưa các mã lệnh đọc được nằm sẵn sàng chờ EU xử lý (bộ lệnh này còn được gọi là hàng đợi lệnh ) • Tóm lại: khi CPU hoạt động EU sẽ cung cấp thông tin về điạ chỉ cho BIU để khối này đọc lệnh và dữ liệu, còn bản thân nó thì giải mã lệnh và thực hiện lệnh 5 2. Hoạt động • Khi CPU 8088 hoạt động, EU sẽ cung cấp các thông tin về địa chỉ cho BIU đọc lệnh và dữ liệu đưa về giải mã lệnh và thực hiện lệnh. Khối EU gồm các bộ tính toán số học ALU (Arithmetical Logical Unit), bộ điều khiển CS (Control System) và các thanh ghi (Register). Tại CU có mạch giải mã lệnh sẽ nhận mã lệnh đọc vào từ bộ nhớ, xử lý và đưa ra mạch tạo xung điều khiển. Tuz theo mã lệnh ta sẽ thu được các dãy xung khác nhau để điều khiển các hoạt động khác nhau bên trong và bên ngoài của CPU. Khối ALU có nhiệm vụ thực hiện các thao tác khác nhau với các toán hạng của lệnh. Tóm lại EU duy trì trạng thái của CPU, kiểm soát các thanh ghi đa năng và toán hạng lệnh, tất cả các thanh ghi và đường truyền dữ liệu trong EU có dung lượng 16 bit. Bộ vi xử lý thực hiện các lệnh theo các bước sau: - Lấy lệnh từ bộ nhớ. - Đọc toán hạng (nếu lệnh yêu cầu). - Thực hiện lệnh. - Ghi kết quả. 6 3
  4. 8/29/2011 3. Các thanh ghi 7 Các thanh ghi đa năng (chung) • Trong khối EU có bốn thanh ghi đa năng 16 bit AX, BX, CX, DX. Mỗi thanh ghi có thể tách ra thành hai thanh ghi 8 bit cao và thấp để làm việc độc lập, đó là các tập thanh ghi AH và AL, BH và BL, CH và CL, DH và DL ( trong đó H chỉ phần cao, L chỉ phần thấp ). Mỗi thanh ghi có thể dùng một cách vạn năng để chứa các tập dữ liệu khác nhau nhưng cũng có công việc đặc biệt nhất định chỉ thao tác với một vài thanh ghi nào đó và chính vì vậy các thanh ghi thường được gán cho những cái tên đặc biệt rất có ý nghĩa. • AX ( accumulator, acc ): thanh chứa. Các kết qủa của các thao tác thường được chứa ở đây ( kết quả của phép nhân, chia ). Nếu kết quả là 8 bit thì thanh ghi AL được coi là acc. • BX ( base ): thanh ghi cơ sở thường chứa địa chỉ cơ sở của một bảng dùng trong lệnh XLAT. • CX ( count ): bộ đếm. CX thường được dùng để chứa số lần lặp trong trường hợp các lệnh LOOP ( lặp ), còn CL thường cho ta số lần dịch hoặc quay trong các lệnh dịch hoặc quay thanh ghi. • DX ( data ): thanh ghi dữ liệu DX cùng BX tham gia các thao tác của phép nhân hoặc chia các số 16 bit. DX thường dùng để chứa địa chỉ của các cổng trong các lệnh vào/ ra dữ liệu trực tiếp. 8 4
  5. 8/29/2011 Các thanh ghi đoạn Trong thực tế bộ vi xử lý 8088 có các thanh ghi 16 bit liên quan đến địa chỉ đầu của các vùng (các đoạn) và chúng được gọi là các thanh ghi đoạn (Segment Registers). Đó là: • Thanh ghi đoạn mã CS(Code-Segment) • Thanh ghi đoạn dữ liệu DS(Data Segment). • Thanh ghi đoạn ngăn xếp SS(Stack Segment) • Thanh ghi đoạn dữ liệu phụ ES(Extra Segment). Các thanh ghi đoạn 16 bit này chỉ ra địa chỉ đầu của bốn đoạn trong bộ nhớ, dung lượng lớn nhất của mỗi đoạn nhớ này là 64 Kbyte. 9 Các thanh ghi đoạn(tt) • Nội dung các thanh ghi đoạn sẽ xác định địa chỉ của ô nhớ nằm ở đầu đoạn. Địa chỉ này còn gọi là địa chỉ cơ sở. Địa chỉ của các ô nhớ khác nằm trong đoạn tính được bằng cách cộng thêm vào địa chỉ cơ sở một giá trị gọi là địa chỉ lệch hay độ lệch (Offset), gọi như thế vì nó ứng với khoảng lệch của toạ độ một ô nhớ cụ thể nào đó so với ô đầu đoạn. Độ lệch này được xác định bởi các thanh ghi 16 bit khác đóng vai trò thanh ghi lệch (Offset register) đó là các thanh ghi con trỏ và chỉ số. 10 5
  6. 8/29/2011 Segment: • Segment là một đoạn bộ nhớ có kích thước tối đa 64KB (16 bit offset) và có thể bắt đầu tại các địa chỉ chia chẵn cho 16 (10h) trên toàn bộ vùng nhớ 1MB (20 bit). • Trong hầu hết các tác vụ của bộ xử lý 8088, segment được xác định gián tiếp qua các thanh ghi segment DS , ES , SS , CS . Khi cần sử dụng segment nào , phải gán giá trị tương ứng cho các thanh ghi segment . Lúc đó các địa chỉ được thể hiện thành dạng Segment:offset • Thí dụ: CS:Offset , DS:Offset 11 Địa chỉ logic và địa chỉ vật lý • Để xác định địa chỉ vật lý 20 bit của một ô nhớ nào đó trong một đoạn bất kz. CPU 8088 phải dùng đến 2 thanh ghi 16 bit ( một thanh ghi để chứa địa chỉ cơ sở, còn thanh kia chứa độ lệch ) và từ nội dung của cặp thanh ghi đó tạo ra địa chỉ vật lý theo công thức sau: Địachỉvậtlý=Thanhghiđoanx16 (16D=10H)+Thanhghilệch • Việc dùng 2 thanh ghi để ghi nhớ thông tin về địa chỉ thực chất để tạo ra một loại địa chỉ gọi là địa chỉ logic và được ký hiệu như sau: Thanhghiđoạn: Thanhghilệch hay segment: offset • Địa chỉ kiểu ‘‘segment : offset’’ là logic vì nó tồn tại dưới dạng giá trị của các thanh ghi cụ thể bên trong CPU và khi cần thiết truy cập ô nhớ nào đó thì nó phải được đổi ra địa chỉ vật lý để rồi được đưa lên bus địa chỉ. Việc chuyển đổi này 12 do một bộ tạo địa chỉ thực hiện. 6
  7. 8/29/2011 Offset: • Offset là một cự ly (16 bit) so với điểm đầu của một segment. • Các cách mô tả offset: • [Const] , [BX] , [BP] , [SI] , [DI] • [BX+Const],[BP+Const],[SI+Const], DI+Const] • [BX+SI+Const],[BX+DI+Const], [BP+SI+Const] , [BP+DI+Const] • Const là một hằng số • * Nhận xét: Offset có thể mô tả bằng một tổng của : Hằng số 16 bit và các thanh ghi chỉ mục BX, BP, SI, DI . Trong đó các cặp BX và BP , SI và DI không được phép cùng xuất hiện 13 Các thanh ghi con trỏ và chỉ số • Trong 8088 còn có ba thanh ghi con trỏ và hai thanh ghi chỉ số 16 bit. Các thanh ghi này ( trừ IP ) đều có thể được dùng như các thanh ghi đa năng, nhưng ứng dụng chính của mỗi thanh ghi là chúng được ngầm định như là thanh ghi lệch cho các đoạn tương ứng. • Ví dụ: cặp CS:IP sẽ chỉ ra địa chỉ của lệnh sắp thực hiện trong đoạn mã. Tại một thời điểm nào đó ta có CS = F000H và IP = FFF0H thì CS:IP ~ FOOOHx10H + FFFOH = FOOOOH + FFFOH = FFFFOH 14 7
  8. 8/29/2011 Nhóm thanh ghi chỉ mục và con trỏ (Index & Pointer registers): SI,DI,BP,SP • Có thể sử dụng như các thanh ghi đa dụng, ngoài ra còn đóng vai trò làm chỉ mục khi xác dịnh địa chỉ theo offset của bộ xử lý: – SI và DI là hai thanh ghi chỉ mục để thực hiện các tác vụ chuỗi – BP và SP là hai thanh ghi con trỏ để thao tác trên cấu trúc STACK 15 Các thanh ghi con trỏ và chỉ số(tt) • IP ( Instruction pointer ): con trỏ lệnh. IP luôn trỏ vào lệnh tiếp theo sẽ được thực hiện nằm trong đoạn mã CS. Địa chỉ đầy đủ của lệnh tiếp theo này ứng với CS:IP và được xác định theo cách đã nói ở trên. • BP ( base pointer ): con trỏ cơ sở. BP luôn trỏ vào một dữ liệu nằm trong đoạn ngăn xếp SS. Địa chỉ đầy đủ của một phần tử trong đoạn ngăn xếp ứng với SS:BP và được xác định theo cách đã nói ở trên. • SP ( stack pointer ): con trỏ ngăn xếp. SP luôn trỏ vào đỉnh hiện thời của ngăn xếp nằm trong đoạn ngăn xếp SS. Địa chỉ đỉnh ngăn xếp ứng với SS:SP và được xác định theo cách đã nói ở trên. • SI ( source index ): chỉ số gốc hay nguồn. SI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ cụ thể đầy đủ ứng với DS:SI và được xác định theo cách đã nói ở trên. • DI ( destination index ): chỉ số đích. DI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ cụ thể đầy đủ ứng với DS:DI và được xác định theo cách đã nói ở trên. • Riêng trong các lệnh thao tác với dữ liệu kiểu chuổi thì cặp ES:DI luôn ứng với địa chỉ của phần tử thuộc chuỗi đích còn cặp DS:SI ứng với địa chỉ của phần tử thuộc chuỗi gốc. 16 8
  9. 8/29/2011 Thanh ghi cờ FR ( Flag Register ) • Đây là thanh ghi khá đặc biệt trong CPU, mỗi bit của nó được dùng để phản ánh một trạng thái nhất định của kết quả phép toán do ALU thực hiện hoặc một trạng thái hoạt động của EU. Dựa vào các cờ này người lập trình có thể có các lệnh thích hợp tiếp theo cho bộ vi xử lý (các lệnh nhảy có điều kiện). Thanh ghi cờ gồm 16 bit nhưng người ta chỉ dùng hết 9 bit của nó để làm các bit cờ. 17 Thanh ghi cờ FR (Flag Register)(tt) • 6 bit cờ trạng thái: AF,CF,SF,PF,ZF,OF. • AF ( auxilialyry carry flag ) • CF ( carry flag ) • SF ( sign flag ) • PF ( parity flag ) • ZF ( zero flag ) • OF ( over flow flag ) • 3 bit cờ điều khiển: • TF ( trap flag ) • IF ( interrupt enable flag ) • DF ( direction flag ) 18 9
  10. 8/29/2011 II. Mô tả tập lệnh của bộ vi xử lý 8086/88. • 1. Nhóm lệnh chuyển: MOV, PUSH, POP, XCHG, XLAT, LEA, LDS, LES, IN, INC, OUT, .... • 2. Nhóm lệnh xử lý số học: ADD, ADC, INC, DAA, AAA, SUB, SBB, DEC, NEG, DAS,… • 3. Các lệnh logic: AND, OR, XOR, NOT,.... • 4. Dịch chuyển và quay: SAL, SHL, SHR, SAR, ROL, ROR, RCL, RCR,..... • 5. Nhóm lệnh xử lý chuỗi: MOVS, CMPS, SCAS, LODS, STOS,..... • 6. Nhóm lệnh chuyển điều khiển chương trình: JA, JAE, JB, JBE, JC, JCXZ, JE, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC,.... • 7. Các lệnh xử lý ngắt (interrupt): INT, INTO, INT n, IRET. • 8. Các lệnh điều khiển quay vòng thực hiện chương trình: LOOP, LOOPE, LOOPZ, LOOPNE, LOOPNZ,… • Nhóm các lệnh khác: Nhóm các lệnh này gồm các lệnh dựng và xoá cờ, các lệnh điều khiển trạng thái của bộ VXL, gồm: CLC, CMC, STC, CLD, STD, CLI, STI, HLT, WAIT, .... 19 Lệnh CMP và TEST – CMP , • Thực hiện phép trừ Dest cho Src, kết quả không được giữ lại, các cờ hiệu bị thay đổi. – Test , • Thực hiện phép AND Dest với Src, kết quả không được giữ lại, các cờ hiệu bị thay đổi. • Hai tác vụ này được phối hợp cùng với các lệnh chuyển điều khiển theo điều kiện. 20 10
  11. 8/29/2011 Các lệnh chuyển điều khiển theo điều kiện • Lệnh chuyển điều khiển theo điều kiện có dạng thức chung như sau : • là một tên nhãn đánh dấu một vị trí trong chương trình. Khi điều kiện kiểm tra là đúng, CPU sẽ chuyển đến thực hiện lệnh tại vị trí , nếu điều kiện kiểm tra là sai CPU sẽ thực hiện lệnh kế tiếp 21 Lệnh chuyển điều khiển theo điều kiện so sánh Số không dấu Số có dấu So sánh JA JG > JAE , JNB JGE , JNL >= JE , JZ JE , JZ = JBE , JNA JLE , JNG
  12. 8/29/2011 Lệnh chuyển điều khiển theo cờ hiệu Lệnh làm thay đổi cờ hiệu trực tiếp Lệnh Điều kiện Lệnh Điều kiện JC CF = 1 STC CF = 1 JNC CF = 0 CLC CF = 0 JZ ZF = 1 STD DF = 1 JNZ ZF = 0 CLD DF = 0 JO OF = 1 STI IF = 1 JNO OF = 0 CLI IF = 0 JP PF = 1 JNP PF = 0 JS SF = 0 JNS SF = 0 JNS SF = 0 JCXZ CX = 0 Các lệnh chuyển điều khiển theo điều kiện thường đi theo sau lệnh CMP Các lệnh chuyển điều khiển không làm thay đổi giá trị của các cờ hiệu. 23 III. Cách mã hoá lệnh • Để tìm hiểu cách mã hoá lệnh, ta xét lệnh MOV des,src dùng để chuyển dữ liệu giữa hai thanh ghi hay một ô nhớ và một thanh ghi. • Đối với các lệnh MOV. Để chuyển dữ liệu kiểu: o Thanh ghi  thanh ghi ( trừ thanh ghi đoạn ) o hoặc Bộ nhớ  thanh ghi ( trừ thanh ghi đoạn ) thì 6 bit đầu này luôn là 100010. Đối với các thanh ghi đoạn thì điều này lại khác. 24 12
  13. 8/29/2011 III. Cách mã hoá lệnh(tt) • Để mã hóa lệnh MOV, ta cần dùng ít nhất là 2 byte trong đó 6 bit dùng cho mã lệnh • Bit D xác định hướng truyền của dữ liệu, D = 0 xác định dữ liệu sẽ đi từ thanh ghi cho bởi 3 bit Reg, D = 1 xác định dữ liệu sẽ đi đến thanh ghi cho bởi 3 bit Reg. • Bit W xác định sẽ truyền 1 byte (W = 0) hay 1 word (W = 1). 25 III. Cách mã hoá lệnh(tt) • 3 bit REG dùng để chọn thanh ghi sử dụng: 26 13
  14. 8/29/2011 III. Cách mã hoá lệnh(tt) • 2 bit MOD ( chế độ ) cùng với 3 bit R/M ( thanh ghi/bộ nhớ ) tạo ra 5 bit dùng để chỉ ra chế độ địa chỉ cho các toán hạng của lệnh. Bảng sau cho ta thấy cách mã hoá các chế độ địa chỉ : 27 III. Cách mã hoá lệnh(tt) Đối với các lệnh MOV. Để chuyển dữ liệu kiểu: •Thanh ghi  thanh ghi ( trừ thanh ghi đoạn ) •hoặc Bộ nhớ  thanh ghi ( trừ thanh ghi đoạn ) thì 6 bit đầu này luôn là 100010. Đối với các thanh ghi đoạn thì điều này lại khác 28 14
  15. 8/29/2011 • VÝ dô 1: XÐt lÖnh MOV AL, BL; copy néi dung thanh ghi cho thanh ghi • Trong tr-êng hîp, nÕu ta lÊy AL lµ thanh ghi cho trong byte 2 lµ REG = 000 th× trong byte 1 bit D =1. Vµ nh- vËy to¸n h¹ng cßn l¹i lµ thanh ghi BL sÏ t-¬ng øng víi MOD = 11 vµ R/M = 011. C¸c byte lÖnh lµ: Byte 1 Byte 2 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 • Cßn nÕu lÊy BL lµ thanh ghi cho trong byte 2 lµ REG =011, th× trong byte 1 bit D = 0. To¸n h¹ng cßn l¹i lµ AL t-¬ng øng víi MOD =11 vµ R/M =000. Khi ®ã, gi¸ trÞ cña nã lµ: Byte 1 Byte 2 1 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 • VÝ dô 2: XÐt lÖnh MOV [BX], CL • Trong tr-êng hîp nµy, ta chØ cã CL lµ thanh ghi cho trong byte 2 lµ REG =001 vµ trong byte 1 bit D=0. To¸n h¹ng cßn l¹i lµ « nhí ®Þa chØ trong BX sÏ t-¬ng øng víi MOD = 00 vµ R/M =111. C¸c byte lÖnh lµ Byte 1 Byte 2 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 29 IV. MẢNG VÀ CÁC CHẾ ĐỘ ĐỊA CHỈ • Mảng một chiều: – Mảng một chiều là một danh sách các phần tử cùng loại và có trật tự. Có trật tự có nghĩa là có phần tử thứ nhất , phần tử thứ hai , phần tử thứ ba ... • Vị trí các phần tử của một mảng: – Địa chỉ của một phần tử của mảng có thể được xác định bằng cách cộng một hằng số với địa chỉ cơ sở . Giả sử A là một mảng và S chỉ ra số byte của một phần tử của mảng ( S=1 đối với mảng byte và S=2 đối với mảng từ ) . Vị trí của các phần tử của mảng A có thể tính như sau : 30 15
  16. 8/29/2011 Ví dụ : Trao đổi phần tử thứ 10 và thứ 25 của mảng từ W. Phần tử thứ 10 là W*10+ có địa chỉ là: W+9x2=W+18 Phần tử thứ 25 là W*25+ có địa chỉ là: W+24x2=W+48 Vì vậy có thể trao đổi chúng như sau : MOV AX,W+18 ; AX = W[10] XCHG W+48,AX ; AX= W[25] MOV W+18, AX ; complete exchange 31 Các chế độ địa chỉ (addressing modes) Cách thức chỉ ra toán hạng trong lệnh gọi là chế độ địa chỉ . Các chế độ địa chỉ thường dùng là : • Chế độ địa chỉ bằng thanh ghi ( register mode) : toán hạng là thanh ghi • Chế độ địa chỉ tức thời ( immediate mode) : toán hạng là hằng số • Chế độ địa chỉ trực tiếp ( direct mode) : toán hạng là biến Ví dụ : MOV AX,0 ; AX là register mode còn 0 là immediate mode ADD ALPHA,AX ; ALPHA là direct mode Ngoài ra còn có 4 chế độ địa chỉ khác là : • Chế độ địa chỉ gián tiếp bằng thanh ghi ( register indirect mode ) • Chế độ địa chỉ cơ sở ( based mode) • Chế độ địa chỉ chỉ số ( indexed mode) • Chế độ địa chỉ chỉ số sơ sở ( based indexed mode) 32 16
  17. 8/29/2011 Các chế độ địa chỉ(tt) Ví dụ: chế độ địa chỉ thanh ghi MOV BX, DX ; chuyển nội dung DX vào BX. MOV DX,AX ; chuyển nội dung AX vào DX ADD AL,DL ; cộng nội dung AL và DL rồi đưa vào AL 33 Chế độ địa chỉ gián tiếp bằng thanh ghi. • Trong chế độ địa chỉ gián tiếp bằng thanh ghi , địa chỉ offset của toán hạng được chưá trong 1 thanh ghi. Chúng ta nói rằng thanh ghi là con trỏ ( pointer) của vị trí nhớ . Dạng toán hạng là [register]. Trong đó register là các thanh ghi BX, SI, DI, BP. Đối với các thanh ghi BX, SI, DI thì thanh ghi đoạn là DS . Còn thanh ghi đoạn của BP là SS . • Ví dụ 1: giả sử rằng SI = 100h và từ nhớ(word) tại địa chỉ DS:0100h có nội dung là 1234h. Lệnh MOV AX,*SI+ sẽ copy 1234h vào AX . 34 17
  18. 8/29/2011 Ví dụ 2: Giả sử rằng nội dung các thanh ghi và nội dung của bộ nhớ tương ứng là như sau : Hãy cho biết lệnh nào sau đây là hợp l{, offset nguồn và kết qủa của các lệnh hợp l{ ? • a. MOV AX,[AX] • b. MOV CX,[SI] • c. MOV BX,[AX] • d. ADD [SI],[DI] • e. INC [DI] • Lời giải : Source offset Result • a. 1000h 1BACh • b. 2000h 20FFh • c. illegal source register ( must be BX,SI,DI) • d. illegal memory-memory add • e. 3000h 031Eh 35 Ví dụ 3 : Viết đoạn mã để cộng vào AX 10 phần tử của một mảng W định nghĩa như sau : W DW 10,20,30,40,50,60,70,80,90,100 • Giải : XOR AX,AX ; xoá AX LEA SI,W ; SI trỏ tới địa chỉ cơ sở ( base) ;của mảng W . MOV CX,10 ; CX chưá số phần tử của mảng ADDITION: ADD AX,*SI+ ; AX=AX + phần tử thứ nhất ADD SI,2 ; tăng con trỏ lên 2 LOOP ADDITION ; lặp 36 18
  19. 8/29/2011 Ví dụ 3: Viết thủ tục để đảo ngược một mảng n từ có nghĩa là phần tử thứ 1 sẽ đổi thành phần tử thứ n , phần tử thứ hai sẽ thành phần tử thứ n-1 ... Chúng ta sẽ dùng SI như là con trỏ của mảng còn BX chứa số phần tử của mảng ( n từ ) . Giải : Số lần trao đổi là N/2 lần . Nhớ rằng phần SHR CX,1 ;CX=n/2 : số lần trao đổi tử thứ N của mảng có địa chỉ A+2x(N-1). Đoạn ; trao đổi các phần tử mã như sau : XCHG_LOOP: REVERSE PROC MOV AX,[SI] ; lấy 1 phần tử ở nửa thấp của ; input: SI= offset of array ;mảng ; BX= number of elements XCHG AX,[DI] ; đưa nó lên nửa cao của ; output : reverse array ;mảng PUSH AX ; cất các thanh ghi MOV [SI],AX ; hoàn thành trao đổi PUSH BX ADD SI,2 ; SI chỉ tới phần tử tiếp theo của PUSH CX ;mảng PUSH SI SUB DI,2 ; DI chỉ tới phần tử thứ n-1 PUSH DI LOOP XCHG_LOOP ; DI chỉ tới phần tử thứ n POP DI MOV DI,SI ; DI trỏ tới từ thứ nhất POP SI MOV CX,BX ; CX=BX=n : số phần tử POP CX DEC BX ; BX=n-1 POP BX SHL BX,1 ;BX=2x(n-1) POP AX ADD DI,BX ;DI = 2x(n-1) + offset của mảng : RET ;chỉ tới phần tử thứ n REVERSE ENDP 37 Chế độ địa chỉ chỉ số và Chế độ địa chỉ cơ sở Trong các chế độ địa chỉ này , địa chỉ offset của toán hạng có được bằng cách cộng một số gọi là displacement với nội dung của một thanh ghi . Displacement có thể là : – địa chỉ offset của một biến , ví dụ A – một hằng ( âm hoặc dương ), ví dụ -2 – địa chỉ offset của một biến cộng với một hằng số , ví dụ A+4 Cú pháp của một toán hạng có thể là một trong các kiểu tương đương sau : – [ register + displacement] – [displacement + register] – [ register]+ displacement – [ displacement]+ register – displacement[register] Các thanh ghi phải là BX , SI , DI ( địa chỉ đoạn phải là thanh ghi DS) và BP (thanh ghi SS chứa địa chỉ đoạn ) 38 19
  20. 8/29/2011 Chế độ địa chỉ chỉ số và Chế độ địa chỉ cơ sở (tt) • Chế độ địa chỉ được gọi là cơ sở ( based) nếu thanh ghi BX( base register) hoặc BP ( base pointer) được dùng . • Chế độ địa chỉ được gọi là chỉ số ( indexed) nếu thanh ghi SI( source index) hoặc DI ( destination index) được dùng . Ví dụ : Giả sử rằng W là mảng từ và BX chưá 4 . Trong lệnh MOV AX,W*BX+ displacement là địa chỉ offset của biến W. Lệnh này sẽ di chuyển phần tử có điạ chỉ W+4 vào thanh ghi AX . Lệnh này cũng có thể viết dưới các dạng tương đương sau : • MOV AX, [W+BX] • MOV AX, [BX+W] • MOV AX, W+[BX] • MOV AX, [BX]+W 39 Ví dụ 1: Viết đoạn mã để cộng vào AX 10 phần tử của một mảng W định nghĩa như sau: W DW 10,20,30,40,50,60,70,80,90,100 • Với chế độ địa chỉ cơ sở có thể viết code cho bài toán tính tổng 10 phần tử của mảng như sau : • XOR AX,AX ; xoá AX • XOR BX,BX ; xoá BX ( thanh ghi cơ sở ) • MOV CX,10 ; CX= số phần tử =10 • ADDITION: • ADD AX,W[BX] ; sum=sum+element • ADD BX,2 ; trỏ tới phần tử thứ hai • LOOP ADDITION 40 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2