微機原理、接口與匯編語言2.1_第1頁
微機原理、接口與匯編語言2.1_第2頁
微機原理、接口與匯編語言2.1_第3頁
微機原理、接口與匯編語言2.1_第4頁
微機原理、接口與匯編語言2.1_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

課堂練習1、8086/8088系統中,設CS=0914H,共有243字節(jié)長的代碼段,該代碼段末地址的邏輯地址(段地址:偏移地址)和物理地址各是多少?2、若DS=095FH,物理地址是11820H。當DS=2F5FH時,物理地址為多少?3、設SP=0040H,如果用進棧指令存入5個數據,則SP=_____,若又用出棧指令取出2個數據,則SP=______。用機器指令編寫的程序叫機器語言程序。機器指令組成的指令系統叫機器語言。用80X86的機器語言編程序,在屏幕上顯示“3”。B233B402CD21CD20第2章匯編語言與匯編程序第2章匯編語言與匯編程序用80X86的(?。﹨R編語言編寫實現上述功能的程序MOVDL,33HMOVAH,02HINT21HINT20H這樣的指令叫符號指令、匯編指令或助記符指令。第2章匯編語言與匯編程序用匯編語言編寫的程序叫匯編語言源程序。把匯編語言源程序翻譯成機器語言程序計算機才能執(zhí)行。把匯編語言源程序翻譯成機器語言程序的程序叫匯編程序。翻譯過程叫匯編。指令是對數據進行操作的,在計算機中數據又稱為操作數。存放操作數的存儲單元的地址或寄存器的地址(寄存器名)稱為操作數地址。為簡化表示,在匯編語言中操作數和操作數地址有時統稱為操作數。同一個操作數可以有多種不同的表達方式,這要服從方便程序設計的需要。2.1符號指令中的表達式2.1符號指令中的表達式例如MOVAL,36H可以寫成MOVAL,20H+16H還可以寫成MOVAL,6*9等等如何表達更能反映程序設計者的意圖,就如何表達。2.1.1常量1.常量常量是在程序運行過程中數值不變的量,可以以數值形式出現在符號指令中。稱為數值常量。也可以對經常使用的常數預先定義一個名字,然后用該名字表示該常量。稱為符號常量。數值常量允許有多種表示形式二進制(以B結尾)十進制十六進制(以H結尾)ASCⅡ碼字符(用單引號‘括起來)例如MOVAL,36HMOVAL,00110110BMOVAL,54MOVAL,’6’是等價的符號常量由偽指令EQU或“=”定義,如PEQU314或P=314符號常量不占用存儲單元,可改善程序的可度性。2.數值表達式匯編語言允許對常量進行算術(+、-、х、/、MOD)運算,邏輯(AND、OR、XOR、NOT)運算和關系(EQ、NE、LT、GT、LE、GE)運算.由常量和這三種運算符組成的有意義的式子,叫數值表達式。數值表達式的值在匯編時由匯編程序計算,其結果仍是一個常量。2.1.2標號標號是指令地址的符號表示,代表所在指令的地址。指令可以有標號,也可以沒有標號,當某條指令作為轉移指令的轉移目標時,就必須有標號。如:L1:MOVAL,BLADDAL,30H…….JZL1指令的標號后面要有冒號“:”標號也可以是過程(子程序)名,代表過程中第一條指令的地址。例如BCDADDPROCNEARMOVAL,04HADDAL,BLDAARETBCDADDENDPBCDADD是過程名,代表過程中第一條指令(MOVAL,04H)的地址,PROC是過程定義偽指令,偽指令左邊的標號(BCDADD)后不加冒號“:”。2.1.3變量1、變量和地址表達式變量與數據區(qū)內存單元相對應。變量名即是數據的地址或數據區(qū)的首地址。由于存儲器是分段使用的,因此變量具有三重屬性:段基址、偏移地址和類型。變量的段基址就是變量所在段的起始地址。變量的偏移地址是指變量所在段的段基址到該變量的字節(jié)距離。由變量、標號、帶方括號的寄存器(SI、DI、BX、BP)、常量和運算符組成的有意義的式子叫地址表達式。2、變量的段基址和偏移地址的指定算符變量的段基址的高16位用算符SEG來指定如:MOVAX,SEGX表示取變量X的段基址到AX變量的偏移地址算符OFFSET來指定如:MOVBX,OFFSETX表示取變量X的偏移地址到BX3、變量的類型屬性及變量的定義變量的類型是指存取該變量中的數據所需的字節(jié)數。變量的類型可以是字節(jié)(byte)、字(word)、雙字(dword)、6字節(jié)(fbyte)、4字(qword)和10字節(jié)(tbyte)。變量用下列數據定義偽指令來定義:DB(定義字節(jié))、DW(定義字)、DD(定義雙字)、DF(定義6字節(jié))、DQ(定義4字)、DT(定義10字節(jié))。格式是:[變量名]數據定義偽指令表達式[,….]表達式可以是(1)數值表達式(2)ASCⅡ碼字符串,若用DB定義,則按順序存放,長度不限;若用DW定義,則2個1組。(3)地址表達式(只適用于DW、DD和DF)DW定義一個16位偏移地址來初始化變量DD定義段基址的高16位和一個16位偏移地址來初始化變量DF定義段基址的高16位和一個32位偏移地址來初始化變量(只適用于386及后來機型)。(4)nDUP(表達式)n是重復因子,DUP是重復字句,表達式是重復的內容(5)?表示預留空間(6)以上表達式組成的序列,各表達式用逗號分隔。DATASEGMENTB1DB23H,56,10110011B,’AB$’B2DB2DUP(-5,-1)DB2DUP(10,’E’),’23’,1,4W1DW2345H,‘CD’,’RE’W2DWB2W3DDEWEWDWW1DATAENDS2、變量存儲區(qū)中數據的存放80X86系列微型機,為了與早期的機器實現軟件兼容和移植,存儲器按字節(jié)編址,可按字節(jié)、字、雙字等訪問(80386以后),數據在數據區(qū)的存放如下(以前面的定義為例)DATA0000偏移地址000100020003000400050006000700080009000A000B000C000D000EDATA000F偏移地址0010001100120013001400150016001700180019001A001B001C001D23H38HB3H41H42H24HFBHFFHFFHFBH0AH45H0AH45H32H33H01H04H45H23H44H43H45H52H06H00H1EH00HXXXXDATA001E001F0020002112H00H5.地址表達式類型的變更或臨時指定變量和標號都有類型屬性,由其組成的地址表達式也有類型屬性。地址表達式的類型屬性由其中的變量或標號決定。不含變量或標號,僅含寄存器或直接地址形式沒有類型屬性。在程序設計時有時需要對沒有類型屬性的地址表達式臨時指定合適的類型屬性或臨時改變原有的類型屬性。對沒有類型屬性的地址表達式指定類型屬性例MOVAL,[1000H]MOVAX,[1000H]INC[1000H]хINCBYTEPTR[1000H]臨時改變地址表達式的類型屬性設變量W1用DW定義為字變量,一次訪問一個字(16位),要臨時訪問它的一個字節(jié),必須改變它的類型屬性為字節(jié)。

MOVAL,BYTEPTRW1設X是用DB定義的字節(jié)變量

MOVAL,X同樣也可以把定義為字節(jié)的變量臨時指定為字,并進行訪問。指令中指出操作數及操作數地址或下一條指令地址的方式稱為尋址方式.80X86機器指令有0個或多個操作數。某些操作數是顯式規(guī)定的,有的是指令中隱含的。一個操作數能定位在以下地方之一:(1)指令中(立即數)(2)寄存器(3)存儲單元(4)I/O端口2.280X86的尋址方式2.2.1、寄存器(直接)尋址

操作數在CPU內部寄存器中,指令給出寄存器名(地址),稱為寄存器尋址方式。例如:MOVAL,BLADDSI,AX2.2.2立即尋址指令所用的8位或16位操作數由指令本身提供(無需再尋,立即可得),這種方式叫立即尋址方式。例如:MOVAL,30HMOVBX,1090H立即數只能是整數,不能是小數、變量或其他類型的數據。立即數只能是源操作數。立即數的大小應于目的操作數相適應MOVAL,120H!!MOVSI,30H2.2.3直接尋址操作數在存儲器的某存儲單元中,指令直接給出存儲單元的有效地址。例如:MOVAL,[1000H]ES:MOVAX,[2008H];ES稱為段超越前綴MOVAL,VAR;VAR已定義為字節(jié)變量.

MOVAX,Y;Y已定義為字變量.注意:源和目的的類型要一致2.2.4寄存器間接尋址操作數在存儲器的某存儲單元中,存儲單元的有效地址由下列寄存器之一指出(BX,BP,SI,DI),指令給出寄存器名,稱為寄存器間接尋址。有以下幾點需要說明:1.BX和BP稱為基址寄存器,SI和DI稱為變址寄存器,SI又叫源變址寄存器,DI又叫目的變址寄存器,使用BX、SI和DI寄存器間接尋址時,默認的段寄存器是DS,使用SI和DI的寄存器間接尋址又叫變址尋址.使用BX寄存器的間接尋址常稱為數據段基址尋址。使用BP寄存器間接尋址時,默認的段寄存器是SS。使用BP寄存器的間接尋址常稱為堆棧段基址尋址。例如:設SI=1000H,DI=1200H,BX=2000H,BP=1500H,DS=1000H,SS=1100H,分析下列各指令內存操作數的物理地址(PHA)MOVAL,[BX];PHA=?MOVAL,[SI];PHA=?MOVAL,[DI];PHA=?MOVAL,[BP];PHA=?2.2.5基址尋址BX和BP稱為基址寄存器,SI和DI稱為變址寄存器有效地址由基址寄存器和一個偏移量決定時,稱為基址尋址MOVAL,[BX+100H];MOVAL,[BP]+1000H;當基址寄存器為BP時,隱含訪問堆棧段。當基址寄存器為BX時,隱含訪問數據段。2.2.6變址尋址變址寄存器為SI和DI,SI稱為源變址寄存器,DI稱為目的變址寄存器,一般情況下兩個變址寄存器用法相同,只是在數據串操作時有源和目的之分。MOVAL,100[SI];MOVAX,[DI+200];變址尋址和基址尋址用法相同,通常用來訪問一維數組。MOVAL,VAR[SI];VAR是用DB定義的字節(jié)數組首地址,SI若等于0,則訪問數組的第一個元素,SI若等于1,則訪問數組的第二個元素。2.2.7.

基址變址尋址.

將BX、BP和SI、DI寄存器及偏移量組合起來進行尋址稱為基址變址尋址。EA={BX或BP}+{SI或DI}+disp可有以下幾種組合[BX+SI+disp];[BX+DI+disp];[BP+SI+disp];[BP+DI+disp];基址變址尋址方式地址表達式的幾種合法形式MOVAL,100[BX][SI]ADDAL,[BX+SI+100]ADDAL,[BP+DI]+var;設VAR是字節(jié)變量ADDAL,[BP+DI]+100ADDAL,[BX]+[SI]+1002.2.8比例變址尋址80386及后繼微處理器可用地址表達式中含有變址寄存器和比例因子。比例因子可以是1、2、4、8。不帶比例因子的可認為比例因子是1。如MOVEBX,ARRAY[ESI×4]每次操作后,只要使ESI+1,而不是+4,就可以訪問下一個雙字元素。2.2.9基址比例變址尋址80386及后繼微處理器可用80386后的微機,8個32位寄存器EAX….EDI,每一個都可作為基址寄存器,每一個又都可作為變址寄存器,基址比例變址尋址就是兩個32位寄存器(其中1個帶比例因子)的內容構成地址表達式。例MOVECX,[EDI×4+EAX]MOVEAX,[ESI×4+EBX]在80386~Pentium,8個32位通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP都可以作為地址寄存器。在8086中指令MOVBX,[AX]是非法的,因為只有(SI,DI,BX,BP)可以作為地址寄存器。在Pentium中,MOVEBX,[EAX]是合法的。在8086中movax,bl非法,因為類型不同在Pentium中,允許下列指令MOVZXEAX,BL;BL零擴展后送EAXMOVSXEAX,BL;BL符號擴展后送EAX設BL=80H2.2.10存儲器尋址及段基或段選擇字的確定1、存儲器尋址與地址表達式若指令操作的數據在存儲器的數據區(qū),相應的尋址方式叫存儲器尋址。包括直接尋址、寄存器間接尋址、基址尋址、變址尋址、基址變址尋址及386后的比例變址尋址和基址比例變址尋址。這個由匯編程序根據尋址方式計算得到的偏移地址通常稱為有效地址EA(affectveaddress)。不同的尋址方式都可用用地址表達式概括。2、存儲器尋址中段寄存器的確定80X86的存儲器總是分段使用的,要指出操作數的地址,除了偏移地址(由尋址方式確定)外,還要由段基址。變量有段屬性,當指令中給出變量名時,選擇哪個段寄存器的值作為段基址(或段選擇字)是由變量定義時確定的,但很多情況下指令中不用變量名訪問存儲器。選擇哪個段寄存器的值作為段基址(或段選擇字)呢?80X86有一個基本約定,只要指令不特別說明要超越(臨時改變)這個約定,就按這個約定來尋找操作數。取指令:偏移地址IP(EIP)約定段寄存器CS(不允許超越)堆棧操作(PUSH、POP、CALL、RET中斷等):偏移地址SP(ESP)約定段寄存器SS(不允許超越)數據存?。ǖ刂繁磉_式中不出現BP或EBP寄存器)偏移地址EA約定段寄存器DS(允許超越)例:MOVAL,[1000H]MOVAL,[SI]MOVAL,[DI+100]ADDAL,[BX+SI+100H]數據存?。ǖ刂繁磉_式中出現BP或EBP寄存器)偏移地址EA約定段寄存器SS(允許超越)字符串處理指令源串偏移地址SI(ESI)約定段寄存器DS(允許超越)字符串處理指令目的串偏移地址DI(EDI)約定段寄存器ES(不允許超越)如何實現段超越?加段超越前綴,例MOV[DI],ALMOVES:[DI],AL其中ES是前綴字節(jié),譯成機器碼時,放在指令的前邊。MOV[DI],AL的機器碼是8805MOVES:[DI],AL的機器碼是2688052.3常用指令80X86具有復雜的指令系統其中常用指令分為以下幾類:傳送指令算術運算指令邏輯運算和移位指令控制轉移指令串操作指令2.3.1數據傳送類指令數據傳送類指令包括通用數據傳送指令;擴展傳送指令;數據交換指令;堆棧操作指令;地址傳送指令;查表轉換指令六類。1.)通用傳送指令(1)最基本的傳送指令MOV指令格式:MOV目的操作數,源操作數目的操作數可以是:累加器、通用寄存器、除CS之外的段寄存器、存儲器源操作數可以是:累加器、通用寄存器、段寄存器、存儲器、立即數.源和目的類型要一致.源和目的不可同為存儲器1.)通用傳送指令源為立即數時,目的不可段寄存器用BX、SI、DI間接尋址時,默認的段寄存器是DS,用BP間接尋址時,默認的段寄存器是SS。但可以使用段超越前綴臨時改變這種默認。例MOVAX,BXMOVAL,DHMOVCX,DIMOVES,AXMOVBX,CSMOVBP,SIMOVAL,28HMOVBX,1000MOVSI,OFFSETTABLEMOVSP,0A002HMOVAL,XMOVAX,[SI]MOVLAST[BX+DI],DLMOVSI,ES:[BP]MOVDS,100[BX+SI]MOV[1000H],ESMOVALFA,25MOVES:MSM[BP],300AHMOVBYTEPTR[SI],23MOVWORDPTR[2000H],20Hwordptr和byteptr的作用moval,23hmovax,23hmov[si],23hmov[2000h],23hmovbyteptr[si],23hmovwordptr[2000h],23h例判斷下列指令是否合法?

