匯編程序設計課件_第1頁
匯編程序設計課件_第2頁
匯編程序設計課件_第3頁
匯編程序設計課件_第4頁
匯編程序設計課件_第5頁
已閱讀5頁,還剩193頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一章匯編語言基礎知識匯編語言是一種符號語言,它屬于低級語言。1、優(yōu)點:直接與計算機硬件對話,匯編的指令是與機器指令一一對應的,因此匯編語言的運行效率高。2、缺點:程序繁瑣,匯編語言編寫程序時,必須考慮包括寄存器、存儲單元和尋址方式在內的幾乎所以的細節(jié)問題。3、使用場合:(1)對軟件的執(zhí)行時間或存儲容量有較高要求的場合,例如系統(tǒng)程序的關鍵核心、智能化儀表的控制系統(tǒng)等(2)需要提高大型軟件性能的場合。(3)軟件與硬件關系密切,軟件要有直接和有效控制硬件的場合,如驅動程序。(4)沒有合適的高級語言的場合。第一節(jié)有符號數和無符號數

一、數制的轉換1、常用的進位數制:二進制R=2基本符號0、1(B)八進制R=8基本符號0、1、2、3、4、5、6、7(O)十進制R=10基本符號0、1、2、3、4、5、6、7、8、9(D)十六進制R=16基本符號0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F(H)2、位權:(253)10=2×102+5×101+3×100=253(11111101)2=1×27+1×26+1×25+1×24+1×23+1×22+0×21+1×20=253(375)8=3×82+7×81+5=253(FD)16=15×161+13=2533、數制間轉換十進制二進制:整數部分除2取余法,小數部分承2取整法十進制八進制:整數部分除8取余法,小數部分承8取整法十進制十六進制:整數部分除16取余法,小數部分承16取整法二進制八進制:二進制3位為8進制一位二進制十六進制:二進制4位為16進制1位二、有符號數的補碼表示大多少計算機都采用補碼的表示方法。正數x的補碼就是x的機器數:[+1]補=00000001

最高為0為符號位,表示正數

負數x的補碼由(2n-|x|)表示:n表示字長,即一個二進制數的最高位數。[-1]補=28-1=255=11111111[-127]補=28-127=129=10000001[-128]補=28-127=129=10000000[-0]補=28-0=256=000000008位有符號數補碼表示數的范圍是:-128~12716位有符號數補碼的表示范圍是:-32768~32767或8000H~7FFFH

例1-1求117和-117的8位補碼117=1110101-117=256-117=139=100010110111010110001011求負數補碼的簡便方法:先寫出與其絕對值相等的正數補碼,然后按位求反,最后在末位加1。正數117的補碼為:01110101按位求反,結果為:10001010末位加1,結果為:10001011我們把按位求反末位加1的運算稱為求補運算。以補碼表示的數據有以下性質:[+X]補求補運算[-X]補求補運算[+X]補性質1:性質2:[X+Y]補=[X]補+[Y]補性質3:[X-Y]補=[X]補-[Y]補三、補碼的加法和減法加法:不必判斷正負,將符號位一起參加運算就可以得到正確的結果。減法:可將減數求補后變成加法進行運算,同樣可以得到正確的結果。例1-2求5-3

等價于[5]補+[-3]補00000101+1111110100000010進位

例1-3求25-3200011001+1110000011111001溢出錯誤:運算結果超出規(guī)定字長的補碼所能表示的范圍。例1-4求98+11701100010+0111010111010111

例1-5求(-20)+(-117)11101100+1000101101110111為了得到正確的結果,應將表示數的位數擴展到16位,或者32位1514高位低位0150四、無符號數8位無符號數的范圍:0~255或0~FF16位無符號數的范圍:0~65535或0~FFFF210=1024,通常稱為1K220=1024×210=1024K=1M216=26×210=64×1024=64K32位的有符號數稱為雙精度數,它的低16位可以看成是無符號數五、字符的ASCII碼計算機從鍵盤接收的信息,以及打印或顯示的信息,都是以字符方式輸入輸出的。目前最常用的字符編碼稱為ASCII碼(AmericanStandardCodeforInformationInterchange)字符ASCII字符ASCII字符ASCII字符ASCII響鈴07030A41a61換行0A131B42b62回車0D

空格20838Y5Ay7A$24939Z5Bz7B匯編語言常用的7位ASCII碼(16進制數表示)10000011100001A的ASCII碼值校驗位41Ha的ASCII碼值校驗位61H第二節(jié)存儲器本書的匯編語言是針對Intel8086/8088這兩種微處理器的計算機編寫的。

微處理器存儲器接口電路外設數據總線地址總線控制總線

數據總線:8086的外部數據總線是16位的,8088的外部數據總線是8位。地址總線:8086和8088的地址總線都是20位的。

