天天看點

微型計算機原理王忠民PPT,微型計算機原理4 王忠民著.ppt

微型計算機原理王忠民PPT,微型計算機原理4 王忠民著.ppt

微型計算機原理4 王忠民著.ppt

2021年2月8日 1,西安郵電學院計算機系 系統結構教研室 2009.8,微機原理與彙編語言,教材及參考書 微型計算機原理王忠民 王钰 王曉婕 編著 微型計算機原理學習與實驗指導 王钰 王勁松 刑高峰 編著,2021年2月8日 2,第4章 80 x86指令系統,主要内容 80868088指令格式 80868088指令系統的尋址方式 80868088指令系統 80 x8Pentium指令系統,2021年2月8日 3,1.1 80868088指令系統 計算機是通過執行指令序列來完成使用者的特定任務的,是以每種計算機都有一組指令集供使用者使用。這組指令集就稱為計算機的指令系統。 指令系統中的每一條指令都對應着微處理器要完成的一種規定的操作,這在設計微處理器時就事先規定好了,是以指令系統是表征一台計算機性能的重要因素,它的格式與規模将直接影響到機器的硬體結構。 指令系統是程式員編寫程式的基礎,是以很好地掌握指令系統的有關知識是後續進一步學習的關鍵。,2021年2月8日 4,4.1.1 8086/8088指令編碼格式 通常在指令格式中包含操作碼和操作數兩大部分。 其中操作碼表示計算機執行什麼操作,操作數指明參與操作的對象,或規定操作對象的位址(即操作對象的存放位置)。 如何尋找操作數(即操作對象),這就是指令的尋址方式,它是由指令編碼格式指出的。,2021年2月8日 5,80868088指令系統采用變字長的指令編碼格式,其指令可由16個位元組組成,它包括操作碼(第一位元組),尋址方式(第二位元組),位移量、立即數(第三到第六位元組)三部分組成。其中,尋址方式、位移量、立即數為操作數部分。,2021年2月8日 6,opcode,opcode,Mod位元組,opcode,Mod位元組,opcode,Mod位元組,opcode,Mod位元組,opcode,Mod位元組,Data/disp,disp低,Data/disp低,Data/disp高,disp高,disp低,disp高,Data,Data低,Data高,操作碼部分,操作數部分,一位元組指令,二位元組指令,三位元組指令,四位元組指令,五位元組指令,2021年2月8日 7,雙操作數指令中各字段定義2021年2月8日 8,例4.1 寫出下面指令的機器語言編碼。 MOV BXDI6,CL,指令碼為 88H、49H、FAH,OPCODE D W,mod,r/m,reg,disp8,100010,01,001,0010,011111010,例4.2 寫出下面指令的機器語言編碼。 ADD AX,BXDI0826,03H 81H 26H 08H2021年2月8日 9,4.1.2 8086/8088指令系統的尋址方式 所謂尋址方式就是尋找操作數存放位址(位置)的方法。在8086/8088系統中操作數存放的位置有以下4種 操作數包含在指令位元組中。即指令格式中操作數部分就是操作數本身。這種操作數叫立即數操作數。 操作數存放在CPU的某個内部寄存器中。這種操作數叫寄存器操作數。 操作數在記憶體的資料區中。這種操作數叫存儲器操作數。,2021年2月8日 10, 操作數來自或送到I/O端口。這種操作數叫I/O操作數。 在8086/8088系統中,操作數又可分為兩大類資料操作數和位址操作數。是以,尋址方式也分為資料尋址方式和位址尋址方式兩大類。 1. 資料的尋址方式 對于資料操作數,有四種形式 無操作數 單操作數可以是源操作數,也可以是目的操作數。,2021年2月8日 11, 雙操作數一個是源操作數,一個是目的操作數。 隐含操作數可能隐含一個操作數(源或目的),也可能隐含兩個操作數。 源操作數在操作過程中其值不變的操作數。(可以提供資料的操作數) 目的操作數在操作後可被操作結果代替的操作數。(可以接收資料的操作數) 1)立即數尋址方式 例如MOV AL, 80H MOV AX, 1234H,2021年2月8日 12MOV AL, 80H,MOV AX, 1234H,2021年2月8日 13,2)寄存器尋址方式 例如INC CX MOV AX, CX,89,C1,程式存儲器,AX,CX指令碼 (包括操作數),2021年2月8日 14,3)存儲器尋址方式 存儲器尋址方式的操作數存放在存儲器單元中。是以,要存取操作數就必須知道其存儲器的單元位址。在指令中可以直接給出或間接給出操作數的位址,以達到存取操作數的目的。 指令中給出的位址隻是操作數的有效位址(EA),并且是放在方括号(“ ”)中。若要從存儲器中存取操作數還須得到實際的位址(實體位址)。 實體位址段位址左移四位有效位址,實體位址,CS DS SS ES, 10H, EA,2021年2月8日 15,有效位址可以由以下三種位址分量組成 位移量它是存放在指令中的一個8位或16位的帶符号數。 基 址它是存放在基址寄存器BX或BP中的内容。 變 址它是存放在變址寄存器SI或DI中的内容。 對于某條具體指令,這三個位址分量可有不同的組合。正是因為這三種位址分量有不同的組合,才使得對存儲器操作數的尋址産生了若幹種不同的方式。,2021年2月8日 16, 直接尋址方式 MOV AL, 1064H 1064HEA 16位 disp,2021年2月8日 17, 寄存器間接尋址 MOV AX, SI MOV BX, AL,SI 2000H,BX 1000H,MOV AX, SI,MOV BX, AL,2021年2月8日 18, 寄存器相對尋址,MOV CL, BX1064H,2021年2月8日 19, 基址加變址尋址方式 MOV AH, BPSI,BP 2000H,SI 1200H,2021年2月8日 20, 基址加變址相對尋址 MOV BXDI1234H, AH,BX 0200H,DI 0010H,2021年2月8日 21,4)I/O端口尋址方式 直接端口尋址方式 IN AL, 21H2021年2月8日 22, 間接端口尋址方式 OUT DX, AL,2021年2月8日 23,2.位址的尋址方式 位址的尋址方式其時是程式轉移位址的尋址方式,也就是找出程式轉移的位址号,而不是操作數。 轉移位址可以在段内(稱段内轉移),也可以跨段(稱段間轉移)。尋求轉移位址的方法有以下四種 1)段内直接尋址 轉移的位址是目前IP内容和指令規定的8位或16位位移量之和。 當位移量是8位時,稱為短程轉移;位移量是16位時稱為近程轉移。,2021年2月8日 24,這種尋址方式适用于條件轉移或無條件轉移類指令。但條件轉移隻有8位位移量的短程轉移。目前IP,有效轉移位址,opcode,位移量,PM,CS 10H EA位移量,2021年2月8日 25,例JMP SHORT ALPHA 本例指令是一無條件轉移指令,指令采用了段内直接尋址方式。符号位址ALPHA代表位移量。設ALPHA20H,開始執行該指令時,CS1500H,IP3200H,于是該指令在存儲器中的起始位址為 15000H3200H18200HOP,20H,存儲器,15000H,18200H,18201H,18202H,18222H,20H,目前代碼段首位址,JMP SHORT ALPHA,轉移位址,而轉移有效位址為 EA目前IPALPHA3202H20H3222H 轉移實體位址為 PA15000H3222H18222H 執行完這條指令後,IP的内容變成3222H不再是3202H,CPU将轉移到存儲單元位址18222H中去取指令來執行。,2021年2月8日 26,2)段内間接尋址方式 程式轉移的位址存放在寄存器或存儲器單元中。指令執行使用寄存器或存儲器單元的内容來更新IP的内容。,例如 JMP BX JMP WORD PTR ADDR JMP WORD PTR BXARRY,2021年2月8日 27,例JMP WORD PTR BETA 本指令是無條件轉移指令,可使程式轉移到根據BETA訓示的記憶體單元中取出的偏移位址開始執行指令。指令采用的是段内間接尋址方式。指令的操作數位址是一個符号位址BETA,是以可用資料尋址方式中的直接尋址方式得到存儲轉移偏移位址的記憶體單元位址。設目前CS0120H,IP2400H,BETA0100H,DS2000H,20100H00H,20101H27H,則存儲轉移偏移位址的記憶體單元位址為 DS左移4位BETA20000H0100H 20100H 又20100H00H,20101H27H,即轉移實體位址為 PA01200H2700H03900H 執行完這條指令後,IP的内容變成2700H,CPU将轉移到存儲單元03900H去執行程式。OP,OP,00H存儲器01200,03600,03601,03602,03900,目前代碼段首址,JMP WORD PTR BETA,轉移位址00H,27H,01H,20000,20100,20101,資料區首位址,036032700HIP2021年2月8日 28,3)段間直接尋址方式 這種尋址方式是指令碼中直接給出16位的段位址和16位的偏移位址用來更新目前的CS和IP内容。,2021年2月8日 29,例JMP FAR PTR GAMMA 本例指令為無條件轉移指令,采用段間直接尋址方式。設目前CS2000H IP1000H GAMMA30004000 則本指令的起始位址為 20000H1000H21000H 轉移實體位址為 PA30000H4000H34000H 執行完這條指令後,CS的内容變成3000H,IP的内容變成4000H,進而程式轉移到存儲單元34000H開始執行。,2021年2月8日 30,4)段間間接尋址方式 這種尋址方式是由指令碼的尋址方式位元組求出存放轉移位址的連續兩個字的位址。其低位字位址單元中存放的是偏移位址,高位字位址單元中存放的是轉移段位址。,2021年2月8日 31,例JMP DWORD PTR DELTABX 本例指令是無條件轉移指令,采用段間間接尋址方式。 設目前CS1000H,IP0100H,DS2000H,BX3000H,DELTA0040H,23040H00H,23041H50H,23042H00H,23043H30H,則間接存儲位址按寄存器相對尋址為 DS左移4位BXDELTA20000H3000H0040H 23040H 于是,可得轉移位址為 3000H5000H 即轉移實體位址為 PA30000H5000H35000H 執行本指令後,CS的内容和IP的内容分别變成3000H和5000H,程式轉移到存儲單元35000H開始執行。,2021年2月8日 32,指令執行前 CS1000H IP0100H DS2000H BX3000H DELTA0040H 指令執行後 CS3000H IP5000H,2021年2月8日 33,段間間接尋址方式,段間直接尋址方式段間直接和間接尋址的差別,2021年2月8日 34,4.1.3 8086/8088指令系統 8086/8088指令系統大緻可分為六大類指令 資料傳送類指令 算術運算類指令 位操作類指令 串操作類指令 程式控制類指令 處理器控制類指令 學習指令系統着重要掌握指令的基本操作功能、合法的尋址方式及其對狀态标志位的影響。,2021年2月8日 35,1. 資料傳送類指令 資料傳送指令的主要功能是傳送資料、位址和标志。可分為通用資料傳送指令、輸入輸出指令、位址傳送指令和标志傳送指令。 1)通用資料傳送指令 通用資料傳送指令可完成位元組或字資料的傳送。它可分為資料傳送指令、堆棧操作指令、資料交換指令和位元組轉換指令。 1 資料傳送指令 指令格式MOV dst,src ;dstsrc,src表示源操作數字/位元組 立即數操作數 寄存器操作數(包括段寄存器) 存儲器操作數,dst表示目的操作數字/位元組 寄存器操作數不包括IP,CS段寄存器 存儲器操作數,2021年2月8日 36段寄存器 CS DS SS ES,存儲器,通用存儲器 AX BX CX DX BP SP SI DI AL BL CL DL AH BH CH DH,MOV指令資料傳送方向,16位,8/16位,8/16位,16位,8/16位,指令功能将源操作數傳送(複制)到目的操作數。 傳送方向如下圖所示。,立即數2021年2月8日 37,2 堆棧操作指令 堆棧操作指令是用來完成壓入和彈出堆棧操作的。80868088指令系統中提供了完成這兩種操作的相應指令。 壓入堆棧指令 指令格式及操作 PUSH src ;SPSP-2, ;SP1SPsrc,src表示源操作數字 寄存器操作數(包括段寄存器) 存儲器操作數,2021年2月8日 38,注意堆棧指令的操作數隻能是字操作數(即16位操作數),且不能是立即數。 進棧操作(PUSH)先移後進 出棧操作( POP)先出後移, 彈出堆棧指令 指令格式及操作 POP dst ;dstSP1SP, ;SPSP2,dst表示目的操作數字 寄存器操作數不包括IP,CS段寄存器 存儲器操作數,2021年2月8日 39,3)交換指令 指令格式及操作 XCHG opr1,opr2 ;opr1opr2 注意交換指令的兩個操作數可以是寄存器操作數,存儲器操作數,但都不能是立即數操作數,也不能同時為存儲器操作數;寄存器操作數是指通用寄存器,不包括段寄存器。 也就是說,交換指令是完成寄存器與寄存器、寄存器與存儲器之間的資料互換功能。交換的兩個資料可以是8位的,也可以是16位的。,2021年2月8日 40,4)位元組轉換指令 指令格式及操作 XLAT src_table ;AL BXAL XLAT指令是用來将一種位元組代碼轉換成另一種位元組代碼。即将BX的内容(代碼表格首址src_table)和AL的内容(表格偏移量)相加作為有效位址。并從中讀出此記憶體表格位址單元的内容傳送到AL累加器中。 XLAT指令還可以有以下幾種表示形式 XLAT ;不寫操作數 XLATB ;有B就不允許再寫操作數。 XLAT ESsrc_table ;重設段寄存器為ES,2021年2月8日 41,例在記憶體的資料段有一張16進制數的ASCII碼表,其首位址為Hex_table,如下圖所示,為欲将十六進制數0AH轉換成ASCII碼,則可用以下幾條指令實作 MOV BX, OFFSET Hex_tale;BX 表首址 MOV AL, 0AH ;AL 十六進制數A XLAT Hex_table;查表轉換,BX 1000H,AX 000AHHex_table,2021年2月8日 42,2 輸入/輸出指令 輸入輸出指令可以分為兩大類一類是直接端口位址的輸入輸出指令;一類是通過DX寄存器間接端口位址的輸入輸出指令。 1 輸入指令 直接尋址的輸入指令 指令格式及操作 IN acc, port ;accport 其中acc為8位或16位累加器AL/AX。port為8位端口位址,故可尋址256個端口。,2021年2月8日 43, 間接尋址的輸入指令 指令格式及操作 IN acc, DX ;accDX 其中acc為8位或16位累加器AL/AX。DX為16位間接尋址的端口位址寄存器,故可尋址64K個端口。 2 輸出指令 直接尋址的輸出指令 指令格式及操作 OUT port, acc ;portacc,2021年2月8日 44, 間接尋址的輸出指令 指令格式及操作 OUT DX, acc ;DXacc,2021年2月8日 45,3 位址傳送指令 1)取有效位址指令 指令格式 LEA reg16, mem 此指令的功能是将存放源操作數的16位偏移位址即有效位址EA送到一個16位的通用寄存器中。即源操作數必須是一個存儲器操作數,目的操作數必須是一個寄存器操作數。例如 LEA BX, buffer LEA AX, BPDI LEA DX, betyBXSI,2021年2月8日 46,注意LEA指令和MOV指令的異同,比較下面兩組指令 不同LEA BX,buffer ;将存儲器buffer的偏 移位址送到BX MOV BX,buffer ;将存儲器buffer的内 容傳送到BX 相同LEA BX,buffer MOV BX,OFFSET buffer 以上兩條指令都是将存儲器buffer的偏移位址送到BX。其中OFFSET buffer 表示存儲器偏移位址。,2021年2月8日 47,2)位址指針裝入DS指令 指令格式 LDS reg16,mem32 此指令的功能是将源操作數所對應的雙字長的記憶體單元中的高字内容(一般為16位段基址)送入DS,低字内容(一般為偏移位址)送入指令所指定的寄存器中。例如 LDS DI,2130H,2021年2月8日 48,3)位址指針裝入ES指令 指令格式 LES reg16,mem32 此指令的功能是将源操作數所對應的雙字長的記憶體單元中的高字内容(一般為16位段基址)送入ES,低字内容(一般為偏移位址)送入指令所指定的寄存器中。例如 LES DI,2130H,2021年2月8日 49,4 标志傳送指令 1)取标志指令 指令格式 LAHF 2)置标志指令 指令格式 SAHF,OF,DF,IF,TF,SF,ZFAFPFCF,FLAG,AH,LAHF和SAHF指令操作示意圖,2021年2月8日 50,3)标志壓入堆棧指令 指令格式及操作 PUSHF ;SPSP-2, SP1;SPFLAG 4)标志彈出堆棧指令 指令格式及操作 POPF ;FLAGSP1;SP, SPSP2,2021年2月8日 51,在使用這些傳送類指令時應注意以下幾點 目的操作數不能為立即數。 目的操作數為段寄存器CS不能作為目的操作數,源操作數不能為立即數。 源操作數為非立即數時,兩操作數之一必須為寄存器操作數。 操作數類型必須一緻。 用BX、SI、DI來間接尋址時,預設的段寄存器為DS;用BP來間接尋址時,預設的段寄存器為SS。,2021年2月8日 52, 對于堆棧操作,源操作數不能為立即數;CS寄存器的值可以壓入堆棧,但反之則不允許。 資料交換指令的兩個操作數任一都不能是立即數。 換碼指令的操作數是一種特殊的基址變址尋址方式,基址寄存器為BX,變址寄存器為AL。 除了SAHF和POPF指令外,其餘指令都不會影響标志。,2021年2月8日 53,2、算術運算類指令,80868088有豐富的算術運算指令,而且可以處理4種類型的資料,如下表所示,2021年2月8日 54,1 加法指令,在微處理器中,沒有專用的BCD碼運算指令,使用二進制運算指令進行BCD碼數的運算,然後用BCD碼運算調整指令進行調整,重新得到BCD碼的結果。,2021年2月8日 55,AAA指令的操作為非壓縮型BCD碼調整) 如果AL0FH9 或 AF1 則ALAL06H AHAH1 AF1 CFAF ALAL0FH 否則ALAL0FH DAA指令的操作為 壓縮型BCD碼調整) 如果AL0FH9, AF1 則ALAL06H AF1 如果AL9FH 或 CF1 則ALAL60H CF1,2021年2月8日 56,例要求計算兩個十進制數之和,78。可用以下指令實作 非壓縮型BCD碼調整 MOV AX, 0007H;AL07H,AH00H MOV BL, 08H;BL08H ADD AL, BL;AL0FH AAA;AL05H,AH01H ;CFAF1 壓縮型BCD碼調整 MOV AX, 0007H;AL07H,AH00H MOV BL, 08H;BL08H ADD AL, BL;AL0FH DAA;AL15H,AH00H;CF0,AF1,2021年2月8日 57,例要求計算兩個十進制數之和,5634。可用以下指令實作壓縮型BCD碼調整 MOV AX, 3456H;AL56H,AH34H ADD AL, AH ;AL8AH DAA ;AL90H 例要求計算兩個BCD數的ASCII碼之和,即 59。可用以下指令實作ASCII碼調整 MOV AL, 5 ;AL35H ADD AL, 9 ;39H,AL6EH MOV AH, 0 ;AH00H AAA;AH01H,AL04H OR AX,3030H;AX3134H,即34,2021年2月8日 58,2 減法指令,2021年2月8日 59,AAS指令的操作為 非壓縮型BCD碼調整 如果 AL0FH9 或 AF1 則ALAL06H AHAH1 AF1 CFAF ALAL 0FH 否則ALAL 0FH DAS指令的操作為 壓縮型BCD碼調整 如果AL0FH9, AF1 則ALAL06H AF1 如果AL9FH 或 CF1 則ALAL60H CF 1,2021年2月8日 60,例要求計算兩個十進制數之差,86-7。可用以下指令實作 非壓縮型BCD碼 MOV AX, 0806H;AH08H,AL06H SUB AL, 07H;AX08FFH AAS ;AX0709H 例要求計算兩個十進制數之差,134-56。可用以下指令實作 壓縮型BCD碼 MOV AX, 5634H;AH56H,AL34H SUB AL, AH;ALDEH,有借位 DAS ;AL78H,2021年2月8日 61,3 乘法指令,AL,源操作數,AL,AH,AX,源操作數,AX,DX,2021年2月8日 62,AAM指令的操作為将二進制數轉換成十進制數 AHAL/0AH的商;即AL除以10,商送AH ALAL/0AH的餘;即AL除以10,餘數送AL 例要求進行以下十進制乘法運算79 解可程式設計式段如下 MOV AL,07H ;AL07H MOV BL,09H ;BL09H MUL BL ;AX07H09H003FH AAM ;AH06H,AL03H,2021年2月8日 63,4除法指令,2021年2月8日 64,8086/8088CPU執行除法時規定除數隻能是被出數的一半字長。當被除數為16位時,除數應為8位;當被除數為32位時,除數應為16位。,AL,源操作數,AX,AH,AX,AX,源操作數,DX,DX,商,商,餘數,餘數,8位,16位,16位,32位,除數,除數,被除數,被除數,2021年2月8日 65,AAD指令的操作為十進制數轉換成二進制數 ALAH0AHAL AH0 例要進行以下十進制除法運算732 解可程式設計式段如下 MOV AH,07H ;AH07H MOV AL,03H ;AL03H MOV BL,02H ;BL02H AAD ;AL49H即十進制數73 DIV BL ;AL24H商,AH01H餘數 AAM ;AH03H,AL06H,2021年2月8日 663.位操作類指令 位操作指令是對8位或16位的寄存器或存儲單元中的内容按位進行操作。這一類指令包括邏輯運算指令、移位指令和循環移位指令等三組。 1 邏輯運算指令 邏輯運算類指令與算術運算指令不同,算術指令是按位元組或字進行算術運算,而邏輯運算指令是把操作數按位來進行邏輯運算。,2021年2月8日 67說明TEST相當于AND運算,但是不儲存結果,僅影響标志。,2021年2月8日 68,常見的用法舉例 清進位标志位AND AX,AX 或 OR AL,AL等。 清零操作數XOR AX,AX 不僅把AX清零,而且也影響了狀态标志。 把某幾位取反用XOR指令,把要取反的位和1異或,不變的位和0異或。 清零或置位某幾位用AND指令清零,用OR指令置位。,2021年2月8日 69,2 移位操作指令 該類指令的使用方法是 移動1位,用類似于 SHL AX,1的格式 移動n位,用類似于 SHL AX,CL的格式CFdstCF0,dstCF0,dstCF0,dst,2021年2月8日 70,說明 邏輯移位适用于無符号數,算術移位适用于有符号數。 邏輯左移和算術左移的機器碼完全相同,是助記符的兩種寫法。,2021年2月8日 71,說明 循環移位常用來變換資料格式。CFdst,CFdst,CFdstCFdst,2021年2月8日 72,使用舉例 例一 利用循環移位指令可以對寄存器或存儲器中的任一位進行測試。如要測試AL寄存器中的第5位的狀态是“0”還是“1”,則可利用以下 指令實作 MOV CL,5;CL移位次數 ROR AL,CL;CFAL的第5位 JNC ZERO;若CF0,轉ZARO ;否則 ZERO ,2021年2月8日 73,例二 利用帶進位循環移位指令可以實作将兩個以上寄存器或存儲器單元組合起來一起移位。如DX和AX兩個寄存器組成的32位數乘以2,可用以下兩條指令實作 SHL AX,1 ;AX左移1位,CFAX的最高位 RCL DX,1 ;DX帶進位左移1位,DX的最低位CF 具體操作如下圖,CF,DX,AX,0, RCL DX,1, SHL AX,1,2021年2月8日 744.串操作指令 串操作指令的特征是對資料塊,也稱資料串 (字元串或數值串)進行操作。其操作數為隐含操作數,并且其中部分指令的兩個操作數可以同時是存儲器操作數。 串傳送 MOVS Move string 串比較 CMPS Compare string 串掃描 SCAS Scan string 串裝入 LODS Load from string 串儲存 STOS Store in to string,2021年2月8日 75,說明 串操作指令每次執行完成一個位元組或一個字的操作。 通常使用重複字首來自動完成一個資料塊(資料串)的操作。 重複字首 REP 重複 REPE/REPZ 相等/為零則重複 REPNE/REPNZ不相等/不為零則重複,2021年2月8日 76,特點 串操作指令需要指明每次操作的資料串資料的類型B表示位元組串,W表示字串。 例如MOVSB, CMPSW等。 串操作指令使用DSSI作為源操作數的指針;ESDI作為目的操作數的指針 使用DF來表示每次操作以後變址寄存器SI和DI的變化方向 CLD ;DF0 SI,DI做增量變化 B1或W2 STD ;DF1 SI,DI做減量變化 B-1或W-2 使用CX來表示用重複字首以後指令需要重複執行的次數(通常是資料串的長度),2021年2月8日 77,2021年2月8日 78,2021年2月8日 795.控制轉移類指令 能夠使程式的執行流程發生改