MOVAL,BXMOVBX,ALMOVAL,260HMOV[SI],23HMOVDS,2000HMOVAX,CSMOVCS,SIMOVAL,[DX]MOVAX,ARRAY;ARRAY是變量名2、擴展傳送指令(80386后)(1)符號擴展傳送指令指令格式MOVSXreg,source指令意義,對源操作數中的8位或16位符號數擴展,形成16位或32位補碼數例:MOVSXEAX,BX若執(zhí)行前BX=8765H,執(zhí)行后,EAX=FFFF8765H(2)零(zero)擴展傳送指令指令格式MOVZXreg,source指令意義,對源操作數中的8位或16位無符號數擴展,形成16位或32位無符號數。例MOVZXEAX,BL指令若執(zhí)行前BL=89H,執(zhí)行后EAX=00000089H3、數據交換指令(1)字節(jié)、字和雙字交換指令指令格式:XCHGdest,source將源地址的內容與目的地址的內容交換可以有三種形式XCHGREG,REGXCHGREG,MEMXCHGMEM,REG例交換字變量W1和字變量W2的內容MOVAX,W1XCHGAX,W2MOVW1,AX不用交換指令,程序會長一些MOVAX,W1MOVBX,W2MOVW2,AXMOVW1,BX(2)32位通用寄存器中4字節(jié)交換指令(80486以后可用)指令格式BSWAPreg指令的意義是把32位寄存器的第1字節(jié)與第4字節(jié)交換,第2字節(jié)與第3字節(jié)交換。例BSWAPEAX若執(zhí)行前EAX=12345678H執(zhí)行后EAX=78563412H4、棧操作指令(1)堆棧的概念現代計算機,堆棧是在存儲器中開辟的一片數據存儲區(qū),這片存儲區(qū)的一端固定,另一端活動,且只允許數據從活動端進出。堆棧中的數據遵循“先進后出”的原則。堆棧的活動端稱為棧頂,固定端稱為棧底。對80X86,堆棧必須存放在堆棧段,其段地址存放于堆棧段寄存器SS中。因為棧頂是活動的,所以需要有一個指示棧頂位置的寄存器,叫堆棧指示器,它總是指向棧頂。當堆棧地址長度為16位時用SP作堆棧指示器,當堆棧地址長度為32位時用ESP作堆棧指示器。80X86的堆棧的伸展方向是從高地址向低地址。80X86的堆棧操作是字(16位)操作或雙字(32位)操作。把一個數據壓入堆棧也稱為進棧,進棧時堆棧指示器自動減2或減4。把把一個數據從堆棧中彈出稱為出棧,出棧時堆棧指示器自動加2或加4。堆棧的設置主要解決多級中斷、子程序嵌套、遞歸調用等難以處理的實際問題。利用堆棧還可以保護現場,在主程序與子程序之間傳遞參數等。中斷響應時,由中斷隱指令自動實現將斷點壓入堆棧,通過執(zhí)行中斷返回指令,從堆棧中彈出返回地址(恢復斷點)。調用子程序時,用CALL指令實現將返回地址壓入堆棧,通過執(zhí)行返回指令,從堆棧中彈出返回地址。若要在中斷服務程序保存現場與恢復現場則要使用進棧指令PUSH和出棧指令POP。(2)進棧指令PUSHsourceSource可以是16(32)位通用寄存器、段寄存器、存儲器字或雙字單元。80386及以后的CPU允許將立即數(用PTR算符說明類型)壓入堆棧。例如PUSHAX;設AX的內容是1234H。SP=0040HSP=003EH1234執(zhí)行前執(zhí)行后(3)出棧指令POPdest出棧指令的意義:彈出棧頂元素到destdest可以是:字或雙字通用寄存器,除CS之外的段寄存器或存儲器。如果dest是類型不明的存儲器時,需要用PTR算符說明其類型屬性。例如POPAXPOPWORDPTR[SI]利用堆??梢詫蓚€存儲字(W1和W2)交換。PUSHW1PUSHW2POPW1POPW2因為W1、W2都有類型屬性,不必加PTR算符。(4)全部通用寄存器進棧指令PUSHA/PUSHAD和出棧指令POPA/POPAD(80386后)PUSHA將16位通用寄存器按以下順序進棧AX、CX、DX、BX、SP(指令執(zhí)行前的值)、BP、SI、DI。執(zhí)行后SP-16。PUSHAD將32位通用寄存器依次進棧,進棧順序是:EAX、ECX、EDX、EBX、ESP(指令執(zhí)行前的值)、EBP、ESI、EDI。指令執(zhí)行后ESP-32。POPA將8個棧頂元素(字)按PUSHA指令相反的順序彈出到8個16位通用寄存器。POPAD將8個棧頂元素(雙字)按PUSHAD指令相反的順序彈出到8個32位通用寄存器。(5)狀態(tài)標志寄存器的進棧指令和出棧指令PUSHF16位狀態(tài)標志寄存器進棧POPF16位狀態(tài)標志寄存器出棧PUSHFD32位狀態(tài)標志寄存器進棧POPFD32位狀態(tài)標志寄存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論