20位地址總線可訪問內存的最大容量是220=1M一、存儲單元的地址和內容計算機中存儲的數據,每8個二進制位組成一個存儲單元,每個二進制位給予一個編號。1111111101234567D7D6D5D4D3D2D1D01、存儲單元存儲器是以字節(jié)為單位存取信息的,存儲器中的一個字節(jié)稱為一個單元。為了正確的存放和讀取信息,每一個字節(jié)單元都有一個地址,稱為存儲器地址。2、存儲器地址:地址單元的編號:地址從0開始編號,依次加116位地址線可以表示的地址范圍:216=26×210=64×1024=64K用16進制數表示:0000H~FFFFH20位地址線可以表示的地址范圍:220=1M00000H~FFFFFH在16位字長的計算機中,大部分數據都是以字為單位的。111111111111111101213456789101112131415高位字節(jié)MSB低位字節(jié)LSB一個字存入存儲器時,要占用相繼的兩個存儲單元。存放原則:低位字節(jié)存入低地址單元,高位字節(jié)存入高地址單元。001101000011010000010010內存儲器0000H0001H0002H0003H0004H0005H0006H0007H(0001H)=34H(0004H)=1234H(00004H)=34H總結:(1)用存儲單元的地址外面加括號的方法來表示一個存儲單元的內容。如(00004H)=34H,(00004H)=1234H(2)一個字要存入存儲器中要占用相繼的兩個存儲單元,存放時,低位字節(jié)存入低地址單元,高位字節(jié)存入高地址單元。(3)同一個存儲單元的地址既可以看成是字節(jié)單元的地址,又可以看成是字單元的地址。字單元的地址采用它的低字節(jié)單元的地址來表示。二、存儲器地址的分段8086/8088處理器的計算機中,內存儲器的最大容量為1M,每個存儲器單元的地址應該用20個二進制位來表示。用16進制數表示這1M字節(jié)的地址范圍應該是:00000H~FFFFFH物理地址:每個存儲單元有一個唯一的20位地址,稱為該存儲單元的物理地址。16位字長的計算機中無法直接訪問20位的地址,這就要借助于存儲器地址分段來解決。在1M字節(jié)的內存地址范圍內,從00000H地址開始,每16個字節(jié)劃分成一個小段。00000H~FFFFFH地址范圍內,這樣的小段共有64K個。00000H,00001H,00002H,·······,0000EH,0000FH00010H,00011H,00012H,·······,0001EH,0001FH00020H,00021H,00022H,·······,0002EH,0002FH····················FFFE0H,FFFE1H,FFFE2H,·······,FFFEEH,FFFEFHFFFF0H,FFFF1H,FFFF2H,·······,FFFFEH,FFFFFH特點:第一列是每個小段的首地址,16進制表示的地址中,最低位是0,對應的二進制表示是低4位為0000編寫匯編語言程序時,根據需要可以將1M字節(jié)的地址分為若干段,每個小段最大可達64K。(64K正好可以用16位來表示)00000H,00001H,00002H,······,0FFFEH,0FFFFH10000H,10001H,10002H,······,1FFFEH,1FFFFH20000H,20001H,20002H,······,2FFFEH,2FFFFH·······················E0000H,E0001H,E0002H,······,EFFFEH,EFFFFHF0000H,F0001H,F0002H,······,FFFFEH,FFFFFH把每段起始地址的高16位稱為段地址。把段內各個單元相對于段起始地址稱為該單元的偏移地址。20位的物理地址可以由16位的段地址和16位的偏移地址組成。計算方法如下:16位段地址000016位段地址0000+20位物理地址10H×段地址+偏移地址=物理地址通常把物理地址用段地址和偏移地址來表示,寫成段地址:偏移地址這種形式表示的地址稱為邏輯地址,它與物理地址是一一對應的。例1-6已知段地址和偏移地址為301AH:008AH,試問它的物理地址是什么?301A0H008AH+3022AH編寫匯編語言程序時,通常將程序所需要的存儲空間分成:代碼段:存放當前正在運行的程序;數據段:存放當前運行程序所需要使用的數據;堆棧段:“堆?!笔且环N特殊存儲區(qū),要以先進后出的方式訪問該存儲區(qū)里的數據。附加段:是附加數據段,是一個輔助數據區(qū)。在8086/8088處理器中,有4個專門用來存放段地址的寄存器:CS(代碼段)、DS(數據段)、SS(堆棧段)、ES(附加段)。每個段可以獨立占用64K存儲區(qū),各段存儲區(qū)也可以重疊,段的大小可以根據需要來分配。一般情況下,各段的段地址由操作系統(tǒng)來分配。注意:存儲單元內容是不能沖突的。例1-7若用戶程序的分段情況為:代碼段需要8K(2000H)存儲區(qū),數據段需要2K(800H),堆棧段需要256個字節(jié)的存儲區(qū)。假定操作系統(tǒng)從02000H單元開始分配存儲區(qū),則此時的分段情況為:02000H04000H03FFFH047FFH04800H048FFH0200H0400H0480HCSDSSS代碼段CS(8K)(0200)02000,02001,02002,···0200F············03FF0,03FF1,03FF2,···03FFF0000,0001,0002,···,000F············1FF0,1FF1,1FF2,···,1FFF數據段DS(2K)(0400)04000,04001,04002,···0400F·············047F0,047F1,047F2,···047FF0000,0001,0002,···,000F············07F0,07F1,07F2,···,07FF堆棧段SS(256)(0480)04800,04801,04802,···0480F··············048F0,048F1,048F3,···048FF0000,0001,0002,···,000F············00F0,00F1,00F2,···,00FF各段物理地址和偏移地址之間的關系物理地址偏移地址不同地址段,部分偏移地址是相同的。DS:0100表示數據段中偏移地址為0100H的存儲單元的物理地址ES:0100表示附加段中偏移地址為0100H的存儲單元的物理地址DS:[0100H]表示數據段中偏移地址為0100H的存儲單元的內容ES:[0100H]表示附加段中偏移地址為0100H的存儲單元的內容第三節(jié)8086/8088微處理器一、8086/8088微處理器的組成Intel8086/8088微處理器組成:運算器、控制器和內部可編程序寄存器。他們之間通過總線相互連接。CPU的任務:執(zhí)行存放在存儲器里的指令序列。ALU的作用:進行算術和邏輯計算。

