微機系統與接口技術(錢曉捷)第二章_第1頁
微機系統與接口技術(錢曉捷)第二章_第2頁
微機系統與接口技術(錢曉捷)第二章_第3頁
微機系統與接口技術(錢曉捷)第二章_第4頁
微機系統與接口技術(錢曉捷)第二章_第5頁
已閱讀5頁,還剩166頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第2章微處理器內部結構及指令系統2.1微處理器的內部結構從應用角度(不是從內部工作原理)展開典型8位微處理器的基本結構8088/8086的功能結構8088/8086的寄存器結構8088/8086的存儲器結構為學習指令系統打好基礎例如:關心用戶“可編程”寄存器,不關心無法操縱的“透明”寄存器內部數據總線控制總線數據總線地址總線暫存器累加器ALU標志寄存器指令寄存指令譯碼時序和控制邏輯通用寄存器組地址寄存器組地址總線控制數據總線控制2.1.1微處理器的基本結構1.算術邏輯單元(運算器)2.寄存器組3.指令處理單元(控制器)2.1.28088/8086的功能結構8088的內部結構從功能上分成兩個單元1.總線接口單元BIU管理8088與系統總線的接口負責CPU對存儲器和外設進行訪問2.執行單元EU負責指令的譯碼、執行和數據的運算兩個單元相互獨立,分別完成各自操作,還可以并行執行,實現指令預取(指令讀取和執行的流水線操作)2.1.38088/8086的寄存器結構 8088/8086的寄存器組有8個通用寄存器4個段寄存器1個標志寄存器1個指令指針寄存器它們均為16位!圖示

匯編語言程序員看到的處理器,就是寄存器所以,一定要熟悉這些寄存器的名稱和作用1.通用寄存器8088有8個通用的16位寄存器(1)數據寄存器:AXBXCXDX(2)變址寄存器:SIDI(3)指針寄存器:BPSP4個數據寄存器還可以分成高8位和低8位兩個獨立的寄存器,這樣又形成8個通用的8位寄存器AX:AHAL BX:BHBLCX:CHCL DX:DHDL(1)數據寄存器AX稱為累加器(Accumulator)使用頻度最高。用于算術、邏輯運算以及與外設傳送信息等BX稱為基址寄存器(BaseaddressRegister)常用做存放存儲器地址CX稱為計數器(Counter)作為循環和串操作等指令中的隱含計數器DX稱為數據寄存器(Dataregister)常用來存放雙字長數據的高16位,或存放外設端口地址(2)變址寄存器16位變址寄存器SI和DI常用于存儲器變址尋址方式時提供地址SI是源地址寄存器(SourceIndex)DI是目的地址寄存器(DestinationIndex)在串操作類指令中,SI、DI還有較特殊的用法

現在不必完全理解,以后會詳細展開(3)指針寄存器指針寄存器用于尋址內存堆棧內的數據SP為堆棧指針寄存器(StackPointer),指示堆棧段棧頂的位置(偏移地址)BP為基址指針寄存器(BasePointer),表示數據在堆棧段中的基地址SP和BP寄存器與SS段寄存器聯合使用以確定堆棧段中的存儲單元地址堆棧(Stack)是主存中一個特殊的區域,采用“先進后出”或“后進先出”存取操作方式、而不是隨機存取方式。用8088/8086形成的微機系統中,堆棧區域被稱為堆棧段2.指令指針寄存器IP(InstructionPointer)為指令指針寄存器,指示主存儲器指令的位置隨著指令的執行,IP將自動修改以指示下一條指令所在的存儲器位置IP寄存器是一個專用寄存器IP寄存器與CS段寄存器聯合使用以確定下一條指令的存儲單元地址3.標志寄存器標志(Flag)用于反映指令執行結果或控制指令執行形式8088處理器的各種標志形成了一個16位的標志寄存器FLAGS(程序狀態字PSW寄存器)

程序設計需要利用標志的狀態標志寄存器-分類狀態標志--用來記錄程序運行結果的狀態信息,許多指令的執行都將相應地設置它CFZFSFPFOFAF控制標志--可由程序根據需要用指令設置,用于控制處理器執行指令的方式DFIFTFOF111512DF10IF9TF8SF7ZF65AF43PF21CF0標志寄存器FLAGS進位標志CF(CarryFlag)當運算結果的最高有效位有進位(加法)或借位(減法)時,進位標志置1,即CF=1;否則CF=03AH+7CH=B6H,沒有進位:CF=0AAH+7CH=(1)26H,有進位:CF=1零標志ZF(ZeroFlag)若運算結果為0,則ZF=1;否則ZF=03AH+7CH=B6H,結果不是零:ZF=084H+7CH=(1)00H,結果是零:ZF=1

注意:ZF為1表示的結果是0符號標志SF(SignFlag)運算結果最高位為1,則SF=1;否則SF=03AH+7CH=B6H,最高位D7=1:SF=184H+7CH=(1)00H,最高位D7=0:SF=0

有符號數據用最高有效位表示數據的符號所以,最高有效位就是符號標志的狀態奇偶標志PF(ParityFlag)當運算結果最低字節中“1”的個數為零或偶數時,PF=1;否則PF=03AH+7CH=B6H=10110110B結果中有5個“1”,是奇數:PF=0PF標志僅反映最低8位中“1”的個數是

