Khối Integer MUL DIV trong CPU có chức năng nhiệm vụ gì

Trang : 1 CHƯƠNG 3BỘ VI XỬ LÝ INTEL 8088Sau khi đã tìm hiểu qua về cấu trúc của hệ vi xử lý. Trong chương này tasẽ đi sâu tìm hiểu mọt bộvi xử lý cụ thể và rất điển hình: bộ vi xử lý của Intel.Trước hết cần nói rỏ lý do tại sao ở đâyta lại chọn đích danh bộ vi zử láy8088 để tìm hiểu mà không phải là bộ vi xử lý nào khác ( điều mà nhiều ngườikhác phải làm ). Thứ nhất, đây là bộ vi xử lý nổi tiếng một thời thuộc họ 80x86của Intel, nó được sử dụng trong nhiều lónh vực khác nhau, nhất là trong các máyIBM PC /XT. Các bộ vi xử lý thuộc họ này sẽ còn được sủ dụng rộng rãi tronghàng chục năm nữa, và vi tính kế thừa của các sản phẩm trong họ 80x86., cácchương trình viết cho8088 vẫn có thể chạy trên các hệ thống tiên tiến sau này. Thứhai, về góc độ sư phạm thì đây là bộ vi xử lý khá đơn giản và vì việc dạy hiểu nólà tương đối dể đối với những người mới bắt đầu thâm nhập vào lónh vực này. Thứba, các họvi xử lý tuy có khác nhau nhưng xét cho cùng cũng có khá nhiều điểmchủ yếu rất giống nhau. Do đó một khi đã nắm được các vấn đề kỷ thuật của8088,ta sẽ có cơ sở để nắm bắt các kỷ thuật của các bộ vi xử lý khác cùng trong họ Intel80x86 hoặc của các họ khác.1. Giới thiệu cấu trúc bên trong vàhoạt động của bộ vi xử lý8088.Trước khi giới thiệu tập lệnh và cách thức lập trình cho bộvi xử lý8088hoạt động ta cần phải tìm hiểu kỹ cấu trúc bên trong của nó.Trên hình 3.1 là sơ đồ khối cấu trúc bên trong cảu bộ vi xử lý Intel 8088:1.1.BIU Và EU theo sơ đồ khối trên hình 3.1 ta thấy bên trong CPU 8088 có 2 khốichính: khối phối ghép ( bus interface unit, BIU ) vàkhối thực hiện lệnh ( executionunit, EU ). Việc chia CPU ra thành 2 phần làm việc đồng thời có liên hệ với nhauqua đệm lệnh làm tăng đáng kể tốc độ xử lý của CPU. Các bus bên trong CPU cónhiệm vụ chuyển tải tín hiệu của các khối khác. Trong số các bus đó có bus dữliệu 16 bit của ALU, bus các tín hiệu điều khiển ở EU và bus trong của hệ thống ởBIU. Trước khi đi ra bus ngoài hoặc đivào bus trong của bộ vi xử l, các tín hiệutruyền trên bus thường được cho đi qua các bộ đệm để nâng cao tính tương thíchcho nối ghép hoặc nâng cao phối ghép.BIU đưa ra đòa chỉ, đọc mã lệnh từ bộ nhớ, đọc / ghi dữ liệu từ vào cổnghoặc bộ nhớ. Nói cách khác BIU chòu trách nhiệm đưa đòa chỉ ra bus và trao đổi dữliệu với bus.Trong EU ta thấy có một khối điều khiển ( control unit, CU ). Chính tạibên trong khối điều khiển này có mạch giải mã lệnh. Mã lệnh đọc vào từ bộ nhớđược đưa đến đầu vào của bộ giải mã, các thông tin thu được từ đầu ra của nó sẽđược đưa đến mạch tạo xung điều khiển, kết quả là tu thu được các dãy xung khácnhau ( tuỳ 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. Trong khối EU còn có khối số học và lôgic ( arithmetic anh logicunit. ALU ) dùng để thực hiện các thao tác khác nhau với các toán hạng của lệnh. Trang : 2Tóm lại, khi CPU hoạt động EU sẽ cung cấp thông tin về đòa chỉ cho BIU để khốinày đọc lệnh và dữ liệu, còn bản thân nó thì đọc lệnh và giải mã lệnh.Trong BIU còn có một bộ nhớ đệm lệnh với dung lượng 4 byte dùng đểchứa các mã lệnh đọc được nằm sẵn để chờ EU xử lý ( trong tài liệu của Intel bộđệm lệnh này còn được gọi là hàng đợi lệnh ). Đây là một cấu trúc mới được cấyvào bộ vi xử lý 8086x88 do việc Intel đưa cơ chế xử lý xen kẻ liên tục, dòng mãlệnh ( instruction pipelining ) vào ứng dụng trong các bộ vi xử lý thế hệ mới.Pipeline là một cơ chế đã được ứng dụng từ những năm 60 từ các máy lớn. Nhânđây ta sẽ giới thiệu sơ qua một chút về cơ chế này.Trong các bộ vi xử lý ở các thế hệ trước ( như ở 8085 chẳng hạn ), thôngthường hoạt động của CPU gồm 3 giai đoạn: đọc mã lệnh ( ôpcde fetch ), giải mãlệnh ( đecode ) và thực hiện lệnh ( execution ). Trong một thời điểm nhất đònh,CPU thế hệ này chỉ có thể thực hiện một trong ba công việc nói trên và vì vậy tuỳtheo từng giai đoạn sẽ có những bộ phận nhất đònh của CPU ở trạng thái nhàn rỗi.Chẳng hạn, khi CPU giải mã lệnh hoặc khi nó đang thực hiện những lệnh khôngliên quan đến bus ( thao tác nội bộ ) thì các bus không được dùng vào việc gì dẫnđến tình trạng lãng phí khả năng của chúng ( hình 3.2 ). Trong khi đó từ bộ vi xử lý8086/88, Intel sử dụng cơ chế xử lý xen kẻ liên tục dòng mã lệnh thì CPU đượcchia thành 2 khối và có sự phân chia công việc cho từng khối: việc đọc mã lệnh làdo khối BIU thực hiện, việc giải mã lệnh và thực hiện lệnh là do khối EU đảmnhiệm. Các khối chức năng này có khả năng làm việc đồng thời và các bus sẽ liêntục sử dụng: trong khi EU lấy mã lệnh từ bộ đệm 4 byte để giải mã hoặc thực hiệncác thao tác nội bộ thì BIU vẫn có thể đọc mã lệnh từ bộ nhớ chính rồi đặt chúngvào bộ nhớ đệm lệnh đã nói. Bộ đệm lệnh này làm việc theo kiểu “ vào trước – ratrước “ (first in-first out, FIFO ), nghóa là byte nào được cất vào đệm trước sẽ đượclấy ra xử lý trước. Nếu có sự vào/ra liên tục của dòng mã lệnh trong bộ đệm nàythì có nghóa là có sự phối hợp hoạt động hiệu quả giữa hai khối EU và BIU theo cơchế xử lý xen kẻ liên tục dòng mã lệnh để làm tăng tốc độ xử lý tổng thể. Kỹthuật xử lý xen kẻ liên tục dòng mã lệnh sẽ không còn tác dụng tăng tốc độ xử lýchung của CPU nữa nếu như trong đệm lệnh có chứa các mã lệnh của các lệnhCALL ( gọi chương trình con ) hoăc JMP ( nhảy ), bởi vì lúc các lệnh này nội dungcủa bộ đệm sẽ bò xoá và thay thế vào đó là nội dung mới được nạp bởi các mãlệnh mới do lệnh nhảy hoặc gọi quyết đònh. Việc này tiêu tốn nhiều thời gian hơnso với trường hợp trong đệm chỉ có mã lệnh của các lệnh tuần tự F1 D1 E1 F2 D2 E2 F3 D3 E3Không có pipeliningD1F1 E1D1F1 E1F1 D1 E1Có pipelining(F : Đọc lệnh , D :Giải mả lệnh, E : Thực hiện lệnh)Hình 3.2 : Dòng lệnh thường và dòng lệnh xen kẽ liên tục Trang : 3Trong bộ vi xử lý 8088 ta còn thắy có các thanh ghi 16 bit nằm trong cảhai khối BIU và EU, ngoài ra cũng có một số thanh ghi 8 hoặc 16 bit tại EU. Ta sẽlần lượt giới thiệu các thanh ghi nói trên cùng chức năng chính của chúng.*các thanh ghi đoạnKhối BIU đưa ra trên bus đòa chỉ 20 bit đòa chỉ, như vậy 8088 có khả năngphân biệt ra được 220 = 1.048.576 = 1M ô nhớ hay 1Mbyte, vì các bộ nhớ nói chungtổ chức theo byte. Nói cách khác: không gian đòa chỉ của 8088 là 1Mbyte. Trongkhông gian 1Mbyte bộ nhớ cần được chia thành các vùng khác nhau ( điều này rấtcó lợi khi làm việc ở chế độ nhiều người sử dụng hoặc đa nhiệm ) dành riêng để: Chứa mã chương trình. Chứa dữ liệu và kết quả không gian của chương trình. Tạo ra một vùng nhớ đặc biệt gọi là ngăn xếp ( stack ) dùng vàoviệc quản lý các thông số của bộ vi xử lý khi gọi chương trình conhoặc trở về từ chương trình con.Trong thực tế bộ vi xử lý 8088 có các thanh ghi 16 bit liên quan đến đòachỉ đầu của các vùng ( các đoạn ) kể trê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 sement ). Thanh ghi đoạn ngăn xếp SS ( Stack segment )và thanh ghi đoạn dữ liệu phụ ES ( Extra segment ). Các thanh ghi đoạn 16 bit nàychỉ 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ạnnhớ này là 64 Kbyte và tại một thời điểm nhất đònh bộ vi xử lý chỉ làm việc đượcvới bốn đoạn nhớ 64 Kbyte này. Việc thay đổi giá trò của các thanh ghi đoạn làmcho các đoạn có thể dòch chuyển linh hoạt trong phạm vi không gian 1 Mbyte, vìvậy các đoạn này có thể nằm cách nhau khi thông tin cần lưu trong chúng đòi hỏidung lượng đủ 64 Kbyte hoặc cũng có thể nằm trùm nhau do có những đoạn khôngcần dùng hết đoạn dài 64 Kbyte và vì vậy những đoạn khác có thể bắt đầu nối tiếpngay sau đó. Điều này cũng cho phép ta truy nhập vào bất kỳ đoạn nhớ ( 64Kbyte ) nào nằm trong toàn bộ không gian 1 Kbyte. 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 ghi16 bit khác đóng vai trò thanh ghi lệch ( Offset register ) mà ta sẽ nói đến sau. Cụthể, để xác đònh đòa chỉ vật lý 20 bit của một ô nhớ nào đó trong một đoạn bất kỳ.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ậtlý theo công thức sau: Đòachỉvậtlý=Thanhghiđoanx16+Thanhghilệch Trang : 4Việc dùng 2 thanh ghi để ghi nhớ thông tin về đòa chỉ thực chất để tạo ramộ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ủacác thanh ghi cụ thể bên trông CPU và ghi 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 đổinày do một bộ tạo đòa chỉ thực hiện (phần tử ∑ trên hình 3.1). 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 = F00H và IP = FFFOH thì CS:IP~FOOOHx16 + FFFOH = FOOOOH + FFFOH = FFFFOHĐòa chỉ FFFFOH chính là đòa chỉ khởi động của 8088 dấu ~ ở đây là đểchỉ sự tương ứng. Đòa chỉ các ô nhớ thuộc các đoạn khác cũng có thể tính đượctheo cách tương tự như vậy. Từ nay khi cần nói đến đến đòa chỉ của một ô nhớ tacó thể sử dụng cả đòa chỉ logic lẫn đòa chỉ vật lý vì bao giờ cũng tồn tại sự tươngứng giữa hai loại đòa chỉ này ( thông qua bộ tạo đòa chỉ ∑).Trước khi nói đến các thanh ghi khác ta nói thêm chút ít về tính đa trò củacác thanh ghi đoạn và thanh ghi lệch trong đòa chỉ logic ứng với một đòa chỉ vật lý.Điều này cũng nói lên tính linh hoạt của cơ chế segment offset trong việc đònhđòa chỉ của 8086/ 88. Nhìn vào giá trò cuối cùng của đòa chỉ vật lý ta thấy có thểtạo ra đòa chỉ đó từ nhiều giá trò khác nhau của thanh ghi đoạn và thanh ghi lệchVí dụ: Đòa chỉ vật lý 12345H có thể được tạo ra từ các giá trò: Thanh ghi đoạn Thanh ghi lệch 1000H 2345H 1200H 0345H 1004H 2305H 0300H E345H … …*Các thanh ghi đa năng trong khối EU có bốn thanh ghi đa năng 16 bit AX, BX, CX, DX. Điềuđặc biệt là khi cần chứa các dữ liệu 8 bit thì mỗi thanh ghi có thể tách ra thành haithanh 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ỗithanh 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ưngcũ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 gan cho những cái tên đặc biệt rất có ýnghóa.Cụ thể: • AX ( accumulator, acc ): thanh chứa. Các kết qủa của các thaotác thường được chứa ở đây ( kết quả của phép nhân, chia ). Nếu kết quả là 8 bitthì thanh ghi AL được coi là acc.• BX ( base ): thanh ghi cơ sở thường chứa đòa chỉ cơ sở của mộtbảng dùng trong lệnh XLAT.xx x x IDOTSAxZ x Px CCác cờ của bộ vi xử lý 8086X : Không được đònh nghóa Hình 3.3 Sơ đồ thanh ghi cờ của bộ vi xử lý 8086/88 Trang : 5• CX ( count ): bộ đếm. CX thường được dùng để chứa số lần lặptrong trường hợp các lệnh LOOP ( lặp ), còn CL thường cho ta số lần dòch hoặcquay 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áccủ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áccổng trong các lệnh vào/ ra dữ liệu trực tiếp.*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ácthanh 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ệchcho các đoạn tương ứng. Cụ thể: • IP: con trỏ lệnh ( Instruction pointer ). IP luôn trỏ vào lệnh tiếptheo sẽ được thực hiện nằm trong đoạn mã CS. Đòa chỉ đầy đủ của lệnh tiếp theonày ứng với CS:IP và được xác đònh theo cách đã nói ở trên.• BP: con trỏ cơ sở ( base pointer ). BP luôn trỏ vào một dữ liệu nằmtrong đoạn ngăn xếp SS. Đòa chỉ đầy đủ của một phần tử trong đoạn ngăn xếp ứngvới SS:BP và được xác đònh theo cách đã nói ở trên. • SP: con trỏ ngăn xếp ( stack pointer ). SP luôn trỏ vào đỉnh hiệnthờ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ớiSS:SP và được xác đònh theo cách đã nói ở trên.• SI: chỉ số gốc hay nguồn ( source index ). 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 theocách đã nói ở trên.• DI: chỉ số đích ( destination index ). DI chỉ vào dữ liệu trong đoạndữ 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 thoa 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ủaphần tử thuộc chuỗi gốc. *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ặcmộ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áclệ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 ghicờ 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ờ ( hình3.3 ).Các cờ cụ thể Trang : 6• C hoặc CF ( carry flag ): cờ nhớ. CF = 1 khi có nhớ hoặc mïn từMSSP.• P hoặc PF ( parity flag ): cờ parity. PF phản ánh tính chẵn lẻ( parity ) của tổng số bit 1 có trong kết quả. Cờ PF =1 khi tổng số bit trong kết quảlà chẵn ( even parity, parity chẵn ). đây ta tạm dùng parity dạng nguyên gốc đểtránh sự lủng củng khi phải dòch cụm từ “ even parity “ thành tính chẵn lẻ chẵnhoặc “ odd party “ thành tính chẵn lẻ lẻ.• A hoặc AF ( auxilialyry carry flag ): cờ nhớ phụ rất có ý nghóa khita 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 ( 4bit 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ả = 0.• S hoặc SF ( sign flag ): cờ dấu. SF = 1 khi kết quả âm.• O hoặc OF ( over flow flag ): cò tràn. OF = 1 khi kết quả là mộtsố bù 2 vượt qua ngoài giới hạn biểu diễn dành cho nó.Trên đây là 6 bit cờ trạng thái phản ánh các trạng thái khác nhau của kếtsau một thao tác nào đó, trong đó 5 bit cờ đầu thuộc byte thấp của thanh cờ là cáccờ giống như của bộ vi xử lý 8 bit 8085 của Intel. Chúng được lặp hoặc xoá tuỳtheo các điều kiện cụ thể sau các thao tác của ALU. Ngoài ra, bộ vi xử lý 8088còn có các cờ điều khiển sau đây ( các cờ này được lập hoặc xoá bằng các lệnhriêng ): • 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 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 ( che được ) được tác động.• D hoặc DF ( direction flag ): cờ hướng. DF = 1 khi CPU làm việcvới chuổi ký tự theo thứ tự từ phải sang trái ( vì vậy D chính là cờ lùi )Ý nghóa của các cờ đã khá rõ ràng. Riêng cờ tràn cần phải làm rõ hơn đểta hiểu được bản chất và cơ chế làm việc của nó. Cờ tràn thường được dùng đếnkhi ta làm việc với số bù 2 có dấu. Để cho việc giải thích được đơn giản, đầu tiêngiả thiết ta làm việc với số bù 2 dài 8 bit, kết quả để ở AL ( xem hình 3.4 ). GọiC67 là cờ nhớ từ bit 6 ( B6 ) lên bit 7 ( B7 ), trong đó B7 là MSB và cũng chính làbit dấu ( SF ) của AL. Ta có thể chứng minh được rằng quan hệ giữa cờ OF với cáccờ CF và C67 tuân theo phương trình sau: OF = CF ⊕ C67.Nghóa là khi thực hiện các phép toán với số bù 2 có dấu, hiện tượng trànsẽ xảy ra ( cờ OF = 1 ) nếu có nhớ từ MSB ( tất là SF ) sang CF nhưng lại không cónhớ vào chính nó ( SF ) hoặc ngược lại. Điều này có thể tổng quát hoá cho cáctrường hợp làm việc với số bù 2 có dấu với độ dài 16/32 bit.Hình 3.4 Sơ đồ thanh ghi AL và các cờ CF , C b7 b6CFC67ALbo67 Trang : 71.2 8086 và 8088Chế độ MIN VI6AI5AI6/S3AI7/S4AI8/S5AI9/S6SS0MN/MNRDHOLDWRIO/MDT7RDENAREININIISTREADYRESETChế độ MAX BIH(RQ/GT0)(RQ/GH)(LOCK)(S2)(S1)(S0)(QS0)(QS1)12345678910111213141516171819204039383736353433323130292827262524232221 P 8088[8086]GNDA14A13A12A11A10A9A8AD7AD6AD5AD4AD3AD2AD1AD0NMIINRTCLKGNDAD14AD13AD12AD11AD10AD00AD91AD81Hình 35 . Sơ đồ chân của CPU 8088[8086]Trước khi kết thúc phần mô tả cấu trúc của bộ vi xử lý để đi vào giớithiêu tập lệnh của 8088 ta nói qua một chút về sự giống nhau vàkhác nhau giữa8088 và 8086 là bộ vi xử lý 16 bit hoàn chỉnh, còn 8088 là bộ vi xử lý với 16 bit dữliệu bên trong ( giống như 8086 ), nhưng khi ra ngoài bus dữ liệu của nó chỉ còn 8bit. Cấu trúc bên trong của 8088 và 8086 giống nhau về cơ bản, ngoài trừ haiđiểm. Điểm khác nhau đầu tiên là ở độ dài bộ nhớ đệm lệnh ( hàng đợi lệnh ) độdài này ở 8088 là 4 byte còn ở 8086 là 6 byte; điều này sẽ có ảnh hưởng ít nhiềuđến sự khác biệt về sự tốc độ xử lý của hai bộ CPU. Điểm khác nhau thứ hai là ởkích thước của bus dữ liệu: ở 8088 là 8 bit còn ở 8086 là 16 bit ( trong khi ALU vàcác thanh ghi của hai bộ CPU vẫn có độ dài như nhau. Điều này có ảnh hưởngnhiều đến công năng ( Perfomance ) và giá thành của hệ thống xây dựng trên cơsở các bộ vi xử lý này. Đối với 8086 do bus dữ liệu là 16 bit nó có thể đọc/ghiđược một từ nằm ở hai ô nhớ thẳng hàng ( một từ trong bộ nhớ được coi là xếp Trang : 8thẳng hàng khi ở đòa chỉ chẵn làbyte thấp, ở đòa chỉ lẻ là byte cao ) trong một chukỳ đọc/ghi: còn ở 8088 do bus dữ liệu chỉ có 8 bit nên đọc/ghi một từ nằm ở hai ônhớ thẳng hàng ( nằm liên tiếp như trên ) nó phải thực hiện trong hai chu kỳđọc/ghi. Bù lại nhược điểm về tốc độ, 8088 có giá rẻ vàdùng để tạo ra các hệthống với giá phải chăng vì nó dể phối ghép với các thiết bò ngoại vi 8 bit đangthònh hành lúc đó. Điều khác nhau nữa tất yếu phải xảy ra là sự khác nhau trongviệc bố trí các chân ở hai vi mạch như trên hình 3.5 ( xem thêm phần giới thiệu cụthể các tín hiệu tại các chân ở chương V ).Mặc dù có những điểm khác nhau đã nêu, nhưng vì những điểm giốngnhau là rất cơ bản và vì hai bộ vi xử lý có tập lệnh giống nhau nên về quan điểmlập trình thì chúng là tương đương2.Cách mã hoá lệnh củabộ vi xử lý 8088Lệnh củabộ vi xử lý được ghi bằng các ký tự dưới dạng gợi nhớ( memonic ) để người sử dụng để nhận biết. Đối với bản thân bộ vi xử lý thì lệnhcho nó được mã hoá dưới dạng các số 0 và 1 (còn gọi là mã máy ) vì đó là dạngbiểu diễn thông tin duy nhất mà máy hiểu được. Vì lệnh do bộ vi xử lý được chodưới dạng mã nên sau khi nhận lệnh., bộ vi xử lý phải thực hiện việc giải mã lệnhrồi sau đó mới thực hiện lênh. Việc hiểu rõ bản chất cách ghi lệnh bằng số hệ 2cho bộ vi xử lý sẽ có lợi khi ta cần dòch “ bằng tay “. Một lệnh gợi nhớ khi làmviệc với các “ kit “ vi xử lý ( tuy rằng việc này ít khi xảy ra vì ta thường làm việcvới các hệ được trang bò chương trình dòch hợp ngữ ).Một lệnh có thể có độ dài một vài byte tuỳ theo bộ vi xử lý. Giả thiết mộtbộ vi xử lý nào đó dùng 1 byte để chứa các mã lệnh ( opcode ) của nó. Ta có thểtính được số lệnh lớn nhất mà 1 byte này có thể mã hoá được là 256 lệnh. Trongthực tế việc ghi lệnh không phải hoàn toàn đơn giản như vậy. Việc mã hoá lệnhcho bộ vi xử lý là rất phức tạp và bò chi phối bởi nhiều yếu tố khác nữa. Đối với bộ vi xử lý 8088 một lệnh có thể có độ dài từ 1 đến 6 byte. Ta sẽchỉ lấy trường hợp lệnh MOV để giải thích cách ghi lệnh nói chung của 8088.Lệnh MOV đích, gốc dùng để nguyển dữ liệu giữa 2 thanh ghi hoặc giữa 2ô nhớ và thanh ghi. Chỉ nguyên với các thanh ghi của 8088, nếu ta lần lượt đặt cácthanh ghi vào các vò trí toán hạng đích và toán hạng gốc ta thấy đã phải cần tớihàng trăm mà lệnh khác nhau để mã hoá tổ hợp các lệnh này. Hình 3.6 biểu diễn dạng thức các byte dùng để mã hoá lệnh MOV. Từ đâyta thấy rằng để mã hoá lệnh MOV ta phải cần ít nhất là 2 byte, trong đó 6 bit củabyte đầu dùng để chứa mã lệnh. Đố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 đạon thì điều này lại khác.Bit W dùng để chỉ ra rằng 1 byte (W = 0 ) hoặc 1 từ ( W = 1 ) sẽ đượcchuyển. Trang : 91 0 001 0OpcodeD Wmod REGM/RByte 1Byte 2Disp tDisp HByte 4Byte 3HoặcDi chuyển trực tiếp phần thấpDi chuyển trực tiếp phần caoHình 3.6 Dạng thức Byte mã lệnh của lệnh MOVTrong các thao tác chuyển dữ liệu, một toán hạng luôn bắt buộc phải làthanh ghi. Bộ vi xử lý dùng 2 hoặc 3 bit để mã hoá các thanh ghi trong CPU nhưsau:Thanh ghi MãW = 1AXPXCXDXSPDIBPSIW = 0ALBLCLDLAHBHCHDH000011001010100111101110Thanh ghi đoạn MãCSDSESSS01110010 Bit D dùng để chỉ hướng đi của dữ liệu. D = 1 thì dữ liệu đi đến thanh ghicho bởi b bit của REG.2 bit MOD ( chế độ ) cùng với 3 bit R/M ( thanh ghi/bộ nhớ ) tạo ra 5 bitdùng để chỉ ra chế độ đòa chỉ cho các toán hạng của lệnh ( có thể hiểu chế độ đòachỉ là cách tìm ra đòa chỉ của toán hạng, xem thêm phần sau của chương này để rõhơn về chế độ đòa chỉ.Bảng 3.1 cho ta thấy cách mã hoá các chế độ đòa chỉ ( cách tìm ra các toánhạng bằng các bit này ). MODR/M 00 01 10 11W=0W=1000 [BX]+[8] [BX]+[SI]+d8 [BX]+[SI]+d16 ALAX001 [BX]+[DI] [BX]+[DI]+d8 [BX]+[DI]+d16 CLCX010 [BP]+[SI] [BP]+[SI]+d8 [BP]+[SI]+d16 DLDX011 [BP]+[DI] [BP]+[DI]+d8 [BP]+[DI]+d16 BL Trang : 10BX100 [SI] [SI]+d8 [SI]+d16 AHSP101 [DI] [DI]+d8 [DI] +d16 CHBP110 d16(Đòa chỉ trựctiếp)[BP]+d8 [BP]+d16 DHSI111 [BX] [BX]+d8 [BX]+d16 BHDI chế độ bộ nhớchế độ thanh ghiGhi chú : - disp , 8bit ,d16: disp , 16bit- Các giá trò cho trong các cột 2,3,4 (ứng với MOD=00,01,10) là các đòa chỉ hiệu dụng (EA) sẽ được cộng vớiDS để tạo ra đòa chỉ vật lý (riêng BP phải được cộng vớiSP ) Trong các ví dụ sau đây ta sẽ dùng các kiến thức nêu trên để mã hoá mộtvài lệnh MOV.1111 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1MOV CL ,[BX]OpcodeChuyển tới thanh ghiChuyển 1 bytemã hoá CL[ BX]1111 000 001 0 10 110 00MOV OF3H [SI] , CL0 1 11 1 0 10 1[SI]CLdS = F3HChuyển từ thanh ghi 1 Byte3.Các chế độ đòa chỉ của bộ vi xử lý 8088Chế độ đòa chỉ (addressing mode ) là cách để CPU tìm thấy toán hạng chocác lệnh của nó khi hoạt động. Một bộ vi xử lý có thể có nhiều chế độ đòa chỉ. Cácchế độ đòa chỉ này được xác đònh ngay từ khi chế tạo ra bộ bi xử lý và sau nàykhông thể thay đổi được. Bộ vi xử lý 8088 và cả họ 80x86 nói chung đều có 7 chếđộ đòa chỉ sau: Trang : 111. Chế độ đòa chỉ thanh gi ( register addressing mode ).2. Chế độ đòa chỉ tức thì ( immediate addressing mode ).3. Chế độ đòa chỉ trực tiếp ( direct addressing mode ).4. Chế độ đòa chỉ gián tiếp qua thanh ghi ( register indirect addressingmode ).5. Chế độ đòa chỉ tương đối cơ sở ( based indexed relative addressingmode ).6. Chế độ đòa chỉ tương đối chỉ số ( indexed relative addressingmode ).7. Chế độ đòa chỉ tương đối chỉ số cơ sở ( based indexed relativeaddressing mode ).Các chế độ đòa chỉ này sẽ được giải thích thông qua các chế độ đòa chỉcủalệnh MOV và lệnh ADD.*chế độ đòa chỉ thanh ghiTrong chế độ đòa chỉ này người ta dùng các thanh ghi bên trong CPU như làcác toán hạng để chứa dữ liệu cần thao tác. Vì vậy khi thực hiện lệnh có thể đạttốc độ truy nhập cao hon so với các lệnh có truy nhập đên bộ nhớ. Ví dụ: MOV BX, DX ; chuyển nội dung DX vào BX.MOV DS,AX ; chuyển nội dung AX vào DXADD AL,DL ; cộng nội dung AL và DL rồi đưa vào*Chế độ đòa chỉ tức thìtrong chế độ đòa chỉ này toán hạng đích là một thanh ghi hay một ô nhớ,còn toán hạng nguồn là một hằng số và ta có thể tìm thấy toán hạng này ở ngaysau mã lệnh ( chính vì vậy chế độ đòa chỉ này có tên là chế độ đòa chỉ tức thì ). Tacó thể dùng chế độ đòa chỉ này để nạp dữ liệu cần thao tác vào bất kỳ thanh ghinào ( trừ các thanh ghi đoạn và thanh cờ ) hoặc vào bất kỳ ô nhớ nào trong đoạndữ liệu DS.Ví dụ:MOV CL, 100 ; chuyển 100 vào CL.MOV AX, OFFOH ; chuyển OFFOH vào AX để rồi đưaMOV DS, AX ; vào DS ( vì không thể chuyển ; trực tiếp vào thanh ghi đoạn )MOV ( BX ), 10 ; chỉ DS:BX.Trong ví dụ cuối ta đã dùng chế độ đòa chỉ gián tiếp qua thanh ghi để chỉ raô nhớ ( toán hạng đích ) sẽ nhận dữ liệu ở chế độ đòa chỉ tức thì ( toán hạngnguồn ). Tại đây ( BX ) có nghóa là ô nhớ có đòa chỉ DS:BX.*Chế độ đòa chỉ trực tiếpTrong chế độ đòa chỉ này một toán hạng chứa đòa chỉ lệnh của ô nhớ dùngchứa dữ liệu còn toán hạng kia chỉ có thể là thanh ghi mà không được là ô nhớ. Nếu so sánh với chế độ đòa chỉ tức thì ta thấy ở đây ngay sau mã lệnhkhông phải là toán hạng mà là đòa chỉ lệch của toán hạng. Xét về phương diện đòachỉ thì đó là đòa chỉ trực tiếp.Ví dụ: Trang : 12MOV AL, ( 1234H ) ; chuuyển nội dung ô nhớ DS:1234 ; vào AL.MOV ( 4320H ), CX ; chuyển nội dung CX vào 2 ô nhớ ; liên tiếp DS:4320 và DS:4321*Chế độ gián tiếp qua thanh ghiTrong chế độ đòa chỉ này một toán hạng là một thanh ghi được sử dụng đểchứa đòa chỉ lệch của ô nhớ chứa dữ liệu, còn toán hạng kia chỉ có thể là thanh ghimà không được là ô nhớ ( 8088 không cho phép quy chiếu bộ nhớ 2 lần đối vớimột lệnh ).Ví dụ:MOV AL, ( BX ) ; chuyển nội dung ô nhớ có đòa ; chỉ DS:BX vào AL.MOV ( SI ), CL ; chuyển nội dung CL vào ô nhớ ; có đòa chỉ DS:SI.MOV ( DI ), AX ; chuyển nội dung AX vào 2 ô nhớ ; liên tiếp có đòa chỉ DS:DI và ; DS: ( DI + 1 ).*Chế độ đòa chỉ tương đối cơ sở Trong chế độ đòa chỉ này các thanh ghi cơ sở như BX và BP và các hằng sốbiểu diễn các giá trò dòch chuyển ( displacement values ) được dùng để tính đòa chỉhiệu dụng của toán hạng trong các vùng nhớ DS và SS. Sự có mặt của các giá tròdòch chuyển xác đònh tính tương đối ( so với cơ sở ) của đòa chỉ.Ví dụ:MOV CX, ( BX ) +10 ; chuyển nội dung 2 ô nhớ liên ; tiếp có đòa chỉ DS: ( BX + 10 ) và ; DS: ( BX+10 ) vào CX.MOV CX, ( BX+10 ) ; một cách viết khác của lệnh trên .MOV CX, 10 ( BX ) ; một cách viết khác của lệnh đầu.MOV AL, ( BP ) +5 ; chuyển nội dung ô nhớ SS: ( BP+5 ) ; vào AL.ADD AL, Table ( BX ) ; cộng AL với nội dung ô nhớ do ; BX chỉ ra trong bảng table ; ( bảng này nằm trong DS ), kết ; quả dựa vào AL.Nhân đây cần làm rõ một số thuật ngữ hay dùng thông qua các ví dụ trên.• 10.5.Table gọi là các dòch chuyển của các toán hạng tương ứng. 10 và5 là các giá trò cụ thể. Table là tên mảng biểu diễn kiểu dòch chuyển của mảng( phần tử đầu tiên ) so với đòa chỉ đầu của đoạn dữ liệu DS.• ( BX+10) hoặc ( BJP+5 ) gọi là đòa chỉ hiệu dụng (effective address.EA.theo cách gọi của Intel ).• DS: ( BX+10 ) hoặc SS: ( BP+5 ) chính là logic tương ứng với một đòachỉ vật lý. Trang : 13• Theo cách đònh nghóa này thì đòa chỉ hiệu dụng của một phần tử thứBX nào đó ( kể từ 0 ) trong mảng Table ( BX ) thuộc đoạn DS là EA = Table+BXvà của phần tử đầu tiên là EA = Table.*Chế độ đòa chỉ tương đối chỉ số cơ sởKết hợp hai chế độ đòa chỉ chỉ số và cơ sở ta có chế độ đòa chỉ chỉ số cơsở. Trong chế độ đòa chỉ này ta dùng cả thanh ghi cơ sở lẫn thanh ghi chỉ số để tínhđòa chỉ của toán hạng. Nếu ta dùng thêm cả thành phần biểu diển sự dòch chuyểncủa đòa chỉ thì ta có chế độ đòa chỉ phức hợp nhất: chế độ đòa chỉ tương đối chỉ sốcơ sở. Ta có thể thấy chế độ đòa chỉ này rất phù hợp cho việc dòa chỉ õ hoá cácmảng hai chiềuVí dụ:MOV AX, [ BX ] [SI ]+8 ; chuyển nội dung 2 ô nhớ ; liên tiếp có đòa chỉ ; DS:(BX+SI+8 ) và ; DS:(BX+SI+9 ) vào AXMOV AX, [BX+SI+8] ; một cách viết khác của lệnh trên MOV CL, [BP+DI+5] ; chuyển nội dung ô nhớ ; SS:( BP+DI+5 ) vào CL.*Tổng kết các chế độ đòa chỉCác chế đòa chỉ đã trình bày ở trên có thể tóm tắt lại trong bảng 3.2.Một hình thức tổng kết khác về của chế độ đòa chỉ của 8086/88 được biểudiễn trrrn hình 3.7*Phương pháp bỏ ngầm đònh thanh ghi đoạn ( segmentoverride )Như trong các phần trước đã nói, các thanh ghi đoạn và thanh ghi lệchđược ngầm đònh đi kèm với nhau từng cặp dùng để đòa chỉhoá các toán hạng teongcác vùng khác nhau vủa bộ nhỡ.Bảng 3.3 chỉ ra các khả năng cặp đôi ngầm đònhcủa cácthan ghi đoạn và thanh ghi lệch thưồng dung. Vì tính ngầm đònh nàynểntong các lệnh ta chỉ cần viểta cấctnh thanh ghi lệch là đủ cơ sở để tính ra đượcđia chỉ của toàn hạng.Tuy nhiên, ngoài các tổ hợp ngầm đònh đã kể, 8088 còn cho phép ta làmviệc với các tổ hợp ngầm đònh đã kể, 8088 còn cho phép ta làm việc với các tổhợp khác của các thanh ghi đoạn và thanh ghi lệch. Muốn loại vỏ các tổ hợp ngầmđònh nói trên, trung khi viết lệnh ta phải ghi rõ thanh ghi đoạn sẽ dùng để tính đòachỉ và kèm thêm dấu 2 chấm trước thanh ghi lệch. Cụm ký hiệu này goik là cụmtiếp đầu để lại bỏ thanh ghi đoạn ngầm đinhj (segmnent override prefix) và để dạtđược ivệc loại bỏ này chỉ cần ghi rõ thanh ghi đoạn.Bảng 3.2 : Tóm tắt các chế độ đòa chỉ Chế độ đòa chỉ Toán hạng Thanh ghi đoạn ngầmđònh Thanh ghi RegTức thì DataTrực tiếp [offset] DS Trang : 14Gián tiếp qua thanh ghi [BX][SI][DI]DSDSDSTương đối cơ sở [BX]+disp[BP] +DISPDSSSTương đối chỉ số [DI]+Disp[SI]+ DISPDSDSTương đối chỉ số cơ sở [BX]+[DI]+DISP[BX]+[SI]+DISP[BP]+[DI]+DISP[BP]+[SI]+DISPDSDSSSSS(Ghi chú : Reg : thanh ghi ; Data : dữ liệu tức thì ; disp : dòch chuyển )Bảng 3.3 : Các cặp thanh ghi đoạn và thanh ghi lệch ngầm đònh Thanh ghi đoạn CS DS ES SSThanh ghi lệch IP SI,DI,BX DI SP,BPVí dụ: Trong lệnh chuyển dữ liệu thỉ đòa chỉ vật lý của toán hạng để chuyển vàothanh ghi AL, tương ứng với DS:BX, vì DS sà đoạn ngầm đònh cuarvùng nhớchứatoán hạng do BX chỉ ra.Nếu ta muốn thay đổi,không lấy toán hạng trong đoạndữ liệu DS ,mà lại lấy toán hạng traong đoạn dữ liệu phụ ES dể đưa vào AL,thì taphải viết lại lệnh trên thành MOV AL.ES:[BX]Trong đó ta đã dùng cụm tiếp đàu ES : để loại bỏ thanh ghi đoạn ngầmđònh DS và để chỉ rõ thanh ghi đoạn mới dùng trong lệnh nayf bây giờ là ES . Trang : 15Dòch chuyển Đòa chỉ vật lýCSx16DSx16SSx16ESx16BXBPDISIBXBPSIDIĐòa chỉ hiệu dụng hoặchoặchoặchoặchoặchoặchoặchoặcChế độ cơ sở hoặc chỉ sốChế độ chỉ số cơ sởHình 3.7 : một hình thức khác tổng kết các chế độ đòa chỉ của 80884. Mô tả tập lệnhcủa bộ vi xử lý 8088. Có nhiều cánh trình bày tập lệnh của bộ vi xử lý:Trình bày cac lệnh chocác nhóm hoặc theo thứ tự ABC .Ta sẻ chọn cách làm thứ 2 để sau này dễ tìmkiếm cac lệnh cần tra cứu cụ thể.Trong khi nói tới các lệnh ở dạng gợi nhớ tacũngmô tả ngắn gon luôn từng lệnh và tác động (nếu có) của lệnh tới cac cờ.Để chocác diển giải dể đọc ta quy đònh kí hiệu AL được hiểu là thanh ghi AL hoặc là nộidung của AL.Trong khi ghi lệnh ,dấu[ X] nên được hiểu như là một ki hiệu củaIntel để ghi lệnh.Không nên hiểu là ‘nội dung’ của X ,còn {XX:YY} dùng để chỉnội dung ô nhớ tại đòa chỉ XX:YY hoặc {SP} dùng để chỉ ô nhớ của ngăn xếp cóđòa chỉ do nội dung của thanh ghi con trỏ ngăn xếp SP chỉ ra .AAA _ASCII Adjust after Addition (Chỉnh sau khi cộng hai số ởdạng ASCII)Dữ liệu truyền từ các thiết bò đầu cuối đến máy tính thường ở dưới dạngmã ASCII .Khi dã truyền đi các số dưới dạng ASCII roòi,đôi khi ta muốn cộngluôn các số đó.Bộ vi xử lý 8088 cho phep ta làm điều này với điều kiện phải chỉnhlại kết quả có trong AL,bằng lệnh AAA để thu được kết quả là số BCD không gói.Cập nhật : AF , CFKhông xác đònh: OF , PF ,SF ,ZFVí dụ:Ta có 2 số dưới dạng mã ASCII là 30H và 39H ứng với ‘ 0 ‘ và ‘ 9 ‘ Trang : 16Nếu cộng hai số ở dạng mã lại ta được số 69H.Số náy không có ý nghóagì vì nó không phải la số BCD đúng .Ta sẻ thu được số BCD không gói nếu dùngthêm lệnh AAA . ;AL = 0011 0000B = 30H = ‘0’, ;BL = 0011 1001B = 39H = ‘ 9’,ADD AL , BL ; thu được AL = 0110 1001B = 69H , Kết quả sai.AAA ; thu được AL = 0000 1001B = 9, kết quả đúng.OR AL ,30H ; thu được AL = 39H = ‘9’ đê truyền kết quả trở lại thiếtbò đầu cuối .AAD_ ASCII Adjust before Division (Chỉnh trước khi chia 2 số ơdạng ASCII )Lệnh này đổi 2 số BCD khônbg gói ở AH và AL sang số hệ 2 tươngđương để tại Al.Viêc này phải thưc hiện trước khi làm phép chia một số BCDkhông gói( gồm 2 chữ số ) để trong AX cho 1 số BCD không gói khác.Kết quả vàsố dư cũng là cac số BCD không gói.Không xác đònh :tất cả các cờ .Ví dụ: ;AX = 0605H là số BCD không gói của 65 ;(số bò chia) ;BL = 08H la số BCD không gói ;(số chia).AAD ;sau khi chỉnh AX = 0041 = 41HDIV BL;sau khi chia đươc thương AL = 08 ;số dư ở AH = 1 là số BCD không gói ,AAM_ASCII Adjust After Mult iplication (Chỉnh sau khi nhân 2số ở dạng ASCII ) Lệnh này dung để đổi 1 số hệ 2,là tích của 2 số BCD không gói ,có trongAL sang số BCD không gói để tại AX .Cập nhật :PF , SF ,ZP.Không xác đònh: AF ,CF ,OF Ví dụ: Sau khi nhân 2 số 5 và 9 ở dang ASCII .Ta đổi kết quả sang dạng BCDkhông gói bằng lệnh AAM và sau đó đổi tiếp thành mã ASCII để truyền tiếp ;AL = 0011 0101B = 35H = ‘5’ , ;BL = 0011 1001B = 39H = ‘9’ , MUL BL; thu được AX = 002DH = 45, AAM; thu được AX = 0405H, mã BCD ;không nen của 45. OR AX ,3030H; thu được AX = 3435H, mã ASCII ;cho 45 để truyền kết quả ; trở lại thiết bò đầu cuối.AAS-ASCH Adjust after Subtraction ( chỉnh sau khi trừ 2 số ở dạngASCH ) Trang : 17Lệnh này dùng để đổi một số hệ hai là hiệu của 2 số BCD không gói, cóở AL. sang số BCD không gói.Cập nhập: AF, CF.Không xác đònh: OF, PF, SF, ZP.Ví dụ:a) ; BL = 0011 0101B = 35 = ‘5’, ; AL = 0011 1001B = 39H = ‘9’, ; ASCII 9 – ASCII 5:SUB AL, BL ; thu được AL = 04H = 4,AAC ; thu được AL = 04H, mã BCD không ; gói của 4.OR AL, 30H ; thu được AL = 34H, mã ASCII cho 4 ; để truyển kết qủa trở lại thiết bò ; đầu cuối.b) ; AL = 0011 0101B = 35H = ‘5’,; BL = 0011 1001B = 39H = ‘ 9’, ; ASCII 5- ASCII 9:SUB AL, BL ; thu được AL = FCH = -4, CF = 1,AAS ; thu được AL = 04H, mã BCD không ; gói của 4, CF = 1 ( có thể dùng cho các ; phép trừ nhiều chữ số )ADC-Add With Carry ( cọng có nhớ ) Viết lệnh: ADC Đích, Gốc.Mô tả: Đích Đích + Gốc + CFTrong đó tớn hạng đích và gốc có thể tìm đwocj theo các chế độ đòa chỉkhác nhau. Nhưng phải chứa dữ liệu có cùng độ dài và không được phép đồng thờilà 2 ô nhớ và cũng không được là thanh ghi đoạn. Điều hạn chế này cũng áp dụngcho các lệnh khác có ngữ pháp tương tự.Cập nhật: AF, CF, OF, PF, SP, ZP.Ví dụ: Các ví dụ sau đây có thể đại diện chó các chế độ đòa chỉ có thể cótrong lệnh cộng này cũng như một số các lệnh khác vứoi ngữ pháp tương tự.ADD-Add ( cộng 2 toán hạng).Viết lệnh: ADD Đích, Gốc.Mô tả: Đích - Đích + Gốc.Tróng đó toán hạng đích và gốc có thể tìm được theo các chế độ đòa chỉkhác nhau. Nhưng phải chứa dữ liệu có cùng độ dài và không được phép đồng thờilà 2 ô nhó và cũng không được là thanh ghi đoạn. Có thể tham khảo các ví dụ củalệnh ADC.Cập nhật: AF, CF, PF, SF, ZP/ AND-And Corresponding Bits of Two Operands ( Và 2 toán hạng )Viết lệnh: AND Đích, GốcMô tả: Đích - Đích, Gốc.Trong đó toán hạng đích và gốc có thể tìm được thoe các chế độ đòa chỉkhác nhau. Nhưng phải chứa dữ liệu cùng độ dài và không được phép đồng thời là Trang : 182 ô nhớ và cũng không được là thanh ghi đoạn. Phép AND thường dùng để che đi/giữ lại một vài bit nào đó của một toán hạng bằng cách nhân logic toán hạng đóvới toán hạng tức thì có các bit 0/1 ở các chỗ cần che đi/giữ nguyên tương ứng( toán hạng tức thì lúc này còn được gọi là mặt nạ ).Xoá: CF, OF.Cập nhật: PF, SF, ZP, PF chỉ có nghóa khi toán hạng là 8 bit.Không xác đònh: À.Ví dụ: AND AL, BL ; AL , AL BL theo từng bit. AND OFH ; che 4 bit cao của BL.CALL-Call o Proceduce ( Gọi chương trình con )Mô tả:Lệnh này dùng để chuyển hoạt động của bộ vi xử lý từ chương trình chính( CTC ) sang chương trình con ( ctc ). Nếu ctc ở trong cùng một đoạn mã với CTCthì ta có gọi gần ( near call ). Nếu CTC và ctc nằm ở hai đoạn mã khác nhau thì tracó gọi xa ( far call ). Gọi gần và gọi xa khác nhau về cách tạo ra đòa chỉ trở về( return address). Đòa chỉ trở về là đòa chỉ của lệnh tiép ngay sau lệnh Call. Khi gọigần thì chỉ cần các IP của đòa chỉ trở về ( vì CS không đổi ). Khi gọi xa thì phải cấtcả CS và IP của đòa chỉ trở về. Đòa chỉ trở về được tự động cất tại ngăn xếp khi bắtđầu thực hiện lệnh gọi và được tự động lấy ra khi gặp lệnh RET ( trở về CTC từctc ) tại cuối ctc.Viết lệnh: Sau đây là ví dụ các dạng khác nhau của các dạng khác nhaucủa các lệnh gọi ctc và cách tính đòa chỉ của ctc:CALL Multiple: Gọi ctc có tên là Multiple trong cùng đoạn mã vớiCTC, ctc này phải nằm trong giới hạn đích chuyển-32Kbyte ( dòch về phái đòa chỉthấp ) hoặc ( 32K-1) byte ( dòch về phía đòa chỉ cao ) so với lệnh tiếp theo ngay saulệnh Call. Sau khi cất IP cũ ( đòa chỉ trở về ) vào ngăng xếp . IP mới được tính: IP–IP + Dòch chuyển.CALL Divi: Gọi ctc có tên Divi ở đạon mã khác. Trong chương trìnhhợp ngữ Divi phải được khai báo là một ctc ở xa: Divi Proc FarĐại chỉ của ctc là đại chỉ CS:IP cảu Divi.CALL WORD PTR [ BX ]: Gọi ctc nằm trong cùng đạon mã, ctc cóđòa chỉ dòch chuyển ( tính từ lệnh tiếp ngay sau lệnh gọi tới lệnh đầu tiên của ctc )chứa trong 2 ô nhớ do BX và BX+1 chỉ ra trong đoạn DS. Đòa chỉ lệch này sẽ đưavào IP ( SI, DI có thể dùng thay chỗ của BX ).CALL DWORD PTR [ BX ]: Gọi ctc không nằm trongcùng một đoạnmã, ctc có đòa chỉ CS:IP, giá trò gần cho IP và CS chứa trong 4 ô nhơ do BX và BX+1 (cho IP) và BX+2 và BX+3 ( cho CS chỉ ra trong đoạn DS ( SI, DI có thể dùngthay chỗ của BX ).CBW-Convert a Byte to a Word ( Chuyển byte thành từ )Lệnh này mở rộng bit dấu của AL sang 8 bit của AH, AH lúc này đượcgọi là phần mở rộng dấu cuả AL. Ta dùng CBW để mở rộng dấu cho số có dấunằm trong AL trước khi muốn chia nó cho một số có dấu 8 bit khác bằng lệnh IDIV Trang : 19( lệnh chia các số có dấu ), hoặc trước khi muốn nhân nó với một số có dấu 16 bitkhác bằng lệnh IMUL, ( lệnh nhân các số có dấu ).Lệnh này không tác động đến các cờ. Ví dụ: Nếu AL = 80 thì sau lệnh chuyển ta có AX = PF80H.CLC-Clear the Carry Flag ( xoá cờ nhớ )Mô tả: CF – 0.Không tác độn đến các cờ khác.CLD – Clear the Direction Flag ( xoá cờ hướng ).Mô tả: DF – 0.Lệnh này đònh hướng thao tác theo chiều triến chó các lệnh liên quan đếnchuỗi. Các thanh ghi liên quan là SI và DI sẽ được tự động tăng khi làm việc xongvới một phần tử của chuỗi.Không tác động đến các cờ khác.CLI – Clear the Interrupt Flag ( xóa cờ cho phép ngắt ).Mô tả: IF – 0.Lệnh này xoá cờ cho phép ngắt. Các yếu tố ngắt che được sẽ bò che.Không tác động đến các cờ khác.CMC – Complement the Carry Flag ( Đảo cờ nhớ ).Mô tả: CF – CF.Cập nhật: CFKhông tác động đến các cờ khác.CMP-Compare Byte or Word *~( so sánh 2 byte hay 2 từ ).Viết lệnh: CMP Đích, Gốc.Mô tả: Đích – Gốc.Trong đó toán hạng đích và gốc có thể tìm được theo các chế độ đòa chỉkhác nhau. Nhưng phải chứa dữ liệu có cùng độ dài và không được phép đồng thờilà 2 ô nhớ.Lệnh này chỉ tạo các cờ, không lưu kết quả so sanh, sau khi so sanh cáctoán hạng không bò thay đổi. Lệnh này thường được dùng để tạo cờ cho các lệnhnhảy có điều kiện ( nhảy theo cờ ).Các cờ chính theo quan hệ đích và gốc khi so sánh 2 số không dấu: CF 2F Đích = Gốc 0 1 Đích > Gốc 0 1 Đích > Gốc 1 0Cập nhật: AF, CF, OF, PF, SF, ZP.CMPS/CMPSB/CMPSW-Compare String Bytes or String Word( so sánh 2 chuổi byte hay 2 chuổi từ ).Viết lệnh: CMPS Chuổi đích, chuổi gốc. CMPSB CMPSW.Mô tả: Chuổiđích – Chuổigốc.Lệnh này so sánh từng phần tử ( byte hay từ ) của 2 xâu có các phần tửcùng loại. Lệnh chỉ tạo các cờ, không lưu kết quả so sánh, sau khi so sánh các toán Trang : 20hạng không bò thay đổi. Trong lệnh này ngầm đònh các thanh ghi với các chứcnăng:+DS:SI là đòa chỉ của phần tử so sánh trong chuỗi gốc.+ES:DI là đòa chỉ của phần tử so sánh trongchuỗi đích Ta sẽ giải thích cụ thể các trường hợp dùng các dạng lệnh trên. Giải thíchnày cũng có thể áp dụng cho cáclện có dạng thức lện hoặc cấu trúc ngữ pháp ươngtự. MOVS, STOS, LODS, SCAS.Có 2 cách để chỉ ra một chuỗi là chuỗi byte hoặc chuỗi từ. Cáchđầu tiên là ta khai rõ bằng ten ngay từ đầu chuỗi nguồn và chuỗi đích làloại gì. Sau đó ta dùng lệnh COMPS để thao tác với các chuỗi đó.StrByte1 DB “daylachuoibyte1”StrByte2 DB “ daylachuoibyte2”StrWord1 DW “ daylachuoitư1”StrWord1 DW “daylachuoitu2” LEA SI, StrByte1 LEA DI, StrByte2 COMPS StrWord2, StrWord1 ;có thể thay ; bằng MOMPSB.Cách ths hai là ta thêm vào lệnh CMPS đuôi thích hoẹp để báo chochương trình dòch biết kiểu thao tác trên chuỗi đã được đònh nghóa: đuôi “B” đểthao tác với byte hoặc đuôi “W”để thao tác với từ trong chuỗi.Cập nhật: AF, CF, OF, PF, SF, ZP.Ví dụ:MOV DI, OFFSET chuỗiđích ; lấy đòa chỉ lệch ; của chuỗiđích tại ; ES vào SI,MOV SI, OFFSET chuỗigốc ; lấy đòa chỉ lệch ; của chuỗigốc tại ; DS vào SI,CLD ; làm việc với chuổi theo ; chiều tiến,CMPSB ; chuyển 1 byte. ; SI và DI tăng thêm 1.CWD-Convert a Word to a DoubleWord ( chuyển từ thành từ kép )Lệnh này mở rộng bit dấu của AX sang 16 bit của DX. DX lúc này đượcgọi là phần mở rộng dấu của AX. Ta dùng CWD để mở rộng dấu cho số có dấunằm trong AX trước khi muốn chia nó cho một số có dấu khác bằng lệnh IDIV.Lệnh này không tác động đến các cờ.Ví dụ: nếu DX = 0000H. AX = 8087H thì sau lệnh đổi ta có: DX = FFFFH, AX = 8086H.DAA-Decimal Adjust AL after BCD Addition ( chỉnh AL sau khi cộng sốBCD ). Trang : 21Lệnh này dùng để chỉnh lại kết quả ( hiện nằm ở AL ) sau phép cộng 2 sốBCD. Lý do phải chỉnh lại kết quả này là do ta đã dùng bộ ALU của XPU, cốn chỉbiết làm toán với các số hệ hai. Để làm otán với các số VCD, lệnh D chỉ tác độđúng đến kết quả ở AL ngay sau khi vừa thực hiện phép cộng. Hoạt động của lệnhDAA:+Nếu 4 bit thấp cảu AL lớn hơn 9 hoặc AF = 1 thì AL – AL + 6 .+Nếu 4 bit cao của AL lớn hơn 9 hoặc CF = 1 thì AL – AL + 60H.Cập nhật: AF, CF, PF, SF, ZP.Không xác đònh: OF.Ví dụ:a) ; AL = 0101 1001BCD = 59 ; BL = 0011 0110BCD = 36ADD AL, BL ; AL = 1000 1111 B = 8FHDAA ; vì F > 9 nên AL + 6 = 1001 0101BCD = 95b) ; AL = 1000 1001BCD = 89 ; BL = 0100 0111BCD = 47ADD AL, BL ; AL = 1101 0000 B = D0H, AF = 1DAA ; vi D > 9 và À = 1 nên ; AL + 60H +6 = 1001 0000BCD = 36,CF = 1.DAS- Decimal Adjust AL after BCD Subtraction ( chỉnh AL saukhi trừ 2 số BCD )Lệnh này dùng để chỉnh lại kết quả ( hiện nằm ở AL ) sau phép trừ 2 sốBCD. Lý do phải chỉnh lại kết qủ này là do ta đã dùng bộ ALU của CPU, vốn chỉbiết làm toán với các số hệ hưi, để làm toán vcới các số BCD. Lệnh DAS chỉ tácđộng đúng đến kết quả ở AL ngay sau khi vừa thực hiện phép trừ. Hoạt động củalệnh DAS:+Nếu 4 bit thấp của AL lớn hơn 9 hoặc AF = 1 thì AL – AL.6.+Nếu 4 bit cao của AL lớn hơn 9 hoặc CF = 1 thì AL – AL.60H.Cập nhật: AF, CF, PF, SP ,ZP.Không xác đònh: OF.Ví dụ:a) ; AL = 0101 0110BCD = 56 ; BL = 0011 1001BCD = 39SUB AL, BL ; AL = 0001 1101B = 1DH.DAS ; vì D > 9 nên AL-6 = 0001 1001BCD = 99, CF.Trong thí dụ trên CF = 1 có nghóa là phải mượn 100 thêm vào số bò trừ đểđược kết quả là 99. Nói cách khác đi kết quả đúng sẽ là -1.DEC – Decrement Destination Register or Memory ( Giảm toánhạng đi 1 ). Viết lệnh : DEC DestinationMô tả: Đích – Đích -1.Trong đó toán hạng đích có thể tìm đựoc thưo các chế độ đòa chỉ khácnhau. Lưu ý là nếu Đích = 00H ( hoặc 0000H ) thì Đích -1 = FFH ( hoặc FFFFH ) Trang : 22mà không làm ảnh hưởng đến cờ CF. Lệnh này cho kết quả tương đương như lệnhSUB Đích nhưng chạy nhanh hơn.Cập nhật: AF, OF, PF, SF, ZP.Không tác động: CF/DIV – Unsingned Divide ( chia 2 số không có dấu )Viết lệnh: DIV GốcTrong đó toán hạng Gốc là số chia và có thể tìm được theo các chế độ đòachỉ khác nhau.Mô tả: tuỳ theo độ dài của toán hạng gốc ta có 2 trường hợp bố trí phépchia. Các chỗ để ngầm đònh cho số bò chia và kết quả:• Nếu Gốc là số 8 bit: AX/Gốc. Số bò chia phải là số không dấu 16 bitđể trong AX.• Nếu Gốc là số 16 bit: DXAX/Gốc. Số bò chia phải là số không dấu 32bit để trong cặp thanh ghi DXAX.Nếu thương không phải là số nguyên nó được làm tròn theo số nguyên sátđuôi.Nếu Gốc = 0 hoặc thương thu được lớn hơn FFH hoặc FFFFH ( tuỳ theođộ dài của toán hạng Gốc ) thì 8088 thực hiện lệnh ngắt INT 0.Không xác đònh: AF, CF, OF, PF, SF, ZP.ESC – EscapeLệnh này dùng để truyêng các lệnh cho bộ đồng xử lý toán học 8087 bòtạm dừng và bộ vi xử lý 8088 bước vào trạng thái dừng. Để thoát khỏi trạng tháidừng chỉ có cách tác động vào một trong các chân INTR.NMI. hoặc RESET của bộvi xử lý.IDIV – Integer Division ( Signed division ) ( chia số có dấu )Viết lệnh: IDIV GốcTrong đó toán hạng Gốc là số chia và có thể tìm được theo các chế độ đòachỉ khác nhau.Đây là lệnh dùng để chia các số nguyên có dấu. Chỗ để ngầm đònh củasố chia. Số bò chia. Thương và số dư giống như ở lệnh DIV. chỉ có 2 điều khác là: +Sau phép chia AL chứa thương ( số có dấu ). AH chứa số dư ( số códấu ).+Dấu của số có dư sẽ trùng với dấu của số bò chia.+Nếu Gốc = 0 hoặc thương nằm ngoài dải.128…+ 127 hoặc -32768…+32767 ( tuỳ theo độ dài của Gốc ) thì 8088 thực hiện lệnh ngắt INT 0.Không xác đònh: AF, CF, OF, PF, SF, ZP.IMUL – Integer Multiplication ( Multiply Signed Numbers ) (Nhân số có đầu ). Viết lệnh: IMUL Gốc.Trông dố toán hạng Gốc là số nhân và có thể tìm được theo các chế độđòa chỉ khác nhau.Mô tả: tuỳ theo độ dài của toán hạng Gốc ta có 2 trương hợp bố trí phépnhân. Chỗ để ngầm đònh cho só bò nhân và kết quả: • Nếu Gốc là số có dấu 8 bit: ALxGốc. Trang : 23Số bò nhân phải là số cso dấu 8 bit để trong AL.• Nếu Gốc là số có dấu 16 bit: AXxGốc.Số bò nhân phải là số có dấu 16 bit để trong AX.Nếu tích thu được nhỏ, không đủ lấp đầy hết được các chỗ dành cho nóthì các bit không dùng đến đựơc thay bằng bit dấu.Nếu byte cao ( hoặc 16 bit cao ) của 16 ( hoặc 32 bit ) kết quả chỉ chưamột giá trò của dấu thì CF = OF = 0.Nếu byte cao ( hoặc 16 bit cao ) của 16 ( hoặc 32 ) bit kết qủa chứa mộtphần kết quả thì CF = OF = 1.Như vậy CF và OF sẽ báo cho ta biết kết quả cần độ dài thực chất là baonhiếu.Ví dụ:Nếu ta cần nhân một số có dấu 8 bit với một số có dấu 16 bit, ta để số 16bit ở gốc và số 8 bit ở AL. Số 8 bit này ở AL cần phải được mở rộng dấu sang AHbăng lệnh CBW. Sau cùng chỉviệc dùng lệnh IMUL gốc và kết quả có trong cặpDXAX.Cập nhật:CF, OF.Không xác đinh: AF, PF, FS, ZP.In- Input Data From a Port ( đọc dữ liệu từ cổng vào thanh ACC.Viết lệnh: In ACC, Port.Mô tả: ACC <- {Port}.Trong đó {Port } là dữ liệu của cổng có đòa chỉ là Port. Port là đòa chỉ 8 bitcủa cổng, nó có thể có các giá trò trong khoảng 00H…FFH. Như vậy ta có thể cócác khả năng sau:+Nếu ACC là AL thì dữ liệu 8 bit được đưa vào từ cổng Port.+Nếu ACC là AX thì dữ liệu 16 bit được đưa vào từ cổng Port và cổngPort+1.Có một cách khác để biểu diển đòa chỉ cổng là thông qua thanh ghi DX.Khi dùng thanh ghi DX để chứa đòa chỉ cổng ta sẽ có khả năng đòa chỉ cổng hoámềm dẽo hơn. Lúc này đòa chỉ cổng nằm trong dải 0000H FFFFH và ta phải viếtlệnh theo dạng:In ACC, DX.Trong đó DX phải được gắn từ trước giá trò ứng với đòa chỉ cổng.Lệnh này không tác động đến các cờ.Inc-Increment Destination Register or Memory ( tăng toán hạngđích thêm 1 ).Viết lệnh : Inc-ĐíchMô tả: Đích <- Đích+1.Trong đó toán hạng đích có thể tìm được theo các chế độ đòa chỉ khácnhau. Lưu ý là nếu đích = FFH ( hoặc FFFFH ) thì Đích+1 = 00H (0000H ) màkhông ảnh hưởng đến cờ CF. Lệnh này cho kết quả tương đương như lệnh ADDĐích.1.nhưng chạy nhanh hơn.Cập nhật: AF, OF, PF, SF, ZP.Không tác động: CF. Trang : 24INT-Interupt Program Execution ( ngắt, gián đoạn chương trìnhđang chạy ).Viết lệnh: INT N, N = 0 FFHMô tả: các thao tác của 8088 khi chạy lệnh INT N: 1. SP <- SP-2, {SP} <- FR2. IF <- 0 ( cấm các ngắt tác động ). TF <-0 ( chạy suốt ).3. SP <- SP-2, {SP} <- CS4. SP <- SP-2, {SP} <- IP5. {Nx4} <- IP, {Nx4+2} <-CS.Ví dụ với N = 8 thì CS <- {0022H}. IP <- {0020H}.Mỗi lệnh ngắt ứng với chương trình phục vụ ngắt ( CTPVN ) khác nhaucó đòa chỉ lấy từ bảng veto ngắt. Bảng này gồm 256 vecto, chứa đòa chỉ của cácCTPVN tương ứng và chiếm 1Kbyte Ram có đòa chỉ thấp nhất của bộ nhớ. CTPVNcũng có thể được gọi là chương trình con phục vụ ngắt ( CTCPVN ) vì cách thức tổchức và quan hệ giữa nó với chương trình bò ngắt cũng giống như cách thức tổ chứcvà quan hệ giữa CTC với ctc.INTO-Interrupt On Overflow ( ngắt nếu có tràn ).Nếu có tràn ( OF = 1 ) thì lệnh này ngắt công việc đang làm của vi xử lývà thực hiện lệnh ngắt INT 4.IRET-Interrupt Return ( trở về CTC từ chương trình ( Con ) phục vụngắt ).Như đã trình bày ở lệnh CALL, tại cuối ctc phải có lệnh trở về ( RET ) đểbộ vi xử lý tự động lấy lại đòa chỉ trở về CTC. Trong trường hợp CTCPVN, để trởvề CTC với đầy đủ thông tin cần thiết về đòa chỉ và trạng thái, tất nhiên phải cầncó lệnh với các tác động tương ứng: lệnh IRET. Lệnh này, ngoài việc tự động lấylại đòa chỉ trở về CTC, còn lấy lại thanh ghi cờ đã được cất giữ trước khi chạyCTCPVN.JA/JNBE-Jump If Above/Jump If Not Below Or Equal ( nhảynếu cao hơn/nhảy nếu không thấp hơn hoặc bằng ).Viết lệnh: JA NHAN JNBE NHAN Mä t IP ←IP → Dëchchuøn Hai lãûnh trãn âiãưu khiãøn cng mäüt thao tạc Nhy cọ âiãưu kiãûn våïi nhn nãúuCF+ZF = 0 .Quan hãû “trãn “ (above),” cao hån “ v quan hãû “dỉåïi “ , “ tháúp hån”(below) l cạc quan hãû dnh cho viãûc so sạnh (do lãûnh CMP thỉûc hiãûn ) âäü låïn ca haisäú khäng dáúu .Nhn NHAN phi nàòm cạch xa (dëch chuøn mäüt khong )-128. .+127byte so våïi lãûnh tiãúp theo sau lãûnh A:/INBE .Chỉång trçnh s càn cỉï vo giạ trëchuøn âãø xạc âënh cạc giạ trë chuøn Lãûnh ny khäng tạc âäüng âãún cạc cåì .Vi dủ :Nãúu 1 khung thanh AL cao hån 10H thç nhy lãn nhn TH01 CMP AL , 10H ; so sạnh Al våïi 10HUA THOI ; nhy lãn TH01 nãúu Al cao hån 4AE/JNB/4NC 4jump if Above or Equal /jump if not below /jump if–no carry ( nhy nãúu cao hån hồûc bàòng / nhy nãúu tháúp hån / nhy nãúu khäng cọ nh)Viãút lãûnh : Trang : 25 JAE NHAN JNB NHAN JNC NHAN Mọ taớ : IP IP Dởchchuyóứn Ba lóỷnh trón õóửu thổỷc hióỷn cuỡng mọỹt thao taùc : nhaớy coù õióửu kióỷn tồùi NHAN nóỳuCF = 0 . Quan hóỷ trón (above), cao hồn vaỡ quan hóỷ dổồùi , thỏỳp hồn (below)laỡ caùc quan hóỷ daỡnh cho vióỷc so saùnh (do lóỷnh CMP thổỷc hióỷn ) õọỹ lồùn cuớa hai sọỳkhọng dỏỳu .Nhaợn NHAN phaới nũm caùch xa (dởch chuyóứn mọỹt khoaớng )-128. .+127byte so vồùi lóỷnh tióỳp theo sau lóỷnh A:/INBE .Chổồng trỗnh seợ cn cổù vaỡo giaù trởchuyóứn õóứ xaùc õởnh caùc giaù trở chuyóứn Lóỷnh naỡy khọng taùc õọỹng õóỳn caùc cồỡ .Vờ duỷ : Nóỳu nọỹi dung thanh AL cao hồn hoỷc bũng 10H thỗ nhaớy õóỳn nhaợn THOI CMP AL ,10H ; So saùnh AL vồùi 10H JAE .THOI ; nhaớy õóỳn THOI nóỳu Al cao hồn hoỷc bũng 10H JB/JC/JNAE - jump if Below/ Jump if Carry /Jump ỗ Not Above orEqual ( Nhaớy thỏỳp hồn / nhaớy nóỳu coù / nhaớy nóỳu khọng cao hồn hoỷc bũng )Vióỳt lóỷnh JB NHAN JC NHAN JNAE NHAN Ba lóỷnh trón õóửu thổỷc hióỷn cuỡng mọỹt thao taùc : nhaớy coù õióửu kióỷn tồùi NHAN nóỳuCF = 0 . Quan hóỷ trón (above), cao hồn vaỡ quan hóỷ dổồùi , thỏỳp hồn (below)laỡ caùc quan hóỷ daỡnh cho vióỷc so saùnh (do lóỷnh CMP thổỷc hióỷn ) õọỹ lồùn cuớa hai sọỳkhọng dỏỳu .Nhaợn NHAN phaới nũm caùch xa (dởch chuyóứn mọỹt khoaớng )-128. .+127byte so vồùi lóỷnh tióỳp theo sau lóỷnh A:/INBE .Chổồng trỗnh seợ cn cổù vaỡo giaù trởchuyóứn õóứ xaùc õởnh caùc giaù trở chuyóứn Lóỷnh naỡy khọng taùc õọỹng õóỳn caùc cồỡ .Vờ duỷ : Nóỳu nọỹi dung thanh AL thỏỳp hồn hoỷc bũng 10H thỗ nhaớy õóỳn nhaợn THOI CMP AL ,10H ; So saùnh AL vồùi 10H JB THOI ; nhaớy õóỳn THOI nóỳu Al thỏỳp hồn hoỷc bũng 10HJBE/JNA- jump if Below/ Jump if Carry /Jump ỗ Not Above or Equal( Nhaớy thỏỳp hồn / nhaớy nóỳu coù / nhaớy nóỳu khọng cao hồn hoỷc bũng )Vióỳt lóỷnh : JBENHANIBA NHAN Mọ taớ : IP IP Dởchchuyóứn Hai lóỷnh trón õóửu thổỷc hióỷn cuỡng mọỹt thao taùc : nhaớy coù õióửu kióỷn tồùi NHAN nóỳuCF+ZF=1 . Quan hóỷ trón (above), cao hồn vaỡ quan hóỷ dổồùi , thỏỳp hồn(below) laỡ caùc quan hóỷ daỡnh cho vióỷc so saùnh (do lóỷnh CMP thổỷc hióỷn ) õọỹ lồùn cuớa haisọỳ khọng dỏỳu .Nhaợn NHAN phaới nũm caùch xa (dởch chuyóứn mọỹt khoaớng )-128. .+127byte so vồùi lóỷnh tióỳp theo sau lóỷnh A:/INBE .Chổồng trỗnh seợ cn cổù vaỡo giaù trởchuyóứn õóứ xaùc õởnh caùc giaù trở chuyóứn Lóỷnh naỡy khọng taùc õọỹng õóỳn caùc cồỡ .Vờ duỷ : Nóỳu nọỹi dung thanh AL thỏỳp hồn hoỷc bũng 10H thỗ nhaớy õóỳn nhaợn THOI CMP AL ,10H ; So saùnh AL vồùi 10H JBE THOI ; nhaớy õóỳn THOI nóỳu Al thỏỳp hồn hoỷc bũng 10HJBE/JNA- jump if Below/ Jump if Carry /Jump ỗ Not Above or Equal( Nhaớy thỏỳp hồn / nhaớy nóỳu coù / nhaớy nóỳu khọng cao hồn hoỷc bũng )Vióỳt lóỷnh : JCXZ NHAN Mọ taớ : IP IP + Dởchchuyóứn ỏy laỡ lóỷnh nhaớy õióửu kióỷn tồùi NHAN nóỳu CX =0 vaỡ khọng coù lióỷn hóỷ gỗ vồùi cồỡ ZF .Nhaợn NHAN phaới nũm caùch xa (di chuyóứn mọỹt khoaớng ) -128. . +127byte so vồùi lóỷnhtióỳp theo sau lóỷnh A:/INBE .Chổồng trỗnh seợ cn cổù vaỡo giaù trở chuyóứn õóứ xaùc õởnhcaùc giaù trở chuyóứn Lóỷnh naỡy khọng taùc õọỹng õóỳn caùc cồỡ . Vờ duỷ : Nóỳu thanh CX rọựng thỗ nhaớy õóỳn lóỷnh THOI : JCXZ THOI : THOI :RET ; Troớ vóử CTC nóỳu CX = 0