控制邏輯部件作用:負責整個控制工作,包括從存儲器取出指令,對指令進行譯碼分析,從存儲器取得操作數,發(fā)出執(zhí)行指令的所有命令,把結果存入存儲器,以及對總線和I/O傳輸的控制等??删幊炭刂破髯饔茫哼\算器的存儲單元DLDHCLCHBLBHALAHAXBXCXDX數據寄存器控制邏輯ALUPSWIPDISIBPSP指針及變址寄存器ESSSDSCS段寄存器8086/8088的CPU組成AHALBHBLCHCLDHDLAXBXCXDX1.數據寄存器二、寄存器也稱通用寄存器,計算機工作時,用來暫時存放運算過程中所用到的操作數、結果數據或其它信息。AX常作為累加器使用,是算術運算時的主要寄存器。所有的輸入輸出指令都使用它與外部設備傳送信息BX常用于存放或計算存儲器的偏移地址,又稱為基址寄存器。CX常用于循環(huán)和串操作指令中的計數器。DX常專用于雙字長運算時,與AX組合在一起,存放一個雙字長數,DX存放高位,AX存放低位。此外,有些輸入輸出指令中,也用DX來存放I/O的端口地址。CSDSSSES2.段寄存器CS代碼段寄存器DS數據段寄存器SS堆棧段寄存器ES附加段寄存器3.指針及變址寄存器SPBPSIDI用于運算過程中存放操作數,但只能以字(16位)的形式使用。最常用于在段內尋址時提供偏移地址。SP稱為堆棧指針寄存器,用來指示堆棧棧頂的偏移地址,它與堆棧段寄存器SS一起,確定堆棧頂存儲單元的物理地址。BP稱為基址指針寄存器,用來指示堆棧區(qū)的偏移地址SI稱為源變址寄存器,DI稱為目的變址寄存器,它們大多與數據段寄存器DS一起使用,用來確定數據段中某一存儲單元的物理地址。在串操作指令中,這兩個寄存器分別用來存放兩個操作數存放單元的偏移地址,其特點是具有自動增量和自動減量的功能。由于SI和DI有自增和自減的功能,所以它們常被稱為變址寄存器。PSW4.控制寄存器IP都是16位的寄存器IP是指令指針寄存器,用來存放代碼段中的偏移地址。程序運行過程中,它始終指向下一條指令開始的偏移地址(也就是首地址)。IP與代碼段寄存器CS一起,確定出下一條指令的物理地址。計算機就是用IP寄存器來控制指令序列的執(zhí)行流程的。PSW是程序狀態(tài)寄存器(標志寄存器),是一個16位寄存器,它由條件碼標志和控制標志構成。OFDFIFTFSFZFAFPFCF0123456789101112131415溢出標志方向標志中斷標志陷阱標志符號標志零標志輔助進位標志

奇偶標志進位標志OF(OverflowFlag),運算過程中,如果操作數超出規(guī)定字長所能表示的范圍,則稱為溢出。溢出時,OF位為1,否則為0條件碼標志:用來記錄程序中運行結果的狀態(tài)信息。SF(SignFlag),記錄運算結果的符號,結果為負時置1,負責置0ZF(ZeroFlag),運算結果為0時置1,否則置0CF(CarryFlag),運算時,如果最高有效位產生進位或錯位,CF位置1,否則置0。AF(AuxiliarycarryFlag),運算時,如果D3位有進位值,則AF位置1,否則置0PF(ParityFlag),用來為機器中傳送信息時可能產生的代碼出錯情況提供檢驗條件。當結果操作數中1的個數為偶數時,PF位置1,否則置0??刂茦酥荆篋F(DirectionFlag),DF在使用串操作指令時進行設置。當DF為1時,每次執(zhí)行串操作后,變址寄存器SI和DI自動減量;當DF為0時,SI和DI自動增量。IF(InterruptFlag),當IF位為1時,允許中斷,否則關閉中斷。TF(TrapFlag),TF用于程序調試時的單步方式操作。當TF位為1時,每條指令執(zhí)行完后產生一個內部中斷(陷阱),以便逐條指令地對程序進行檢查;TF位為0時,CPU正常工作,步產生內部中斷。由條件碼表達的各種狀態(tài)信息,是由CPU根據計算的結果自動設置的。由控制標志表達的控制信息,是由系統(tǒng)程序或第四節(jié)8086/8088尋址方式一、8086/8088指令的組成操作碼字段:指示計算機要執(zhí)行的操作。操作數字段:指出指令執(zhí)行過程中所需要的數據。按操作數的多少可以把指令分為:單操作數指令:操作碼操作數(INC、JMP、NEG)也稱為一地址指令雙操作數指令:操作碼操作數,操作數(MOV、ADD)也稱為二地址指令第一個操作數稱為目的操作數(DST)第二個操作數稱為源操作數(SRC)隱含操作數指令:操作碼(CLC)無操作數指令:NOP偽指令:不產生機器指令,只完成如數據定義、分配存儲區(qū)及指示程序結束等。按存儲方式不同,操作數可以分為以下三類:立即數:操作數直接存在指令代碼中。寄存器操作數:操作數存在寄存器中。存儲器操作數:操作數存在存儲器中。指令用什么方式來指定操作數的地址呢?尤其是當操作數存放在內存儲器時,怎么來表示20位的地址呢?二、符號地址用匯編語言編程時,必須先使用段定義偽指令將存儲器進行分段,然后在所定義的數據段中用數據定義偽指令來為數據分配存儲單元。段定義偽指令的格式:<段名>SEGMENT·····<段名>ENDS各段的地址是由操作系統(tǒng)分配的,但可以用段名來代表該段的地址。匯編語言中的命名規(guī)則:必須由英文字母開頭,后面跟隨英文字面或數字等有效字符;名字的長度不大于31字符;英文字母大小寫沒有區(qū)別。例1-8下面程序中,定義了一個名為DATA的數據段和一個名為CODE的代碼段。DATASEGMENTBVARDB65H,37HDB100,?WVARDW3526H,0A48HDATAENDS