偶或奇,即使是進行16位字操作溢出標志OF(OverflowFlag)若算術運算的結果有溢出,則OF=1;否則OF=03AH+7CH=B6H,產生溢出:OF=1AAH+7CH=(1)26H,沒有溢出:OF=0?溢出和進位的區別溢出標志OF和進位標志CF是兩個意義不同的標志進位標志表示無符號數運算結果是否超出范圍,運算結果仍然正確溢出標志表示有符號數運算結果是否超出范圍,運算結果已經不正確?輔助進位標志AF(AuxiliaryCarryFlag)3AH+7CH=B6H,D3有進位:AF=1運算時D3位(低半字節)有進位或借位時,AF=1;否則AF=0方向標志DF(DirectionFlag)用于串操作指令中,控制地址的變化方向:設置DF=0,存儲器地址自動增加;設置DF=1,存儲器地址自動減少CLD指令復位方向標志:DF=0STD指令置位方向標志:DF=1中斷允許標志IF(Interrupt-enableFlag)控制可屏蔽中斷是否可以被處理器響應:設置IF=1,則允許中斷;設置IF=0,則禁止中斷CLI指令復位中斷標志:IF=0STI指令置位中斷標志:IF=1陷阱標志TF(TrapFlag)用于控制處理器進入單步操作方式:設置TF=0,處理器正常工作;設置TF=1,處理器單步執行指令單步執行指令——處理器在每條指令執行結束時,便產生一個編號為1的內部中斷這種內部中斷稱為單步中斷所以TF也稱為單步標志利用單步中斷可對程序進行逐條指令的調試這種逐條指令調試程序的方法就是單步調試2.1.48088/8086的存儲器結構存儲器是計算機存儲信息的地方。掌握數據存儲格式,以及存儲器的分段管理對以后的匯編程序設計非常重要你能區別寄存器、存儲器(主存)、外存(包括硬盤、光盤、磁帶等存儲介質)嗎?答案寄存器、存儲器和外存的區別寄存器是處理器(CPU)內部暫存數據的存儲單元,以名稱表示,例如:AX,BX..….等存儲器也就是平時所說的主存,也叫內存,可直接與CPU進行數據交換。主存利用地址區別外存主要指用來長久保存數據的外部存儲介質,常見的有硬盤、光盤、磁帶、U盤等。外存的數據只能通過主存間接地與CPU交換數據程序及其數據可以長久存放在外存,在運行需要時才進入主存1.數據的存儲格式計算機中信息的單位二進制位Bit:存儲一位二進制數:0或1字節Byte:8個二進制位,D7~D0字Word:16位,2個字節,D15~D0雙字DWord:32位,4個字節,D31~D0最低有效位LSB:數據的最低位,D0位最高有效位MSB:數據的最高位,對應字節、字、雙字分別指D7、D15、D31位圖示存儲單元及其存儲內容每個存儲單元都有一個編號;被稱為存儲器地址每個存儲單元存放一個字節的內容圖示0002H單元存放有一個數據34H表達為 [0002H]=34H多字節數據存放方式多字節數據在存儲器中占連續的多個存儲單元:存放時,低字節存入低地址,高字節存入高地址;表達時,用它的低地址表示多字節數據占據的地址空間。圖2-5中0002H“字”單元的內容為:[0002H]=1234H0002H號“雙字”單元的內容為:[0002H]=78561234H80x86處理器采用“低對低、高對高”的存儲形式,被稱為“小端方式LittleEndian”。相對應還存在“大端方式BigEndian”。圖示數據的地址對齊同一個存儲器地址可以是字節單元地址、字單元地址、雙字單元地址等等字單元安排在偶地址(xxx0B)、雙字單元安排在模4地址(xx00B)等,為“地址對齊(Align)”(N字節數據安排的起始地址能夠被N整除)對于不對齊地址的數據,處理器訪問時,需要額外的訪問存儲器時間應該將數據的地址對齊,以取得較高的存取速度2.存儲器的分段管理8088CPU有20條地址線最大可尋址空間為220=1MB物理地址范圍從00000H~FFFFFH8088CPU將1MB空間分成許多邏輯段(Segment)每個段最大限制為64KB段地址的低4位為0000B這樣,一個存儲單元除具有一個唯一的物理地址外,還具有多個邏輯地址物理地址和邏輯地址8088CPU存儲系統中,對應每個物理存儲單元都有一個唯一的20位編號,就是物理地址,從00000H~FFFFFH分段后在用戶編程時,采用邏輯地址,形式為段基地址

:

段內偏移地址分隔符物理地址14700H邏輯地址1460H:100H邏輯地址段地址說明邏輯段在主存中的起始位置8088規定段地址必須是模16地址:xxxx0H省略低4位0000B,段地址就可以用16位數據表示,就能用16位段寄存器表達段地址偏移地址說明主存單元距離段起始位置的偏移量每段不超過64KB,偏移地址也可用16位數據表示物理地址和邏輯地址的轉換將邏輯地址中的段地址左移4位,加上偏移地址就得到20位物理地址一個物理地址可以有多個邏輯地址邏輯地址 1460:100、1380:F00物理地址 14700H14700H14600H+100H14700H13800H+F00H14700H段地址左移4位加上偏移地址得到物理地址3.段寄存器8088有4個16位段寄存器CS指明代碼段的起始地址SS指明堆棧段的起始地址DS指明數據段的起始地址ES指明附加段的起始地址每個段寄存器用來確定一個邏輯段的起始地址,每種邏輯段均有各自的用途代碼段寄存器CS(CodeSegment)代碼段用來存放程序的指令序列代碼段寄存器CS存放代碼段的段地址指令指針寄存器IP指示下條指令的偏移地址處理器利用CS:IP取得下一條要執行的指令堆棧段寄存器SS(StackSegment)堆棧段確定堆棧所在的主存區域堆棧段寄存器SS存放堆棧段的段地址堆棧指針寄存器SP指示堆棧棧頂的偏移地址處理器利用SS:SP操作堆棧頂的數據數據段寄存器DS(DataSegment)數據段存放運行程序所用的數據數據段寄存器DS存放數據段的段地址各種主存尋址方式(有效地址EA)得到存儲器中操作數的偏移地址處理器利用DS:EA存取數據段中的數據附加段寄存器ES(ExtraSegment)附加段是附加的數據段,也保存數據:附加段寄存器ES存放附加段的段地址各種主存尋址方式(有效地址EA)得到存儲器中操作數的偏移地址處理器利用ES:EA存取附加段中的數據串操作指令將附加段作為其目的操作數的存放區域如何分配各個邏輯段程序的指令序列必須安排在代碼段程序使用的堆棧一定在堆棧段程序中的數據默認是安排在數據段,也經常安排在附加段,尤其是串操作的目的區必須是附加段數據的存放比較靈活,實際上可以存放在任何一種邏輯段中段超越前綴指令沒有指明時,一般的數據訪問在DS段;使用BP訪問主存,則在SS段默認的情況允許改變,需要使用段超越前綴指令;8088指令系統中有4個:CS: ;代碼段超越,使用代碼段的數據SS: ;堆棧段超越,使用堆棧段的數據DS: ;數據段超越,使用數據段的數據ES: ;附加段超越,使用附加段的數據示例段超越的示例沒有段超越的指令實例:MOVAX,[2000H] ;AX←DS:[2000H];從默認的DS數據段取出數據采用段超越前綴的指令實例:MOVAX,ES:[2000H];AX←ES:[2000H];從指定的ES附加段取出數據總結段寄存器的使用規定訪問存儲器的方式默認可超越偏移地址取指令CS無IP堆棧操作SS無SP一般數據訪問DSCSESSS有效地址EABP基址的尋址方式SSCSESDS有效地址EA串操作的源操作數DSCSESSSSI串操作的目的操作數ES無DI寄存器的總結8088有8個8位通用寄存器、8個16位通用寄存器8088有6個狀態標志和3個控制標志8088將1MB存儲空間分段管理,有4個段寄存器,對應4種邏輯段8088有4個段超越前綴指令,用于明確指定數據所在的邏輯段

