Bài giảng Chương 3: Bộ vi xử lý 8086/8088 của intel
Làm thay đổi trật tự thực hiện lệnh bình thường của vi xử lý
Lệnh nhảy không điều kiện: JMP
Các lệnh nhảy có điều kiện: Jxxx
Lệnh lặp: LOOP và các biến thể của nó
Các lệnh có liên quan đến Chương trình con:
- CALL (gọi chương trình con)
- RET (trở về chương trình gọi)
Các lệnh có liên quan đến Chương trình con phục vụ ngắt
- INT (gọi chương trình con phục vụ ngắt - Gọi ngắt)
- IRET (quay về chương trình gọi ngắt)
nguyên lần chu kỳ máyChu kỳ máy: Nghịch đảo của tần số hoạt động (tốc độ đồng hồ) của bộ vi xử lýKhông PipeliningMột thủ tục đơn giản gồm 3 bước:Lấy lệnh từ bộ nhớGiải mã lệnhThực hiện lệnh:Lấy các toán hạng từ bộ nhớ (nếu có)Lưu trữ kết quảFetch1Decode1Execute1Fetch2Decode2Execute2...BusyIdleBusy...BusyIdleBusyMicroprocessorBusCơ chế PipeliningSơ đồ khối chức năng của 8088Đơn vị giao tiếp Bus - BIUPhát các tín hiệu địa chỉ đến bộ nhớ và các cổng I/O thông qua A-BusĐọc mã lệnh từ bộ nhớ thông qua D-BusĐọc dữ liệu từ bộ nhớ thông qua D-BusGhi dữ liệu vào bộ nhớ thông qua D-BusĐọc dữ liệu từ các cổng I thông qua D-BusGhi dữ liệu ra các cổng O thông qua D-BusĐơn vị thực hiện - EUBao gồm CU và ALUCU : Giải mã lệnh để tạo ra các tín hiệu điều khiển nhằm thực hiện lệnh đã được giải mãALU: thực hiện các thao tác khác nhau đối với các toán hạng của lệnh3.2 Cấu trúc thanh ghi của 8086/80888086/8088 có 14 thanh ghi 16-bit, gồm các nhóm:Các thanh ghi đa năng, segment và offset của 8086/8088AHBHCHDHALBLCLDL0707015IPSPBPSIDIAccumulatorBaseCounterDataCSDSSSES015Code SegmentData SegmentStack SegmentExtra SegmentInstruction PointerStack PointerBase PointerSource IndexDestination Index}}}AXBXCXDXAHBHCHDHALBLCLDL0707AccumulatorBaseCounterDataAXBXCXDX Có thể truy cập như các thanh ghi 8-bit Lưu trữ tạm thời dữ liệu để truy cập nhanh hơn và tránh khỏi phải truy cập bộ nhớ- Có công dụng đặc biệt đối với một số câu lệnhCác thanh ghi đa năngCác thanh ghi segmentCSDSSSES015Code SegmentData SegmentStack SegmentExtra Segment Lưu trữ địa chỉ segment của một ô nhớ cần truy cập Kết hợp với các thanh ghi offset nhất định Lưu trữ địa chỉ offset của một ô nhớ cần truy cập Kết hợp với các thanh ghi segment nhất định Các thanh ghi offsetIPSPBPSIDIInstruction PointerStack PointerBase PointerSource IndexDestination IndexxxxxOFDFIFTFSFZFxAFxPFxCF015Thanh ghi cờ 16-bit của 8086/8088- Không phải tất cả các bit đều được sử dụng- Mỗi bit được sử dụng được gọi là một cờ- Các cờ đều có tên và có thể được Lập/Xoá riêng lẽ- Bao gồm các cờ trạng thái và các cờ điều khiển3.3 Phương pháp quản lý bộ nhớ- Bộ nhớ được xem là một tập hợp các ô nhớ- Mỗi ô nhớ được nhận dạng bằng một Địa chỉ vật lý duy nhất 20-bit- Trong hoạt động truy cập một ô nhớ, Địa chỉ vật lý của nó được tạo ra từ hai giá trị 16-bit: Địa chỉ segment và Địa chỉ Offset- Địa chỉ logic = Địa chỉ segment:Địa chỉ offsetMối liên hệ giữa Địa chỉ vật lý và Địa chỉ logic của một ô nhớDịch địa chỉ segment sang trái 4 bit rồi cộng với địa chỉ offset sẽ nhận được địa chỉ vật lý:Địa chỉ logic 0000:0010Địa chỉ vật lý: 00000+0010 = 00010Địa chỉ logic 1234:0010Địa chỉ vật lý: 12340+0010 = 12350Địa chỉ logic 4C56:0016Địa chỉ vật lý: 4C560+0016 = 4C576 Địa chỉ vật lý: 00010Địa chỉ logic: 0000:0010, 0001:0000Địa chỉ vật lý: 00020Địa chỉ logic: 0000:0020, 0002:0000, 0001:00103.4 Mô tả tập lệnh Assembly của 8086/8088 Khuôn dạng: Mnemonics Các toán hạng Nhóm lệnh chuyển số liệu- Nhóm lệnh số học Nhóm lệnh logic Nhóm lệnh Rẽ nhánh Nhóm lệnh thao tác string Nhóm lệnh hỗn hợpNhóm lệnh chuyển số liệu Data Transfer Instructions Chuyển số liệu (sao chép số liệu) từ vị trí này sang vị trí khác Nguồn số liệu không thay đổi Đich sẽ có giá trị như giá trị của Nguồn Các lệnh chuyển số liệu không ảnh hưởng đến các cờ trạng thái trên thanh ghi cờ Một số lệnh tiêu biểu: MOV, XCHG MOVKhuôn dạng: MOV Đích,Nguồn Tác dụng: (Đích) (Nguồn) Đích: có thể là:1. Một thanh ghi 8 hoặc 16 bit của VXL 2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau) Nguồn: có thể là:Một thanh ghi 8 hoặc 16 bit của VXL Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)3. Một giá trị cụ thểMột số lưu ý đối với MOV Đích và Nguồn phải có cùng kích cỡ Đích và Nguồn không thể đồng thời thuộc bộ nhớ Nếu Đích là một thanh ghi segment của VXL thì Nguồn không thể là một giá trị cụ thể (nói cách khác, không thể nạp giá trị trực tiếp cho một thanh ghi segment bằng lệnh MOV)XCHGKhuôn dạng: XCHG T/h1,T/h2 Tác dụng: (T/h1) tráo đổi với (T/h2) T/h1: có thể là:1. Một thanh ghi 8 hoặc 16 bit của VXL 2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau) T/h2: có thể là:Một thanh ghi 8 hoặc 16 bit của VXL Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)Một số lưu ý đối với XCHG T/h1 và T/h2 phải có cùng kích cỡ T/h1 và T/h2 không thể đồng thời thuộc bộ nhớ T/h1 và T/h2 không thể là các thanh ghi segmentCác mode địa chỉ Khi thực hiện lệnh, VXL sẽ thực hiện những thao tác nhất định trên số liệu, các số liệu này được gọi chung là các toán hạng. Các toán hạng trong một câu lệnh có thể là một phần của câu lệnh (ở dạng mã máy), có thể nằm ở một thanh ghi của VXL hoặc ở Bộ nhớ Cách xác định toán hạng trong các câu lệnh được gọi là các mode (định) địa chỉCác mode địa chỉ Mode địa chỉ thanh ghi: MOV AX,BX Mode địa chỉ tức thì: MOV AL,55h Các mode địa chỉ bộ nhớ: Các cách thức xác định địa chỉ vât lý của toán hạng nằm trong bộ nhớ: Mode địa chỉ trực tiếp Các mode địa chỉ gián tiếp Mode địa chỉ trực tiếp (Direct Addressing Mode)Mode địa chỉ gián tiếp thanh ghi(Register Indirect Addressing Mode)Nhớ các mode địa chỉ bộ nhớ như thế nào?Tất cả bắt đầu trong bảng sau đây: Lấy ra 0 hoặc 1 phần tử từ mỗi cột(Không lấy 2 phần tử từ một cột)Phải lấy ít nhất 1 phần tử từ bảngBXBPSIDIDISPCác ví dụ89 D8MODEOPMove to AX the 16-bit value in BXMOV AX, BXRegisterMemory ContentsCommentInstructionAddressing Mode89 F8MODEOPMove to AX the 16-bit value in DIMOV AX, DIRegister88 C4MODEOPMove to AL the 8-bit value in AXMOV AH, ALRegisterB4 12DATA8OPMove to AH the 8-bit value 12HMOV AH, 12hImmediateB8 34DATA16OPMove to AX the value 1234hMOV AX, 1234hImmediateB8 lsb msbDATA16OPMove to AX the constant defined as CONSTMOV AX, CONSTImmediateB8 lsb msbDATA16OPMove to AX the address or offset of the variable XMOV AX, XImmediateA1 34 12DISP16OPMove to AX the value at memory location 1234hMOV AX, [1234h]DirectA1 lsb msbDISP16OPMove to AX the value in memory location DS:XMOV AX, [X]DirectCác ví dụA3 lsb msbDATA16OPMove to the memory location pointed to by DS:X the value in AXMOV [X], AXDirectMemory ContentsCommentInstructionAddressing Mode8B 05MODEOPMove to AX the 16-bit value pointed to by DS:DIMOV AX, [DI]Indexed89 05MODEOPMove to address DS:DI the 16-bit value in AXMOV [DI], AXIndexed8B 07MODEOPMove to AX the 16-bit value pointed to by DS:BXMOV AX, [BX]Register Indirect89 07MODEOPMove to the memory address DS:BX the 16-bit value stored in AXMOV [BX], AXRegister Indirect89 46MODEOPMove to memory address SS:BP the 16-bit value in AXMOV [BP], AXRegister Indirect8B 87 lsb msbMODEOPMove to AX the value in memory at DS:BX + TABMOV AX, TAB[BX]Register Relative89 87 lsb msbDISP16OPMove value in AX to memory address DS:BX + TABMOV TAB[BX], AXRegister Relative8B 01MODEOPMove to AX the value in memory at DS:BX + DIMOV AX, [BX + DI]Base Plus IndexDISP16MODECác ví dụ89 01MODEOPMove to the memory location pointed to by DS:X the value in AXMOV [BX + DI], AXBase Plus IndexMemory ContentsCommentInstructionAddressing Mode8B 81 34 12MODEOPMove word in memory location DS:BX + DI + 1234h to AX registerMOV AX, [BX + DI + 1234h]Base Rel Plus IndexDISP16C7 81 34 12 78 56Move immediate value 5678h to memory location BX + DI + 1234hMOV word [BX + DI + 1234h], 5678hBase Rel Plus IndexNhóm lệnh Số họcBên cạnh tác dụng, cần chú ý đến ảnh hưởng của lệnh đối với các cờ trạng tháiCác lệnh số học th/thường: ADD, SUB, Các lệnh số học khác: CMP. NEG, INC, DEC, Ảnh hưởng đến các cờ trạng tháiCF OF Phụ thuộc vào quá trình thực hiện phép toánAFZF = 1 nếu Kết quả bằng 0SF = 1 nếu MSB của Kết quả = 1PF = 1 nếu byte thấp của kết quả có Parity chẳnADDKhuôn dạng: ADD Đích,Nguồn Tác dụng: (Đích) (Đích)+(Nguồn) Đích: có thể là:1. Một thanh ghi 8 hoặc 16 bit của VXL 2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau) Nguồn: có thể là:Một thanh ghi 8 hoặc 16 bit của VXL Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)3. Một giá trị cụ thểẢnh hưởng của ADDZF = 1 nếu Kết quả bằng 0SF = 1 nếu MSB của Kết quả = 1PF = 1 nếu byte thấp của kết quả có Parity chẳnCF được lập nếu tràn không dấu (có nhớ từ MSB)OF được lập nếu tràn có dấu:- Có nhớ từ MSB, Không có nhớ vào MSB- Có nhớ vào MSB, Không có nhớ từ MSBAF được lập nếu có nhớ từ nibble thấp vào nibble cao (từ bit 3 vào bit 4)Các cờ trên thanh ghi cờCác bit nhất định trên thanh ghi cờ điều khiển hoạt động hoặc phản ánh trạng thái của vi xử lýCác cờ điều khiển (TF, IF, DF)Quyết định cách đáp ứng của vi xử lý trong các tình huống nhất địnhCác cở trạng thái (CF, PF, AF, ZF, SF, OF)Bị ảnh hưởng bởi các phép toán nhất địnhPhục vụ cho các lệnh có điều kiệnCác cờ điều khiểnDF - Direction flag (Cờ hướng)DF = 1: huớng xuốngDF = 0: hướng lên IF – Interrupt flag (Cờ ngắt)IF = 1: cho phép ngắt ngoàiIF = 0: cấm ngắt ngoài (đối với ngắt che được)TF - Trace flagTF = 1: vi xử lý thực hiện từng lệnh mộtSUBKhuôn dạng: SUB Đích,Nguồn Tác dụng: (Đích) (Đích)-(Nguồn) Đích: có thể là:1. Một thanh ghi 8 hoặc 16 bit của VXL 2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau) Nguồn: có thể là:Một thanh ghi 8 hoặc 16 bit của VXL Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)3. Một giá trị cụ thểẢnh hưởng của SUBZF = 1 nếu Kết quả bằng 0SF = 1 nếu MSB của Kết quả = 1PF = 1 nếu byte thấp của kết quả có Parity chẳnCF được lập nếu tràn không dấu (có mượn vào MSB)OF được lập nếu tràn có dấu:- Có mượn vào MSB, Không có mượn từ MSB- Có mượn từ MSB, Không có mượn vào MSBAF được lập nếu có mượn từ nibble cao vào nibble thấp (từ bit 4 vào bit 3)CMPKhuôn dạng: CMP Đích,Nguồn Tác dụng: (Đích)-(Nguồn) Đích: có thể là:1. Một thanh ghi 8 hoặc 16 bit của VXL 2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau) Nguồn: có thể là:Một thanh ghi 8 hoặc 16 bit của VXL Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)3. Một giá trị cụ thể INC, DEC, NEGINC T/hTrong đó: T/h có thể là các thanh ghi hoặc vị trí nhớTác dụng: (T/h) (T/h)+1DEC T/hTrong đó: T/h có thể là các thanh ghi hoặc vị trí nhớTác dụng: (T/h) (T/h)-1Lưu ý: Các lệnh INC và DEC không ảnh hưởng đến cờ CFLệnh NEG T/h: Đảo dấu của T/h (Lấy bù 2)Lệnh NEG sẽ lập cờ OF nếu giá trị của T/h là giá trị âm nhất trong dải giá trị của các số có dấu tương ứngNhóm lệnh LogicCác lệnh logic th/thường: NOT, AND, OR, XORCần chú ý đến ảnh hưởng của lệnh đối với các cờ trạng thái:NOT không ảnh huởng đến các cờ trạng thái.Các lệnh AND, OR, XOR:CF = 0OF = 0ZF = 1 nếu Kết quả bằng 0SF = 1 nếu MSB của Kết quả = 1PF = 1 nếu byte thấp của kết quả có Parity chẳnAF không xác địnhMột số ví dụ1100 1010NOT ALAL0011 0101ALALBL0011 01010110 1101AND AL, BL0010 0101ALALBL0011 01010110 1101OR AL, BL0111 1101ALALBL0011 01010110 1101XOR AL, BL0101 1000ALALBL0011 01010000 1111AND AL, BL0000 0101ALALBL0011 01010000 1111OR AL, BL0011 1111ALMột số ứng dụngBài toán Xoá bit: Xoá một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đóBài toán Lập bit: Lập một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đóBài toán Đảo bit: Đảo một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đóBài toán Kiểm tra bit: Xác định một bit nào đó của một toán hạng là bằng 0 hay 1 mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó (thông qua giá trị của một cờ trạng thái, ví dụ ZF)Nhóm lệnh logicCác lệnh logic khác: Lệnh TEST, Các lệnh dịch (Shift) và Các lệnh quay (Rotate)Lệnh TEST chỉ khác lệnh AND là không giữ lại kết quả của phép toánCác lệnh dịch và Các lệnh quay đều có hai khuôn dạng:Khuôn dạng 1: Mnemonic Toán hạng,1Khuôn dạng 2: Mnemonic Toán hạng,CLTác dụng của một câu lệnh theo khuôn dang 2 giống như tác dụng liên tiếp của N câu lệnh tương ứng theo khuôn dạng 1, với N là giá trị của thanh ghi CL Các lệnh Dịch trái: SHL, SAL0RegisterCFShift right SHRRegisterCF0Shift right SARRegisterCF(Quay trái/phải thông qua carry)RCLRCRRotate left/right (Quay trái/phải không qua carry)ROLRORNhóm lệnh rẽ nhánhLàm thay đổi trật tự thực hiện lệnh bình thường của vi xử lýLệnh nhảy không điều kiện: JMPCác lệnh nhảy có điều kiện: JxxxLệnh lặp: LOOP và các biến thể của nóCác lệnh có liên quan đến Chương trình con:- CALL (gọi chương trình con)- RET (trở về chương trình gọi)Các lệnh có liên quan đến Chương trình con phục vụ ngắt- INT (gọi chương trình con phục vụ ngắt - Gọi ngắt)- IRET (quay về chương trình gọi ngắt)Lệnh nhảy không điều kiệnJMP nhãnNhảy gần: E9 xx xx (3 byte)Nhảy ngắn: EB xx (2 byte)Nhảy xa: EA xx xx xx xx (5 byte)Nhãn: tên do ngườI lập trình tự đặt ra theo qui tắc đặt tên của Assembler và có thể đặt vào trước một câu lệnh bất kỳ trong chương trình cùng với dấu :nhãn: Câu lệnh cần thực hiệnNhãn sẽ được dịch thành địa chỉKhoảng cách nhảy: Khoảng cách đại số (có dấu) từ lệnh nhảy đến lệnh cần thực hiệnCơ chế thực hiện lệnh nhảyCác lệnh nhảy ngắn và gần chỉ làm thay đổi giá trị của thanh ghi IPLệnh nhảy ngắn cộng khoảng cách nhảy 8-bit có dấu vào giá trị hiện thời của IPLệnh nhảy gần cộng khoảng cách nhảy 16-bit có dấu vào giá trị hiện thời của IP Lệnh nhảy xa làm thay đổi cả CS và IPGán cho CS và IP các giá trị mớiCác lệnh nhảy có điều kiệnJxxx nhãn Có gần 40 menmonic khác nhauCác lệnh nhảy điều kiện đơn: phụ thuộc vào giá trị của 1 cờ.JNZ/JNE - Nhảy nếu cờ ZF = 0, nghĩa là kết quả của phép toán trước đó khác khôngJC - Nhảy nếu CF = 1, nghĩa là câu lệnh trước đó lập cờ carryJZ/JE (ZF = 1)JNC (CF = 0)Các lệnh nhảy có điều kiện Tất cả các lệnh nhảy có điều kiện phải là nhảy ngắnkhoảng cách nhảy: -128 to +127 bytes Tổ hợp với lệnh nhảy không điều kiện để có thể vượt qua giới hạn này.Các lệnh nhảy điều kiện kép: phụ thuộc vào giá trị của nhiều cờ JB/JNAEJNL/JGE ứng dụng của các lệnh nhảy có điều kiệnKết hợp với JMP để xây dựng các cấu trúc lập trình cơ bản:- Cấu trúc điều kiện- Cấu trúc lặpCác lệnh nhảy thường theo sau các lệnh làm thay đổi giá trị của các cờ trạng thái:CMP TEST Cấu trúc điều kiện mov ax,n cmp ax,7 jz nhan1; ZF = 1 CONGVIEC1 jmp nhan2 nhan1:CONGVIEC2 nhan2:lệnh 3 Cấu trúc lặp mov ax,n nhan1: cmp ax,0 jz nhan2 lệnhi sub ax,2 jmp nhan1nhan2: lệnhk Lệnh LOOPLOOP nhanGiảm CX đi 1Nếu (CX) khác 0 thì JMP nhan. Nếu không thì tiếp tục thực hiện lệnh theo trật tự bình thường mov cx,9nhan: lệnh 1 lệnh 2 lệnh 3 loop nhanLOOPZ/E và LOOPNZ/EĐây là các biến thể của LOOPGiá trị của cờ ZF có thể làm kết thúc sớm vòng lặpLOOPZ: Lặp khi (CX) khác 0 và ZF =1LOOPNZ: Lặp khi (CX) khác 0 và ZF =0Lưu ý: Các lệnh LOOP giảm CX nhưng không ảnh huởng đến các cờLOOPZ == LOOPELOOPNZ==LOOPNECác lệnh trong vòng lặp có thể tác động đến cờ ZF (CMP, TEST) Chương trình conChương trình con trong ngôn ngữ Assembly được gọi là Thủ tục (Procedure)Một thủ tục có thể được thực hiện nhiều lầnStack là cơ cở của chương trình con:- Stack lưu giữ Địa chỉ quay về- Stack lưu giữ giá trị của các thanh ghi của vi xử lý (nếu cần)Stack Cấu trúc dữ liệu LIFO ở RWM - PUSH : ghi dữ liệu vào stack, - POP: đọc dữ liệu từ stack (SS:SP) trỏ đến đỉnh của stack (theo LIFO)(SS:BP) truy cập stack ngẫu nhiên (không theo LIFO)PUSHPUSH nguồnPush nguồn vào stackPUSHFPush thanh ghi cờ vào stackLệnh PUSH trước hết sẽ giảm SP đi 2 rồi lưu giá trị của nguồn vào vị trị nhớ được trỏ bởi (SS:SP)Ví dụ PUSHPUSH AX3C09A4402CFFA2432A0946SP:000807064CSS:0340Stack Size: 000C3C09A4402CFFA2232A0946SP:000601064CSS:0340AX: 0123POPPOP đíchPop dữ liệu từ đỉnh stack vào đíchPOPFPop dữ liệu từ đỉnh stack vào thanh ghi cờLệnh POP trước hết copy dữ liệu được trỏ bởi (SS:SP) đến đích rồi tăng SP lên 2Ví dụ POPPOP ES3C09A4402CFFA2232A0946SP:000801064CSS:03403C09A4402CFFA2232A0946SP:000601064CSS:0340ES: 0123Tràn stack!Stack OverflowStack UnderflowSP:000DSS:0340Stack Size: 000CSP:FFFESS:0340Stack Size: 000CKhai báo thủ tụcTên_Thủ_tục PROC kiểu;thân của thủ tụcRET ;quay về chuơng trình gọiTên_Thủ_tục ENDPkiểu là NEAR hoặc FARngầm định là NEARMột thủ tục có thể có nhiều lệnh RETLệnh CALL và RETGọi một thủ tục (NEAR) CALL Tên_Thủ_tụcpush IP vào stackcopy địa chỉ của Tên_Thủ_tục vào IPTrở về từ một thủ tục (NEAR) RET pop giá trị ở đỉnh stack vào IPThủ tục FARGọi thủ tục (FAR) CALL Tên_thủ_tụclần lượt push CS và IP vào stackcopy địa chỉ của Tên_thủ_tục vào CS và IPTrở về từ thủ tục (FAR) RET pop giá trị từ đỉnh stack lần lượt vào IP và CSGọi ngắtGọi ngắt là một lời gọi thủ tục đặc biêtFARThanh ghi cờ phải được bảo toànINT Số ngắtThanh ghi cờ được push, TF và IF bị xoáCS và rồI IP được pushĐịa chỉ của một chương trình con phục vụ ngắt (Vector ngắt) tương ứng với Số ngắt được copy vào CS và IP Trở về từ ngắtIRETTác dụng của lênh:Giá trị ở đỉnh của stack được pop vào IPGiá trị ở đỉnh của stack được pop vào CSGiá trị ở đỉnh của stack được pop vào thanh ghi cờChương trình bị ngắt tiếp tục thực hiện dường như không có chuyện gì xảy raXuất ký tự ra màn hình PCNgắt 21h Ngắt này hỗ trợ rất nhiều dịch vụ trên PC Nhận dạng dịch vụ bằng số dịch vụ (số hàm). Số dịch vụ cần được nạp voà thanh ghi AH Tuỳ theo từng dịch vụ, có thể cần thêm một số đối số khác được nạp vào các thanh ghi xác địnhAH = 2, DL = Mã ASCII của ký tự cần xuấtKý tự được hiển thị tại vị trí hiện thời của con trỏXuất xâu ký tự ra màn hình PCDịch vụ 09h của ngắt 21hDX = Địa chỉ Offset của xâu (trong đoạn dữ liệu)DS = Địa chỉ segment của xâuXâu ký tự phải kết thúc bằng ký tự '$' Để nạp địa chỉ offset của xâu vào DX, có thể:LEA DX, Tênxâu MOV DX, OFFSET Tên xâuNhập 1 ký tự từ bàn phím PCDịch vụ 01h của ngắt 21hKhi NSD gõ một ký tự từ bàn phím:Ký tự sẽ hiện trên màn hình AL sẽ chứa mã ASCII của ký tự đóAL=0 nếu ký tự được nhập là ký tự điều khiểnNhóm lệnh thao tác stringChúng ta hiểu: string là một mảng byte hoặc từ nằm trong bộ nhớCác thao tác string:Sao chépTìm kiếmLưu trữSo sánhCác đặc điểmNguồn: (DS:SI), Đích: (ES:DI)DS, ES chứa Địa chỉ Segment của stringSI, DI chứa Địa chỉ Offset của stringCờ hướng DF (0 = Up, 1 = Down)DF = 0 - Tăng địa chỉ (trái qua phải)DF = 1 - Giảm địa chỉ (phảI qua trái) Chuyển (Sao chép)MOVSB, MOVSWChuyển 1 byte hoặc 1 word từ vị trí nhớ này sang vị trí nhớ khácTác dụng của lệnh:Sao chép byte/word từ (DS:SI) đến (ES:DI)Tăng/Giảm SI và DI 1 hoặc 2 giá trịNếu CX chứa một giá trị khác không:REP MOVSB hoặc REP MOVSW sẽ tự động sao chép (CX) lần và CX sẽ về không Ví dụ:Sao chép mảng; Sao chép 10 byte từ mảng a sang mảng b, giả sử (DS) = (ES) mov cx, 10 mov di, offset b mov si, offset a cld ;xoá cờ DF rep movsbVí dụ: Tịnh tiến các ô nhớ mov cx, 7 mov di, offset a+9 mov si, offset a+6 std ;lập cờ DF rep movsbDIaSIVí dụ pattern db "!@#*" db 96 dup (?) mov cx,96 mov si, offset pattern mov di, offset pattern+4 cld rep movsb!@#*DIaSILưu trữ stringSTOSB, STOSWCopy AL hoặc AX vào một mảng byte hoặc wordĐích (ES:DI)Tăng hoặc Giảm DIphụ thuộc DFThường được sử dụng có tiền tố REP và số lần lặp trong CXVí dụ: arr dw 200 dup (?) mov ax,50A0h mov di,offset arr mov cx,200 cld rep stoswA050A050arr50A0AXDINạp StringLODSB, LODSWByte hoặc word tại (DS:SI) được copy vào AL hoặc AXSI tăng hoặc giảm 1 hoặc 2 giá trị phụ thuộc DFThường được dùng với STOSx trong một vòng lặp để xử lý từng phần tử trong một mảngVí dụ: mov di, offset b mov si, offset a mov cx,30 cldlp: lodsb and al,0DFh stosb loop lpQuét StringSCASB, SCASWSo sánh AL hoặc AX với byte hoặc word tạI (ES:DI) và tự động tăng hoặc giảm DILệnh này ảnh hưởng đến các cờ trạng tháiTuỳ theo kết quả so sánhDùng trong một vòng lặp REPsREPZ, REPE, REPNZ, REPNEVí dụarr db 'abcdefghijklmnopqrstuvwxyz' mov di, offset arr mov cx,26 cld mov al,target repne scasb jne nomatchSo sánh StringCMPSB, CMPSWSo sánh byte hoặc word tại (DS:SI) với byte hoặc word tạI (ES:DI), tác động đến các cờ và tăng hoặc giảm SI và DIThường dùng để so sánh hai mảng với nhauVí dụ mov si, offset str1 mov di, offset str2 cld mov cx, 12 repe cmpsb jl str1smaller jg str2smaller;the strings are equal - so far;if sizes different, shorter string is lessNhóm lệnh hỗn hợp - Các lệnh Lập/Xoá trực tiếp các cờ: STC, CLCSTD, CLDSTI, CLI - Lệnh NOP (No Operation): Không làm gì!!! - Lệnh NOP thường được dùng trong các vòng lặp tạo trễ (delay)bằng phần mềm - Các lệnh Nhập/Xuất dữ liệu đối với các cổng I/O IN OUTLệnh INNếu Địa chỉ của cổng nhỏ hơn hoặc bằng FFh: IN Acc, Địa chỉ cổng - Trong đó: Acc có thể là AL hoặc
File đính kèm:
- ky_thuat_vi_xu_ly_chuong_3.ppt