CODESEGMENTSTART:MOVAX,100INCAL······LABEH:ADDAX,45H······CODEENDS名為DATA的數據段名為CODE的代碼段數據定義偽指令的格式是:

[<變量>]<助記符><操作數>[,<操作數>······][;<注釋>]BVARDB65H,37H<助記符>數據定義偽指令:DB偽指令:用來定義字節(jié),其后每個操作數都占有一個字節(jié)單元。DW偽指令:用來定義字,其后每個操作數都占有一個字單元。DD偽指令:用來定義雙字,其后的每個操作數都占有兩個字單元。DQ偽指令:用來定義4個字,其后每個操作數都占有8個字節(jié)單元。DT偽指令:用來定義10個字節(jié),其后每個操作數都占有10個字節(jié)單元。653764預留字節(jié)2635480A數據段BVAR0000H0001H0002H0003H0004H0005H0006H0007HBVARDB65H,37HDB100,?WVARDW3526H,0A48HBVAR代表65H所在單元的偏移地址BVAR+1代表37H所在單元的偏移地址BVAR+2代表100所在單元的偏移地址WVAR代表3526H所在字單元的偏移地址WVAR+2代表0A48H所在字單元的偏移地址WVAR為了避免編程時計算出每個操作數地址的麻煩,在匯編語言程序中一般不直接使用數值地址,而是使用BVAR和WVAR等的符號地址。一個數值地址既可以看作是字節(jié)單元的地址,也可以看作是字單元的地址。對于符號地址:BVAR為字節(jié)單元地址,由偽指令DB來確定。WVAR為字單元地址,由偽指令DW來確定。利用變量表示偏移地址:

MOVBX,OFFSETWVAR利用變量表示段地址:MOWAX,SEGWVAR變量的屬性:偏移屬性,段屬性,類型屬性。指令的地址:編程時所寫的匯編格式的指令,經過匯編程序翻譯成二進制的機器代碼,在存儲器中,有的指令占一個字節(jié)單元,有的占兩個或兩個以上的字節(jié)單元,計算起來非常復雜,所以源程序中也常用符號來代表某一條指令的地址,這個符號稱為標號START:MOVAX,100INCAL······LABEH:ADDAX,45H······標號的取名要符合規(guī)則標號的三種屬性:類型屬性、偏移屬性、段屬性。類型屬性:NEAR,僅限于本段引用

FAR,可以段間引用默認為NEAR三、數據的尋址方式指令格式:操作碼操作數,操作數在指令中用來表明操作數存放在哪里的方法,在匯編語言里稱為尋址方式分為:立即數尋址、寄存器尋址、存儲器尋址1.立即數尋址操作數直接存放在指令中,它作為指令的操作數字段存放在代碼段中。指令的代碼中立即能取到它,所以稱為立即數尋址。立即數是個常數,可以是8位,也可以是16位??梢杂梅柎娉担脗沃噶頔QU或“=”定義。只能用于源操作數字段。例1-9MOVAL,08H

目的操作數,源操作數

AL08HAH保持原值不變例1-10MOVAX,30HDST,SRCAX30HAH=00H例1-11MOVAX,3162HDSTSRCAX3162HAL=62H,AH=31H2.寄存器尋址方式當操作數是在某個寄存器中,就在指令中用寄存器的名字代替該操作數,即寄存器尋址方式。例1-12MOVAX,BX指令執(zhí)行前:AX=3064H,BX=1234H指令執(zhí)行后:AX=1234H,BX=1234H3.直接尋址方式在指令的操作數字段中直接給出操作數的偏移地址,這個偏移地址作為指令的一部分存放在指令代碼中。真正參加運算的操作數cpu通過地址運算找出。例1-13如果要把數據段中偏移地址為2000H的存儲單元的內容傳送給AX,用直接尋址方式,則指令可寫成:

MOVAX,DS:[2000H]存儲單元的內容是用偏移地址加[]來表示的,文字敘述中常改為圓括號。設DS=3000H,(32000H)=50H,(32001H)=30H指令執(zhí)行后,AX=3050H代碼段0020數據段50H30H30000H32000H32001H······例1-14設在數據段中已經定義了一個字變量為VALUE:

VALUEDW3050H要把VALUE所指單元的內容送給AX,用直接尋址方式:

MOVAX,[VALUE]

或MOVAX,VALUE

如果恰好VALUE=2000H

例1-14設在數據段中已經定義了一個字變量為VALUE:

VALUEDW3050H要把VALUE所指單元的內容送給AX,用直接尋址方式:

MOVAX,[VALUE]

或MOVAX,VALUE

如果恰好VALUE=2000H,DS=3000H如果變量的類型屬性是字節(jié),則直接尋址方式的正確寫法是:

MOVAL,[VALUE]

或MOVAL,VALUE

代碼段0020數據段50H30H30000H32000H32001H4.寄存器間接訪問指令寄存器間接尋址方式不是在指令中直接給出操作數的偏移地址,而是把操作數的偏移地址放在基址寄存器BX與BP或變址寄存器SI與DI中。MOVAX,DS:[BX]這里BX的內容是偏移地址,[BX]表示該偏移地址單元的內容設BX=1000H,則[BX]表示偏移地址為1000H的存儲單元的內容。寄存器間接尋址方式物理地址的求法:(1)操作數的偏移地址存放在BX或SI或DI,操作數存在數據段(DS)物理地址=16×DS+BXSIDI(2)如果操作數的偏移地址存放在BP寄存器中,而操作數在堆棧段物理地址=16×SS+BP注意:除輸入/輸出指令外,能用來表示操作數偏移地址的寄存器只能是BX,BP,SI和DI可以省略段寄存器的情況(段缺?。海?)基址寄存器BX或變址寄存器SI,DI表示操作數的偏移地址,而操作數在數據段;(2)基址寄存器BP表示操作數的偏移地址,而操作數在堆棧段。不可以省略段寄存器的情況(段超越):