熟悉上述內容后,就可以進入下節8088的內部結構1234內部暫存器

IP

ES

SSDSCS輸入/輸出控制電路總線執行部分控制電路∑ALU標志寄存器AHALBHBLCHCLDHDLSPBPSIDI通用寄存器地址加法器指令隊列執行部件(EU)總線接口部件(BIU)16位20位8位8位8088的指令執行過程圖2-58088的存儲格式D7D0字節D15D0字D31D0雙字D7D000006H78H00005H56H00004H12H00003H34H00002H00001H00000H低地址LSBMSB2.28088/8086的數據尋址方式從8088/8086的指令格式入手,論述:立即數尋址方式寄存器尋址方式存儲器尋址方式進而熟悉8088/8086匯編語言指令格式,尤其是其中操作數的表達方法為展開8088/8086指令系統做好準備指令的助記符格式操作數2,常被稱為源操作數src,它表示參與指令操作的一個對象操作數1,成被稱為目的操作數dest,它不僅可以作為指令操作的一個對象,還可以用來存放指令操作的結果分號后的內容是對指令的解釋

操作碼

操作數1,操作數2

;注釋匯編語句格式操作數的尋址方式指令系統設計了多種操作數的來源尋找操作數的過程就是操作數的尋址把尋找操作數的方式叫做(操作數)尋址方式理解操作數的尋址方式是理解指令功能的前提操作數采取哪一種尋址方式一方面,會影響處理器執行指令的速度和效率另一方面,對程序設計也很重要MOV指令2.2.1立即數尋址方式指令中的操作數直接存放在機器代碼中,緊跟在操作碼之后(操作數作為指令的一部分存放在操作碼之后的主存單元中)這種操作數被稱為立即數imm可以是8位數值i8(00H~FFH)也可以是16位數值i16(0000H~FFFFH)立即數尋址方式常用來給寄存器和存儲單元賦值,多以常量形式出現演示MOVAX,0102H ;AX←0102H2.2.2寄存器尋址方式操作數存放在CPU的內部寄存器reg中:8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4個段寄存器seg:CS、DS、SS、ES寄存器名表示其內容(操作數)演示MOVAX,BX ;AX←BX2.2.3存儲器尋址方式操作數在主存儲器中,用主存地址表示程序設計時,8088采用邏輯地址表示主存地址段地址在默認的或用段超越前綴指定的段寄存器中指令中只需給出操作數的偏移地址(有效地址EA)8086設計了多種存儲器尋址方式1、直接尋址方式2、寄存器間接尋址方式3、寄存器相對尋址方式4、基址變址尋址方式5、相對基址變址尋址方式1.直接尋址方式直接尋址方式的有效地址在指令中直接給出默認的段地址在DS段寄存器,可使用段超越前綴改變用中括號包含有效地址,表達存儲單元的內容演示MOVAX,[2000H] ;AX←DS:[2000H]MOVAX,ES:[2000H] ;AX←ES:[2000H]2.寄存器間接尋址方式有效地址存放在基址寄存器BX或變址寄存器SI、DI中默認的段地址在DS段寄存器,可使用段超越前綴改變演示MOVAX,[BX] ;AX←DS:[BX]3.寄存器相對尋址方式有效地址是寄存器內容與有符號8位或16位位移量之和,寄存器可以是BX、BP或SI、DI有效地址=BX/BP/SI/DI+8/16位位移量段地址對應BX/SI/DI寄存器默認是DS,對應BP寄存器默認是SS;可用段超越前綴改變演示MOVAX,[SI+06H] ;AX←DS:[SI+06H]MOVAX,06H[SI] ;AX←DS:[SI+06H]4.基址變址尋址方式有效地址由基址寄存器(BX或BP)的內容加上變址寄存器(SI或DI)的內容構成:有效地址=BX/BP+SI/DI段地址對應BX基址寄存器默認是DS,對應BP基址寄存器默認是SS;可用段超越前綴改變演示MOVAX,[BX+SI] ;AX←DS:[BX+SI]MOVAX,[BX][SI] ;AX←DS:[BX+SI]5.相對基址變址尋址方式有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址對應BX基址寄存器默認是DS,對應BP基址寄存器默認是SS;可用段超越前綴改變演示MOVAX,[BX+DI+6] ;AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]存儲器尋址方式中的變量變量指示內存中的數據,變量名具有地址屬性。存儲器尋找方式中經常采用變量形式變量的定義WVARDW1234H;定義16位變量WVAR,具有初值1234H;假設其偏移地址為10H單獨引用變量名是直接尋址方式MOVAX,WVAR;指令功能:AX=1234H;等同于MOVAX,[0010H]相對尋址方式中,變量名表示其偏移地址,相當于位移量MOVAX,[DI+WVAR];=MOVAX,WVAR[DI];等同于MOVAX,[DI+0010H]相對尋址方式中的位移量在寄存器相對和相對基址變址尋址方式中,其位移量不僅可用常量表示,也可用符號表示這個符號可以是變量名,例如WVAR變量,而且支持多種表達形式MOVAX,[DI+WVAR];;等同于MOVAX,WVAR[DI]MOVAX,[BX+SI+WVAR]

;等同于MOVAX,[BX][SI+WVAR]

;等同于MOVAX,WVAR[BX+SI]

;等同于MOVAX,WVAR[BX][SI]操作數的表達符號尋址方式操作數符號及含義立即數尋址imm代表i8或i16,i8:一個8位立即數,i16:一個16位立即數寄存器尋址reg代表r8或r16,r8:8位通用寄存器,r16:16位通用寄存器seg段寄存器存儲器尋址mem代表m8或m16

,m8:8位存儲器操作數,m16:16位存儲器操作數

掌握操作數的尋址方式后,進入指令學習匯編語言的兩種語句格式⑴執行性語句——執行性語句用于表達處理器指令(也稱為硬指令),匯編后對應一條指令代碼。由處理器指令組成的代碼序列是程序設計的主體標號:

硬指令助記符操作數,操作數 ;注釋⑵說明性語句——說明性語句用于表達偽指令,指示源程序如何匯編、變量怎樣定義、過程怎么設置等名字

偽指令助記符參數,參數,…;注釋MOV指令的功能立即數尋址方式寄存器尋址方式直接尋址方式間接尋址方式相對尋址方式基址變址尋址方式相對基址變址尋址方式2.3數據傳送類指令數據傳送是計算機中最基本、最重要的一種操作,傳送指令也是最常使用的一類指令傳送指令把數據從一個位置傳送到另一個位置除標志寄存器傳送指令外,均不影響標志位重點掌握MOVXCHGXLATPUSHPOPLEA2.3.1通用數據傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGXLATMOVXCHGXLAT1.傳送指令MOV(move)把一個字節或字的操作數從源地址傳送至目的地址MOVreg/mem,imm;立即數送寄存器或主存MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存MOVreg/seg,mem;主存送(段)寄存器MOVreg/mem,seg;段寄存器送寄存器或主存演示MOV指令--立即數傳送movcl,4 ;cl←4,字節傳送movdx,0ffh

;dx←00ffh,字傳送movsi,200h

;si←0200h,字傳送movbvar,0ah

;字節傳送;假設bvar是一個字節變量,定義如下:bvar

db0movwvar,0bh

;字傳送;假設wvar是一個字變量,定義如下:wvar

dw0明確指令是字節操作還是字操作以字母開頭的常數要有前導0MOV指令--寄存器傳送mov

ah,al

;ah←al,字節傳送mov

bvar,ch

;bvar←ch

,字節傳送mov

ax,bx

;ax←bx,字傳送mov

ds,ax

;ds←ax,字傳送mov[bx],al

;[bx]←al,字節傳送

寄存器具有明確的字節和字類型MOV指令--存儲器傳送mov

al,[bx] ;al←ds:[bx]mov

dx,[bp] ;dx←ss:[bp+0]movdx,[bp+4] ;dx←ss:[bp+4]mov

es,[si] ;es←ds:[si]

不存在存儲器向存儲器的傳送指令MOV指令--段寄存器傳送mov[si],dsmov

ax,ds

;ax←dsmov

es,ax

;es←ax←ds

對段寄存器的操作不靈活MOV指令傳送功能圖解MOV指令也并非任意傳送!立即數段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存儲器非法指令的主要現象:兩個操作數的類型不一致無法確定是字節量還是字量操作兩個操作數都是存儲器段寄存器的操作有一些限制非法指令--兩個操作數類型不一致在絕大多數雙操作數指令中,目的操作數和源操作數必須具有一致的數據類型,或者同為字量,或者同為字節量,否則為非法指令

MOVAL,050AH ;非法指令,修正: ;movax,050ah MOVSI,DL ;非法指令,修正: ;movdh,0

;mov

si,dx非法指令--無法確定是字節量還是字量操作當無法通過任一個操作數確定是操作類型時,需要利用匯編語言的操作符顯式指明

MOV[BX+SI],255 ;非法指令,修正: ;mov

byteptr[bx+si],255

;byteptr

說明是字節操作

;mov

wordptr[bx+si],255

;wordptr

說明是字操作非法指令--兩個操作數都是存儲器8088指令系統除串操作指令外,不允許兩個操作數都是存儲單元(存儲器操作數)

MOVbuf2,buf1 ;非法指令,修正:

;假設buf2和buf1是兩個字變量

;movax,buf1

;movbuf2,ax

;假設buf2和buf1是兩個字節變量

;moval,buf1

;movbuf2,al非法指令--段寄存器的操作有一些限制8088指令系統中,能直接對段寄存器操作的指令只有MOV等個別傳送指令,并且不靈活

MOVDS,ES ;非法指令,修正: ;mov

ax,es

;mov

ds,ax MOVDS,100H ;非法指令,修正: ;movax,100h

;mov

ds,ax

MOVCS,[SI] ;非法指令 ;指令存在,但不能執行2.交換指令XCHG(exchange)把兩個地方的數據進行互換寄存器與寄存器之間對換數據寄存器與存儲器之間對換數據不能在存儲器與存儲器之間對換數據XCHGreg,reg/mem;reg

reg/mem演示例2.2數據交換movax,1199h ;ax=1199hxchg

ah,al

;ax=9911h;等同于xchg

al,ahmovwvar,5566h ;wvar是一個字量變量xchg

ax,wvar

;ax=5566h,wvar=9911h;等同于xchg

wvar,ax

xchg

al,byte

ptrwvar+1

;ax=5599h,wvar=6611h

;“byteptrwvar+1”強制為字節量,只取高字節與AL類型交換,否則數據類型不匹配3.換碼指令XLAT(translate)將BX指定的緩沖區中、AL指定的位移處的一個字節數據取出賦給AL換碼指令執行前:在主存建立一個字節量表格,內含要轉換成的目的代碼表格首地址存放于BX,AL存放相對表格首地址的位移量換碼指令執行后:將AL寄存器的內容轉換為目標代碼XLAT

;al←ds:[bx+al]演示2.3.2堆棧操作指令堆棧是一個“后進先出FILO”(或說“先進后出FILO”)的主存區域,位于堆棧段中;SS段寄存器記錄其段地址堆棧只有一個出口,即當前棧頂;用堆棧指針寄存器SP指定堆棧只有兩種基本操作:進棧和出棧,對應兩條指令PUSH和POP圖示進棧指令PUSH進棧指令先使堆棧指針SP減2,然后把一個字操作數存入堆棧頂部PUSHr16/m16/seg

;SP←SP-2

;SS:[SP]←r16/m16/seg演示pushaxpush[2000h]出棧指令POP出棧指令把棧頂的一個字傳送至指定的目的操作數,然后堆棧指針SP加2POPr16/m16/seg

;r16/m16/seg←SS:[SP]

;SP←SP+2popaxpopwvar演示堆棧操作的特點堆棧操作的單位是字,進棧和出棧只對字量字量數據從棧頂壓入和彈出時,都是低地址字節送低字節,高地址字節送高字節堆棧操作遵循先進后出原則,但可用存儲器尋址方式隨機存取堆棧中的數據堆棧段是程序中不可或缺的一個內存區,常用來臨時存放數據傳遞參數保存和恢復寄存器2.3.3標志操作指令1.標志位操作指令CLC

;復位進位標志:CF←0STC

;置位進位標志:CF←1CMC

;求反進位標志:CF←~CFCLD

;復位方向標志:DF←0STD

;置位方向標志:DF←1CLI

;復位中斷標志:IF←0STI

;置位中斷標志:IF←12.標志寄存器低字節與AH的傳送指令3.標志寄存器出入堆棧指令將存儲器操作數的有效地址送至指定的16位通用寄存器有效地址傳送指令LEA(loadeffectiveaddress)LEAr16,mem;r16←mem的有效地址EA例題2.5

有效地址的獲取

movbx,400h

movsi,3ch leabx,[bx+si+0f62h]

;BX←400H+3CH+0F62H=139EH例2.6地址傳送與內容傳送wvar

dw4142h ;假設偏移地址為04H…mov

ax,wvar

;內容傳送:AX=4142Hleasi,wvar

;地址傳送:SI=0004H;等同于leasi,[0004h]mov

cx,[si] ;內容傳送:CX=4142Hmov

di,offset

wvar

;=movdi,0004h

;利用操作符OFFSET獲取變量的有效地址mov

dx,[di] ;內容傳送:DX=4142H調試程序DEBUGDEBUG是常用的匯編語言級調試工具,為匯編語言程序員提供了分析指令、跟蹤程序的有效手段常用命令:-A匯編 -U反匯編-T單步執行 -G斷點執行-D數據顯示 -R寄存器啟動方法DOS下執行DEBUG.EXE程序Windows9x中進入MS-DOS環境執行DEBUG.EXE程序Windows2000/XP/NT下運行COMMAND命令(不是CMD命令,也不要從“命令提示符”)進入MS-DOS環境執行DEBUG.EXE程序MOV指令的功能XCHG指令的功能XLAT指令的功能堆棧的圖示SSSP0000H(棧頂)存儲器高地址堆棧段PUSH指令的功能POP指令的功能2.4算術運算類指令算術運算類指令用來執行二進制的算術運算:加減乘除。這類指令會根據運算結果影響狀態標志,有時要利用某些標志才能得到正確的結果;使用他們時請留心有關狀態標志重點掌握加法指令:ADD、ADC、INC減法指令:SUB、SBB、DEC、CMP、NEG2.4.1加法和減法指令加法指令:ADD,ADC和INC減法指令:SUB,SBB,DEC,NEG和CMP他們分別執行字或字節的加法和減法運算,除INC和DEC不影響CF標志外,其他按定義影響全部狀態標志位操作數組合:運算指令助記符reg,imm/reg/mem運算指令助記符mem,imm/reg1.加和減指令

ADD

dest,src

;加法:dest←dest+src

;ADD指令使目的操作數加上源操作數,和的結果送到目的操作數

SUB

dest,src

;減法:dest←dest-src

;SUB指令使目的操作數減去源操作數,差的結果送到目的操作數例題2.7加法movax,7348h ;AX=7348Haddal,27h

;AL=48H+27H=6FH,AX=736FH

;OF=0,SF=0,ZF=0,PF=1,CF=0addax,3fffh

;AX=736FH+3FFFH=B36EH

;OF=1,SF=1,ZF=0,PF=0,CF=0例題2.7減法subah,0f0h

;AH=B3H-F0H=C3H,AX=C36EH

;OF=0,SF=1,ZF=0,PF=1,CF=1movwordptr[200h],0ef00h

;[200H]=EF00H,標志不變sub[200h],ax

;[200H]=EF00H-C36EH=2B92H

;OF=0,SF=0,ZF=0,PF=0,CF=0sub

si,si

;SI=0

;OF=0,SF=0,ZF=1,PF=1,CF=02.帶進位加和減指令ADC

dest,src

;加法:dest←dest+src+CF

;ADC指令除完成ADD加法運算外,還要加上進位CF,結果送到目的操作數SBB

dest,src

;減法:dest←dest-src-CF

;SBB指令除完成SUB減法運算外,還要減去借位CF,結果送到目的操作數例2.8無符號雙字加法和減法movax,7856h ;AX=7856Hmovdx,8234h ;DX=8234Haddax,8998h ;AX=01EEH,CF=1adcdx,1234h ;DX=9469H,CF=0subax,4491h ;AX=BD5DH,CF=1sbbdx,8000h ;DX=1468H,CF=0DX.AX=82347856H+12348998H-80004491H=1468BD5DH3.比較指令CMP(compare)CMP

dest,src

;做減法運算:dest-src

;CMP指令將目的操作數減去源操作數,但差值不回送目的操作數比較指令通過減法運算影響狀態標志,用于比較兩個操作數的大小關系cmp

ax,bxcmpal,1004.增量和減量指令INCreg/mem

;增量(加1):reg/mem←reg/mem+1DECreg/mem

;減量(減1):reg/mem←reg/mem-1INC指令和DEC指令是單操作數指令與加法和減法指令實現的加1和減1不同的是:INC和DEC不影響CF標志incsi

;si←si+1decbyteptr[si] ;[si]←[si]-15.求補指令NEG(negtive)NEGreg/mem

;reg/mem←0-reg/memNEG指令對操作數執行求補運算,即用零減去操作數,然后結果返回操作數求補運算也可以表達成:將操作數按位取反后加1NEG指令對標志的影響與用零作減法的SUB指令一樣NEG指令也是一個單操作數指令2.4.2符號擴展指令符號擴展是指用一個操作數的符號位(最高位)形成另一個操作數,后一個操作數的高位是全0(正數)或全1(負數)符號擴展雖然使數據位數加長,但數據大小并沒有改變,擴展的高部分僅是低部分的符號擴展符號擴展指令有兩條,用來將字節轉換為字,字轉換為雙字

CBW

;AL符號擴展成AX

CWD

;AX符號擴展成DX例題2.10符號擴展moval,64h

;AL=64H(機器數)

,表示10進制數100(真值)cbw

;將符號0擴展,AX=0064H,仍然表示100movax,0ff00h

;AX=FF00H,表示有符號10進制數-256cwd

;將符號位“1”擴展,DX.AX=FFFFFF00H

;仍然表示-2562.4.3乘法和除法指令乘法指令分無符號和有符號乘法指令MULreg/mem

;無符號乘法IMULreg/mem

;有符號乘法除法指令分無符號和有符號除法指令DIVreg/mem