不是上述兩種情況的,都要寫名段寄存器

MOVAX,ES:[SI]MOVAX,DS:[BP]注意:在直接尋址方式中,如果使用的是數值地址,如MOVAX,DS:[2000H]則段寄存器不能省略。否則MOVAX,[2000H]2000H會被當成立即數來處理。

MOVAX,DS:[2000H]直接尋址方式

MOVAX,[2000H]立即數尋址方式例1-15若有DS=2000H,SI=1000H,(21000H)=A0H,(21001H)=50H。那么指令:MOVAX,[SI]執(zhí)行后,AX里的內容是什么?數據段20000H21000H21001H2000H1000HDS:SI:

+A0H50HAHAL寄存器間接尋址方式適用于表格數據的處理,即存儲器中連續(xù)存放多個同類型數據的情況:

WVARDW3456H,5317H,4680H,DW2178H,1200HMOVBX,OFFSETWVARMOVAX,[BX]

以后每次使BX加2,就可以找到下一個數據的偏移地址如果尋址方式中使用了變量(符號地址),則不用考慮段超越的問題,因為變量使在某個段內定義的,具有段屬性。5.寄存器相對尋址方式如果指令中操作數的偏移地址是由一個基址或變址寄存器的內容和指令中指定的8位或16位偏移量構成的,那么這種尋址方式稱為寄存器相對尋址方式。其中的8位偏移量是個有符號數(用補碼表示),16位偏移量可以是有符號數,也可以是符號地址(無符號數)。用EA表示操作數的偏移地址:EA=BXBPSIDI+8位16位偏移量例1-16指令:

MOVAX,COUNT[BX]或MOVAX,[BX+COUNT]以上兩種寫法的含義是一樣的。已知DS=3000H,BX=2000H,COUNT=1500H則EA=BX+COUNT=2000H+1500H=3500H

物理地址=30000H+3500H=33500H若執(zhí)行指令前(33500H)=1234H那么執(zhí)行指令后AX=1234HCOUNT可以是常數,也可以是符號地址,事先都要用偽指令定義。

COUNTEQU1500HCOUNTDW1500H當COUNT是8位有符號數時,要將它擴展到16位后才能于寄存器里的內容相加。例如:

MOVAX,-1[BX]-1FFHFFFFH偏移地址=20000H+FFFFH=1FFFH寄存器相對尋址方式也有段超越的問題。寄存器相對尋址方式非常使用于對表格數據的處理:例如,在數據段以WVAR為起始地址的存儲區(qū)中定義有如下數據:

WVARDW35465317HH,4680H,2178H,1200HWVAR3456HWVAR+25317HWVAR+44680HWVAR+62178HWVAR+81200H讀取數據的時候可以寫成:

MOVAX,WVAR[BX]或MOVAX,[BX+WVAR]通過修改基址寄存器BX里的內容,很容易對以上的5個數進行讀取和修改。6.基址變址尋址方式如果操作數的偏移地址是由一個基址寄存器和一個變址寄存器內容之和構成的,那么這種尋址稱為基址變址尋址方式。例1-17指令:

MOVAX,[BX+SI]或MOVAX,[BX][SI]注意:在這種尋址方式中,指令里涉及的變址寄存器只能是一個,下面寫法是錯誤的。

MOVAX,[BX+SI+DI]7.相對基址變址尋址方式如果操作數的偏移地址是由一個基址寄存器和一個變址寄存器的內容以及指令中指定的8位或16位偏移量之和構成的,那么這種尋址方式稱為相對基址變址尋址方式。例1-18指令:

MOVAX,COUNT[BX+SI]或MOVAX,COUNT[BX][SI]這種尋址方式是基址變址尋址方式和相對尋址方式的結合。用EA表示操作數的偏移地址:EA=BXBPSIDI+8位16位偏移量SIDI+例1-19已知DS=1530H,SI=122H,BX=240H。若源操作數的物理地址為15662H,請用兩種不同的尋址方式,寫出將物理地址15662H單元的內容傳送給AX的指令。解:由于DS×16+DI=15662H,因此可以用寄存器間接尋址方式得到源操作數的物理地址,指令格式為:

MOVAX,[DI]

另外,DS×16+(BX+SI)=15662,因此又可以用基址變址尋址方式得到源操作數的物理地址,指令格式為:

MOVAX,[BX+SI]例1-20在數據段中定義了如下數據:

WVARDW?,?

XVARDW5286H用不同的尋址方式將XVR單元的5286H傳送給AX。解:立即數尋址方式:

MOVAX,5286H

直接尋址方式:

MOVAX,XVAR

寄存器間接尋址:

MOVBX,OFFSETXVARMOVAX,[BX]

寄存器相對尋址:

MOVBX,OFFSETWVARMOVAX,4[BX]基址變址尋址方式:

MOVBX,OFFSETWVARMOVSI,4MOVAX,[BX+SI]相對基址變址尋址方式:

MOVBX,2MOVSI,2MOVAX,WVAR[BX+SI]總結:立即數尋址寄存器尋址存儲器尋址存儲器器直接尋址寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址MOVAX,30HMOVAX,BXMOVAX,DS:[2000H]或MOVAX,VALUEMOVAX,[BX]MOVAX,COUNT[BX]MOVAX,[BX+SI]MOVAX,COUNT[BX][SI]簡答題:

1.在數據段中有如下定義的數據:

BVALDB0C8H,58H設BVAL=257AH,BX=178AH,SI=0DF0H,DI=0DE0H,BP=257AH;偏移量:DSP=10H,DIP=179AH。請用存儲器操作數的5種尋址方式將兩字節(jié)數據傳送到AX寄存器中。直接尋址:MOVAL,DS:[257AH]或MOVAL,BVAL寄存器間接尋址:MOVAL,DS:[BP]寄存器相對尋址:MOVAL,DIP[DI]基址變址尋址:MOVAL,[BX+SI]相對基址變址尋址:MOVAL,DSP[BX+DI]2.在數據段中有如下定義的數據:

WVALDW340,256,178H,116H,280H,5FF0H。請用存儲器操作數的5種尋址方式將兩字節(jié)數據5FF0H傳送到AX寄存器中。直接尋址:MOVAX,[WVAL+10]間接尋址:MOVBX,OFFSETWVALADDBX,0AHMOVAX,[BX]相對尋址:MOVBX,OFFSETWVALMOVAX,10[BX]基址變址:MOVBX,OFFSETWVALMOVSI,0AHMOVAX,[BX+SI]

相對基址變址:MOVBX,06HMOVBX,04HMOVAX,WVAL[BX+SI]第一節(jié)數據傳送指令數據傳送指令負責把數據、地址或立即數傳送到寄存器或存儲單元中。通用數據傳送指令地址傳送指令查表指令標志寄存器傳送指令I/O指令

存儲器

通用寄存器AXBXCXDX指針及變址寄存器BPSPSIDI

立即數段寄存器CSDSSSES一、通用數據傳送指令1.MOV指令指令格式:MOVDST,SRC;B/W功能:DST

(SRC)指令格式注釋MOVREG1,REG2寄存器之間進行數據傳送MOVMEM,REG寄存器內容傳送至存儲單元MOVREG,MEM存儲單元內容送至寄存器MOVREG,DATA立即數傳送至寄存器MOVMEM,DATA立即數傳送至存儲單元MOVSEGREG,REG寄存器內容傳送至段寄存器(CS除外)MOVSEGREG,MEM存儲單元內容傳送至段寄存器(CS除外)MOVREG,SEGREG段寄存器內容傳送至寄存器MOVMEM,SEGREG段寄存器內容傳送至存儲單元說明:MOV指令不破壞源操作數內容;立即數不能用做目的操作數,而且立即數也不能直接傳給段寄存器;不允許在兩個存儲單元間傳送數據,因為總線上不能同時出現兩個地址,可以先將第一個存儲單元的內容送寄存器,再將寄存器內容送存儲單元;源操作數SRC可以選用CS、SS、DS和ES段寄存器,目的操作數DST只能選SS、DS和ES,不允許使用段寄存器CS;MOV指令不影響標志位;可以是字節(jié)傳送,也可以是字傳送,但源和目的操作數的數據位數必須一致,即均為字節(jié)或字。MOVAX,DATAMOVDS,AXMOVAX,MEM1MOVMEM2,AXMOV指令格式1:MOVREG1,REG2;B/W可采用寄存器:8位寄存器AH,AL,BH,BL,CH,CL,DH,DL16位寄存器AX,BX,CX,DX,BP,SP,SI,DI例1以下指令可以實現數據在寄存器間傳送

MOVAX,BXMOVCL,DHMOVBX,SIMOVDI,DX下面指令是錯誤的:MOVBL,DXMOV指令格式2:MOVMEM,REG;B/W存儲器操作數MEM可采用:寄存器直接尋址,寄存器間接尋址,寄存器相對、基址變址和相對基址變址等尋址方式。例2MOVMEMBYTE,DX其中,MEMBYTE是存儲單元的符號地址,DS=3000H,MEMBYTE=1200H;執(zhí)行指令前,DX=5A7CH,(31200H)=A8H,(31201H)=20H問指令執(zhí)行后DX,31200H,31201H的內容?MOV指令格式3:MOVREG,MEM;B/W例3MOVAX,Y[BP][SI]若SS=2000H,SI=0020H,BP=1020H,Y=1000H物理地址=20000H+0020H+1020H+1000H=22040H······00H26H······AHAL22040H22041H20000HSS其它方法MOVBX,MEMBYTEMOVSI,COUNT[BX]MOVCX,[BX]MOVDX,ES:[BX][SI]MOV指令格式4:MOVREG,DATA例4MOVBX,OFFSETTABLEMOVBL,OFFSETTABLE······00H26H······21434H20000H21435HBH=12HBL=34HMOV指令格式5:MOVMEM,DATADATA可以是8位立即數,也可以是16位立即數。立即數可以是各種數制的ASCII字符,也可以是符號名。由于存儲器的地址既可以表示字節(jié)地址,也可以表示字地址,因此對存儲器操作數MEM必須做數據類型說明說明方法:BYTEPTR或WORDPTR例5MOVBYTEPTR[MEM],78H功能:將78H送入字節(jié)存儲單元MEM中如:DS=3000H,MEM=2200H執(zhí)行指令前,(32200H)=52H執(zhí)行指令后,(32200H)=78H例6MOVWORDPTR[MEM],6789H功能:將78H送入字存儲單元MEM中如:DS=3000H,MEM=2200H執(zhí)行指令前,(32200H)=52H,(32201H)=00H執(zhí)行指令后,(32200H)=89H,(32201H)=67HMOV指令格式6:MOVSEGREG,MEM/REG;WSEGREG可以用SS,DS,ES但不能用CS本指令只能是字操作。例7MOVAX,DATA-AEGMOVDS,AX如果指令執(zhí)行前用偽指令定義DATA-SEG=1000H,則指令執(zhí)行后DS=1000H注意:不能用MOV指令實現立即數至段寄存器的傳送。MOV指令格式7:MOVMEM/REG,SEGREG與格式6方向相反,SEGREG可以是4個段寄存器。例9MOVBX,ESMOVMEM,DSMOVARRAY[BX][DI],SSMOVAX,CS例10寫出把首地址為BUFFER1的100個字節(jié)送到BUFFER2的指令序列MOVSI,OFFSETBUFFER1MOVDI,OFFSETBUFFER2MOVCX,100NEXT:MOVAL,[SI]MOVBYTEPTR[DI],ALINCSIINCDIDECCXJNZNEXTHLT2.堆棧操作指令堆棧是內存中開辟出的一個特殊存儲區(qū)。堆棧是以“先進后出”的方式進行數據操作的。在計算機中用來保護現場。堆棧操作有兩種:入棧--PUSH