;無符號除法IDIVreg/mem

;有符號除法乘法指令

乘法運算是雙操作數運算,但是,在指令中卻只指定一個操作數,另一個操作數是隱含規定的。

根據乘法運算的隱含規則,其中的操作數可以是寄存器操作數或存儲器操作數(不能是立即數),而隱含的為AL或AX。

兩個8位數相乘,其結果是16位數;兩個16位數相乘,其結果是32位數。操作數位數決定了是8位還是16位乘法。乘法指令乘法指令 MULCX ;(DX:AX)=(AX)*(CX),為字操作 IMULCL ;(AX)=(AL)*(CL),為字節操作

下列指令是非法的。 MULAL,BL

;DST(被乘數)應為隱含尋址 IMUL05H ;

SRC(乘數)不能為立即數尋址乘法指令例:字節×字運算:計算兩個有符號數15H、FB78H的乘積。解:實際上,有符號數FB78H為負數。程序段為:

MOV AL,15H CBW

;將AL的內容擴展為16位有符號數 MOV BX,0FB78H IMUL BX (DX,AX)=(AX)×(BX)除法指令除法指令(DIV,IDIV)

除法運算也是雙操作數運算,它的隱含規則操作數與乘法指令相同。

在除法運算中,如果除數8位的,則要求被除數是16位的;如果除數是16位的,則要求被除數是32位的。除法指令除法指令規則除法指令DIVSRC ;無符號數的除法IDIVSRC ;有符號數的除法

除法不允許出現除數為0或商溢出,若發生除數為0或商溢出則其結果沒有意義,并引起中斷。

DIVBL ;AX÷BLIDIVCX ;DA,AX÷CXDIVWORDPTR[BX][SI];

DX,AX÷[BX+SI]單元的字除法指令例:有符號數字節÷字節的除法運算。設要完成除法運算—16÷53。(數據存放在字節單元中)解:應該先將字節變為字,再進行除法運算。 DA1 DB —16 DA2 DB 53 …… MOV AL,DA1 CBW ;將AL中的有符號數變為16位數 MOV BL,DA2 IDIV BL2.4.4十進制調整指令十進制數調整指令對二進制運算的結果進行十進制調整,以得到十進制的運算結果,以此實現十進制BCD碼運算8088指令系統支持兩種BCD碼調整運算壓縮BCD碼就是通常的8421碼;它用4個二進制位表示一個十進制位,一個字節可以表示兩個十進制位,即00~99非壓縮BCD碼用8個二進制位表示一個十進制位,只用低4個二進制位表示一個十進制位0~9,高4位任意,通常默認為0編碼的比較真值(十進制) 8 64二進制編碼 08H 40H壓縮BCD碼 08H 64H非壓縮BCD碼 08H 0604HASCII碼 38H 3634H壓縮BCD碼加減法調整指令DAADAS非壓縮BCD碼加減乘除法調整指令AAAAASAAMAAD十進制調整指令 實現BCD十進制調整的指令有六個,它們一般緊跟在相應運算指令之后。1)加法的十進制調整(AAA,DAA)AAA ;加法分離BCD碼調整DAA ;加法組合BCD碼調整 AAA指令為分離BCD碼加法運算后的調整指令,表示對相加結果AL的低4位進行加6修正。 DAA指令為組合BCD碼加法運算后的調整指令,表示對相加結果AL的低4位和高4位分別進行加6修正。十進制調整指令例:計算4+8,采用分離BCD碼解: MOVAL,4 MOVBL,8 ADDAL,BL AAA結果:AL=02H,CF=1例:計算34+28,采用組合BCD碼解: MOVAL,34H MOVBL,28H ADDAL,BL DAA結果:AL=62H,CF=0十進制調整指令例:多字節組合十進制加法:將1000H開始的8字節十進制十進制數與2000H開始的8字節數相加,結果放到2000H開始單元。

MOV SI,1000H ;SI指向第一個數據

MOV DI,2000H ;DI指向第二個數據

MOV CX,8 ;字節長度

CLC ;清除進位標志LOOP1: MOV AL,[SI] ;取第一個字節

ADC AL,[DI] ;加上第二個字節

DAA ;十進制調整

MOV [DI],AL ;存放結果

INC SI INC DI ;修改指針

DEC CX ;計數

JNZ LOOP1 ……十進制調整指令2)減法的十進制調整(AAS、DAS)AAS;減法分離BCD碼調整DAS;減法組合BCD碼調整 AAS指令為分離BCD碼減法運算后的調整指令,表示對相減結果AL的低4位進行減6修正。 DAS指令為組合BCD碼減法運算后的調整指令,表示對相減結果AL的低4位和高4位分別進行減6修正。十進制調整指令例:計算5-9,采用分離BCD碼解: MOVAL,05H MOVBL,09H SUBAL,BL AAS結果:AL=04H,CF=1例:計算31-87,采用組合BCD碼。解: MOVAL,31H MOVBL,87H SUBAL,BL DAS結果:AL=56H,CF=1十進制調整指令3)乘法的十進制調整(AAM)AAM;乘法分離BCD碼調整 AAM為分離BCD碼乘法的調整指令,兩個分離BCD碼相乘之后,需用AAM調整。例:計算7×8解: MOV AL,7 MOV BL,8 MUL BL AAM結果:AX=0506H十進制調整指令4)除法的十進制調整(AAD)AAD ;除法分離BCD碼調整 AAD為分離BCD碼除法的調整指令,兩個分離BCD碼除法指令之前應采用AAD進行調整。例:計算27÷4。解: MOVAX,0207H MOVBL,4 AAD ;(AX)←001BH DIVBL結果:AL=06H,AH=03H2.5位操作類指令位操作類指令以二進制位為基本單位進行數據的操作當需要對字節或字數據中的各個二進制位操作時,可以考慮采用位操作類指令注意這些指令對標志位的影響1.邏輯運算指令ANDORXORNOTTEST2.移位指令SHLSHRSAR3.循環移位指令ROLRORRCLRCR2.5.1邏輯運算指令雙操作數邏輯指令AND、OR、XOR和TEST設置CF=OF=0,根據結果設置SF、ZF和PF狀態,而對AF未定義;它們的操作數組合與ADD、SUB等一樣:運算指令助記符reg,imm/reg/mem運算指令助記符mem,imm/reg

單操作數邏輯指令NOT不影響標志位,操作數與INC、DEC和NEG一樣:NOTreg/mem邏輯與指令AND對兩個操作數執行邏輯與運算,結果送目的操作數ANDdest,src

;dest←dest∧src

只有相“與”的兩位都是1,結果才是1;否則,“與”的結果為0邏輯或指令OR對兩個操作數執行邏輯或運算,結果送目的操作數ORdest,src

;dest←dest∨src只要相“或”的兩位有一位是1,結果就是1;否則,結果為0邏輯異或指令XOR對兩個操作數執行邏輯異或運算,結果送目的操作數XORdest,src

;dest←dest⊕src只有相“異或”的兩位不相同,結果才是1;否則,結果為0測試指令TEST對兩個操作數執行邏輯與運算,結果并不送目的操作數,僅按AND指令影響標志用TEST指令來檢測指定位是1還是0。 TEST AL,08H ;測試AL的D3是0還是1。如果ZF=1,說明D3位為0。TESTdest,src

;dest∧src

AND與TEST指令的關系,同SUB與CMP指令的關系一樣邏輯非指令NOT對一個操作數執行邏輯非運算NOTreg/mem

;reg/mem←~reg/mem

按位取反,原來是“0”的位變為“1”;原來是“1”的位變為“0”例2.13邏輯運算moval,75h ;AL=75Handal,32h ;AL=30H

;CF=OF=0,SF=0,ZF=0,PF=1oral,71h ;AL=71H

;CF=OF=0,SF=0,ZF=0,PF=1xoral,0f1h ;AL=80H

;CF=OF=0,SF=1,ZF=0,PF=0notal ;AL=7FH,標志不變例2.14邏輯運算指令的應用andbl,11110110b

;BL中D0和D3清0,其余位不變orbl,00001001b

;BL中D0和D3置1,其余位不變xorbl,00001001b

;BL中D0和D3求反,其余位不變

AND指令可用于某些位置0(同0相與),不影響其他位

OR指令可用于某些位置1(同1相或),不影響其他位

XOR指令可用于某些位取反(同1相異或),不影響其他位TEST指令可用于測試某些位為0或為12.5.2移位指令將操作數移動一位或多位,分成邏輯移位和算術移位,分別具有左移或右移操作移位指令的第一個操作數是指定的被移位的操作數,可以是寄存器或存儲單元;后一個操作數表示移位位數:該操作數為1,表示移動一位該操作數為CL,CL寄存器值表示移位位數(移位位數大于1只能CL表示)按照移入的位設置進位標志CF,根據移位后的結果影響SF、ZF、PF邏輯左移指令SHLSHLreg/mem,1/CL

;reg/mem左移1或CL位 ;最低位補0,最高位進入CF演示邏輯右移指令SHRSHRreg/mem,1/CL

;reg/mem右移1/CL位 ;最高位補0,最低位進入CF演示算術左移指令SALSALreg/mem,1/CL

;與SHL是同一條指令演示算術右移指令SARSARreg/mem,1/CL

;reg/mem右移1/CL位 ;最高位不變,最低位進入CF演示例2.15數據移位movdx,6075h

;DX=0110000001110101Bshldx,1

;DX=1100000011101010B

;CF=0,SF=1、ZF=0、PF=0sardx,1

;DX=1110000001110101B

;CF=0,SF=1、ZF=0、PF=0shrdx,1

;DX=0111000000111010B ;CF=1,SF=0、ZF=0、PF=1movcl,4

;CL=4,標志不變sar

dx,cl

;DX=0000011100000011B

;CF=1,SF=0、ZF=0、PF=1例2.16將AL寄存器中的無符號數乘以10xor

ah,ah

;實現AH=0,同時使CF=0shlax,1

;AX←2×ALmov

bx,ax

;BX←AX=2×ALshlax,1

;AX←4×ALshlax,1

;AX←8×ALaddax,bx

;AX←8×AL+2×AL=10×ALsubah,ahandah,0

邏輯左移一位相當于無符號數乘以2

邏輯右移一位相當于無符號數除以22.5.3循環移位指令循環移位指令類似移位指令,但要將從一端移出的位返回到另一端形成循環。分為:ROLreg/mem,1/CL

;不帶進位循環左移RORreg/mem,1/CL

;不帶進位循環右移RCLreg/mem,1/CL ;帶進位循環左移RCRreg/mem,1/CL ;帶進位循環右移循環移位指令的操作數形式與移位指令相同,按指令功能設置進位標志CF,但不影響SF、ZF、PF、AF標志演示演示演示演示32位數據移位;將DX.AX中32位數值左移一位shlax,1rcldx,1DXAXCF0考慮32位數據的右移等操作例2.18非壓縮BCD碼合并為壓縮BCD;DBCD有2位非壓縮BCD碼mov

dl,dbcd

;取低字節anddl,0fh

;只要低4位movdh,dbcd+1

;取高字節movcl,4shl

dh,cl

;低4位移到高4位ordl,dh

;合并到DLrol

dh,clrcr

dh,clNo!SHL和SAL指令的功能SHR指令的功能SAR指令的功能ROL指令的功能ROR指令的功能RCL指令的功能RCR指令的功能2.6控制轉移類指令控制轉移類指令用于實現分支、循環、過程等程序結構,是僅次于傳送指令的常用指令重點掌握:

JMP/Jcc/LOOP/JCXZ

CALL/RET

INT

n/IRET

常用系統功能調用

控制轉移類指令通過改變IP(和CS)值,實現程序執行順序的改變目標地址的尋址方式相對尋址方式指令代碼中提供目的地址相對于當前IP的位移量,轉移到的目的地址(轉移后的IP值)就是當前IP值加上位移量直接尋址方式指令代碼中提供目的邏輯地址,轉移后的CS和IP值直接來自指令操作碼后的目的地址操作數間接尋址方式指令代碼中指示寄存器或存儲單元,目的地址從寄存器或存儲單元中間接獲得用標號表達用標號表達用寄存器或存儲器操作數表達目標地址的尋址范圍:段內尋址段內轉移——近轉移(near)在當前代碼段64KB范圍內轉移(±32KB范圍)不需要更改CS段地址,只要改變IP偏移地址段內轉移——短轉移(short)轉移范圍可以用一個字節表達,在段內-128~+127范圍的轉移代碼段代碼段目標地址的尋址范圍:段間尋址段間轉移——遠轉移(far)從當前代碼段跳轉到另一個代碼段,可以在1MB范圍需要更改CS段地址和IP偏移地址目標地址必須用一個32位數表達,叫做32位遠指針,它就是邏輯地址代碼段代碼段