出棧--POP注意(1):進?;虺鰲V噶钍褂玫牟僮鲾当仨毷?6位的寄存器或、段寄存器(CS不能是出棧操作數)、存儲器,不能是立即數。(2)每執(zhí)行一次PUSH指令,SP減2,沒執(zhí)行一次POP指令SP加2(3)PUSH指令執(zhí)行結果不能影響標志位。(4)使用堆棧保護寄存器內容和恢復時,要注意“先進后出”的原則。(5)8086/8088的堆棧是從高地址向低地址方向生長的。堆棧只有一個出口,,堆棧指針SP總是指向棧頂。1AH45HSS高地址低地址SP棧低棧頂(1)PUSH入棧指令指令格式:PUSHSRC執(zhí)行的操作:第一步:SPSP-2

第二步:SP+1SRC高8位

SPSRC低8位例2-2假定當前有:SP=0114H,AX=3428H,執(zhí)行指令:

PUSHAX后,棧頂元素的內容是什么?···56H1C···28H34H56H1CHSP0114HSP0114H0113H(SP+1)0112H(SP)(2)POP出棧指令指令格式:POPDST執(zhí)行操作:第一步:DST(SP+1)SP

第二步SPSP+2例2-3設SS=2000H,SP=114H,(20114H)=3428H,DS=0150H,BX=1000H,執(zhí)行指令POP[BX]后,由目的操作數所指字存儲單元的內容是什么?堆棧段···28H34H56H1CH····堆棧段···28H34H56H1CH···數據段···28H34HSPSPSSSSDS0114H1000H1001H3.XCHG交換指令格式:XCHGOPR1,OPR2;B/W執(zhí)行操作:兩個操作數OPR1和OPR2相互交換操作數只能是寄存器與寄存器寄存器與存儲器例2-4若有DS=2000H,AX=1024H,BX=1000H,(21000H)=4B5CH,那么執(zhí)行指令:

XCHGAX,[BX]后,寄存器和存儲器的內容如何變化?二、地址傳送指令1.LEA偏移地址傳送指令LEA偏移地址送寄存器指令LDS指針送寄存器和DS指令LES指針送寄存器和ES指令格式:LEAREG,SRC執(zhí)行的操作:REGSRC的偏移地址SRC只能是各種尋址方式的存儲器操作數。REG只能是16位寄存器,不能使用立即數、8位寄存器和段寄存器。LEA指令執(zhí)行結果不影響標志位。取單元地址而不是取單元內容,與MOVBX,OFFSETVALUE等價。例2-5假定有DS=2000H,VABLE=1000H,(21000H)=4B5CH,其中符號地址VABLE可以是變量或標號,那么執(zhí)行指令:

LEABX,VABLE執(zhí)行指令后BX=1000H例:LEABX,[BX+SI+0F62H]執(zhí)行指令前,BX=0400H,SI=003CH執(zhí)行指令后,BX=0400H+003CH+0F62H=139EH2.LDS指針送寄存器和DS指令格式:LDSREG,SRC執(zhí)行操作:(1)REG(SRC)(2)DS(SRC+2)SRC為雙字的存儲器操作數的首地址,前兩個字節(jié)為偏移地址,送入REG寄存器(常使用SI),后兩個字節(jié)為段地址,送入DS寄存器。REG只能用16位寄存器,不能使用立即數、8位寄存器和段寄存器。LDS指令執(zhí)行結果不影響標志位。例:LDSSI,DS:[10H]

已知:DS=C000H···20H00H01H80H···C0010HC0011HC0012HC0013H01H80H20H00HSIDS3.LES指針送寄存器和ES指令格式:LESREG,SRC執(zhí)行操作:(1)REG(SRC)(2)ES(SRC+2)設VABLE是用偽指令DD定義的雙字變量,則指令LDSSI,VABLE執(zhí)行的操作是:SI(VABLE),DS(VABLE+2)LESDI,VABLE執(zhí)行的操作是:DI(VABLE),ES(VABLE+2)三、XLAT查表指令格式:XLAT;B或XLATOPR;B執(zhí)行的操作:AL(BX+AL)只能是字節(jié)操作BX是某表格的首地址AL為相對于表格首地址的8位正偏移量。例2-6在首地址為DAT的單元中,依次存放著大寫字母的ASCII碼:DATDB41H,42H,43H,44H,45H,····5AH,5BH執(zhí)行下列指令:

LEABX,DATMOVAL,4XLAT四、標志寄存器傳送指令1.LAHF標志位送AH寄存器指令格式:LAHFCFPFAFZFSFTFIFDFOF0123456789101112131415AH2.SAHFAH送標志寄存器指令格式:SAHF執(zhí)行操作:AHPSW的低位字節(jié)執(zhí)行操作:PSW的低位字節(jié)AH3.PUSHF標志進棧指令格式:PUSHF執(zhí)行操作:(1)SPSP-2

(2)(SP+1)(SP)PSW4.POPF標志出棧指令格式:POPF執(zhí)行操作:(1)PSW(SP+1)(SP)(2)SPSP+2第二節(jié)算術運算指令一、加減運算指令1.加法指令(1)ADD加法指令格式:ADDDST,SRC;B/W該指令影響標志位:CF、OF、ZF、SF、PF、AF例2-7假定有AL=07H,BL=0FBH,那么執(zhí)行指令:

ADDAL,BL后寄存器的內容,及各標志位內容?計算機執(zhí)行加法指令時,通常把操作數當作有符號數。執(zhí)行的操作:(DST)(SRC)+(DST)00000111+)11111011000000101ALBL執(zhí)行結果:AL=02H,BL=0FBHCF=1,ZF=0,SF=0,PF=0,AF=1,OF=0當無符號數運算產生溢出時,CF=1。當有符號數運算產生溢出時,OF=1。如果運算結果為零,ZF=1。如果運算結果為負數,SF=1。如果運算結果的低8位中有偶數各1,PF=1。例2-8假定有AL=97H,BL=0F5H,那么執(zhí)行指令

ADDAL,BL執(zhí)行指令后各寄存器的及標志位的值?10010111+)11110101100011001ALBL(2)ADC帶進位加法指令格式:ADCDST,SRC;B/W主要用于多字節(jié)(或多字)加法運算,與ADD指令一起完成大于16位二進制數的雙精度數或多精度數的運算。例2-9求兩個無符號雙精度數之和設目的操作數存放在DX,AX寄存器中,其中DX存放高位字;源操作數存在BX,CX寄存器中,其中BX存放高位字。DX=0002H,AX=F365H,BX=0005H,CX=E024H。雙字加法指令序列:

ADDAX,CXADCDX,BX有符號的雙精度數溢出,根據ADC指令執(zhí)行后的OF來判斷執(zhí)行的操作:(DST)(SRC)+(DST)+(CF)實現兩個無符號雙精度數相加的程序清單DATASEGMENTVAR1DWF365H,0002HVAR2DWE024H,0005HVAR3DW?,?DATAENDSCODESEGMENTMOVDI,2LEABX,VAR3MOVAX,VAR1MOVDX,VAR1[DI]ADDAX,VAR2ADCDX,VAR2[DI]MOV[BX],AXMOV[BX+2],DXCODEENDS(3)INC加1指令格式:INCOPR;B/W執(zhí)行操作:(OPR)(OPR)+1OPR可以是寄存器和存儲器操作數,但不能是立即數和段寄存器指令影響OF,SF,ZF,PF,AF,不影響CF位例2-10下面三條指令都是加1指令INC在尋址方式中的應用INCALINCCX

INCBYTEPTR[BX+SI]2.減法指令(1)SUB減法指令格式:SUBDST,SRC;B/W指令影響所以標志位。例2-11假定有AX=9543H,BX=28A7H,那么執(zhí)行指令:

SUBAX,BX執(zhí)行指令后:AX=6C9CH,CF=0,OF=1溢出原因:AX-BX=-27325-10407=-37732(2)SBB帶借位減法指令格式:SBBDST,SRC執(zhí)行操作:(DST)(DST)-(SRC)-CF指令影響所有標志位SBB指令主要用于多字節(jié)或多字減法運算中。假設被減數放在DX,AX中,其中DX存放高位字。減數放在BX,CX中,其中BX存放高位字,則:

SUBAX,CXSBBDX,BX(3)DEC減1指令格式:DECOPR;B/W指令不影響進位標志CF,OPR只能是寄存器或存儲器例2-12設X,Y和Z均為雙精度數,試編寫一段程序,實現W=X+Y+24-ZXDW××××,××××YDW××××,××××ZDW××××,××××WDW?,?······MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2ADDAX,24ADCDX,0SUBAX,ZSBBDX,Z+2MOVW,AXMOVW+2,DX······(4)NEG求補指令格式:NEGOPR;B/W這條指令影響全部標志位(OPR)補=216-|OPR|=FFFFH+1-|OPR|=0-|OPR|0減任何數都需要借位,因此只有對0求補時CF=0,其它情況CF=1當操作數為80H(-128)或8000H(-32768)時,超出運算范圍,OF=1對AX中的操作數求補的方法:方法1:NEGAX方法2:NOTAXINCAX方法3:MOVBX,0XCHGAX,BXSUBAX,BX(OPR)反=FFFFH-OPR(5)CMP比較指令格式:CMPOPR1,OPR2;B/W執(zhí)行操作:(OPR1)-(OPR2)這條指令影響全部標志位對于兩個無符號數比較A-B若CF=1,則A<B;若CF=1且ZF=1,則A<=B;若CF=0且ZF=0,則A>B。

對于兩個有符號數比較A-B若SF=1,則A<B;若SF=0且ZF=0,則A>B;若ZF=1,則A=B若產生溢出,則結論不正確OF=0時,若SF=0且ZF=0,則A>B;若SF=0或ZF=1,則,A>=BOF=1時,若SF=1,則A>B;若SF=0,則,A<BOF異或SF=0,則A>BOF異或SF=1,則A<B二、十進制調整指令0000010001200103001140100501016011070111810009100110進制數與BCD碼對應表壓縮BCD碼非壓縮BCD碼9587

溫馨提示

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

評論

0/150

提交評論