實際編程時,匯編程序會根據目標地址的屬性,自動處理成短轉移、近轉移或遠轉移程序員可用操作符short、nearptr

或farptr

強制成為需要的轉移類型2.6.1無條件轉移指令只要執行無條件轉移指令JMP,就使程序轉到指定的目標地址,從目標地址處開始執行指令操作數label是要轉移到的目標地址(目的地址、轉移地址)JMP指令分成4種類型:⑴段內轉移、相對尋址⑵段內轉移、間接尋址⑶段間轉移、直接尋址⑷段間轉移、間接尋址JMPlabel

;程序轉向label標號指定的地址無條件轉移指令JMP(jump)JMPlabel ;段內轉移、相對尋址

;IP←IP+位移量

JMPr16/m16 ;段內轉移、間接尋址

;IP←r16/m16

JMPfarptrlabel ;段間轉移、直接尋址

;IP←偏移地址,CS←段地址

JMPfarptr

mem

;段間轉移,間接尋址

;IP←[mem],CS←[mem+2]演示演示演示演示演示2.6.2條件轉移指令條件轉移指令Jcc根據指定的條件確定程序是否發生轉移。其通用格式為:

Jcclabel ;條件滿足,發生轉移 ;IP←IP+8位位移量;

;否則,順序執行label是一個標號、一個8位位移量,表示Jcc指令后的那條指令的偏移地址,到目標指令的偏移地址的地址位移label只支持短轉移的相對尋址方式Jcc指令的分類Jcc指令不影響標志,但要利用標志(表2-3)根據利用的標志位不同,分成三種情況:⑴判斷單個標志位狀態⑵比較無符號數高低⑶比較有符號數大小

Jcc指令實際雖然只有16條,但卻有30個助記符采用多個助記符,目的是為了方便記憶和使用1.判斷單個標志位狀態⑴

JZ/JE和JNZ/JNE

利用零標志ZF,判斷結果是否為零(或相等)⑵JS和JNS

利用符號標志SF,判斷結果是正是負⑶JO和JNO

利用溢出標志OF,判斷結果是否產生溢出⑷JP/JPE和JNP/JPO

利用奇偶標志PF,判斷結果中“1”的個數是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE

利用進位標志CF,判斷結果是否進位或借位例題2.19題目:將AX中存放的無符號數除以2,如果是奇數則加1后除以2問題:如何判斷AX中的數據是奇數還是偶數?解答:判斷AX最低位是“0”(偶數),還是“1”(奇數)。可以用位操作類指令1:用邏輯與指令將除最低位外的其他位變成0,保留最低位不變。判斷這個數據是0,AX就是偶數;否則,為奇數2:將最低位用移位指令移至進位標志,判斷進位標志是0,AX就是偶數;否則,為奇數3:將最低位用移位指令移至最高位(符號位),判斷符號標志是0,AX就是偶數;否則,為奇數例題2.19解答1用JZ指令實現 testax,01h;測試AX的最低位D0(不用AND指令,以免改變AX)

jz

even;標志ZF=1,即D0=0:AX內是偶數,程序轉移

addax,1;標志ZF=0,即D0=1:AX內的奇數,加1even:

shrax,1

;AX←AX÷2用右移一位的方法實現除以2。本例中用RCR指令比SHR指令更好。例題2.19解答2用JNC指令實現

mov

bx,ax

shrbx,1;將AX的最低位D0移進CF

jnc

even;標志CF=0,即D0=0:AX內是偶數,程序轉移

addax,1;標志CF=1,即D0=1:AX內的奇數,加1even:

shrax,1

;AX←AX÷2還可用SAR、ROR和RCR指令例題2.19解答3用JNS指令實現

mov

bx,ax

rorbx,1;將AX的最低位D0移進最高位(符號位SF)

jns

even;標志SF=0,即D0=0:AX內是偶數,程序轉移

addax,1;標志SF=1,即D0=1:AX內的奇數,加1even:

shrax,1

;AX←AX÷2錯誤!循環指令不影響SF等標志ADDBX,0

;增加一條指令例2.20判斷是否為字母Y;寄存器AL中是字母Y(含大小寫),則令AH=0,否則令AH=-1

cmp

al,’y’ ;比較AL與小寫字母y

jenext

;相等,轉移

cmp

al,’Y’ ;不相等, ;繼續比較AL與大寫字母Y

jenext

;相等,轉移

movah,-1

;不相等,令AH=-1

jmpdone

;無條件轉移指令next: movah,0

;相等的處理:令AH=0done: ……例2.21偶校驗;對DL寄存器中8位數據進行偶校驗;校驗位存入CF標志

testdl,0ffh

;使CF=0,同時設置PF標志

jpe

done

;DL中“1”的個數為偶數

;正好CF=0,轉向done

stc

;DL中“1”的個數為奇數,設置CF=1done:

;完成2.比較數值大小:無符號數的高低無符號數的大小用高(Above)、低(Below)表示,需要利用CF確定高低、利用ZF標志確定相等(Equal)兩數的高低分成4種關系,對應4條指令JB(JNAE):目的操作數低于(不高于等于)源操作數JNB(JAE):目的操作數不低于(高于等于)源操作數JBE(JNA):目的操作數低于等于(不高于)源操作數JNBE(JA):目的操作數不低于等于(高于)源操作數2.比較數值大小:有符號數的大小判斷有符號數的大(Greater)、小(Less),需要組合OF、SF標志、并利用ZF標志確定相等與否兩數的大小分成4種關系,分別對應4條指令JL(JNGE):目的操作數小于(不大于等于)源操作數JNL(JGE):目的操作數不小于(大于等于)源操作數JLE(JNG):目的操作數小于等于(不大于)源操作數JNLE(JG):目的操作數不小于等于(大于)源操作數例2.22求較大值

cmp

ax,bx

;比較AX和BX

jaenext ;若AX≥BX,轉移

xchg

ax,bx

;若AX<BX,交換next: mov

wmax,ax如果AX和BX存放的是有符號數,則條件轉移指令應采用JGE指令例2.22求較大值(另解)

cmp

ax,bx

;比較AX和BX

jae

next

mov

wmax,bx

;若AX<BX,wmax←BX

jmp

donenext: mov

wmax,ax

;若AX≥BX,wmax

溫馨提示

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

評論

0/150

提交評論