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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

匯編語言程序設(shè)計 AssemblyLanguageProgramming第一章緒論§1.1匯編語言程序設(shè)計的一般概念§1.2為什么要學(xué)習(xí)和使用匯編語言§1.3一個簡單的匯編語言源程序舉例§1.4計算機中數(shù)和字符的表示 §1.1匯編語言程序設(shè)計的一般概念一、匯編語言二、匯編語言源程序三、匯編程序四、目標程序五、連接程序六、調(diào)試程序一、匯編語言匯編語言是一種面向機器的低級程序設(shè)計語言匯編語言以助記符形式表示每一條計算機指令助記符(mnemonic)是便于人們記憶、并能描述指令功能和指令操作數(shù)的符號助記符一般就是表明指令功能的英語單詞或其縮寫用助記符表示的指令就是匯編語言中的匯編格式指令匯編格式指令以及使用它們編寫程序的規(guī)則就形成匯編語言(AssemblyLanguage)二、匯編語言源程序用匯編語言書寫的程序就是匯編語言程序,或稱匯編語言源程序匯編語言源程序以.ASM為默認的擴展名三、匯編程序(Assembler)匯編程序?qū)R編語言源程序翻譯(稱為“匯編”)成機器代碼目標模塊80x86CPU的匯編程序主要有微軟的宏匯編程序MASM。較著名的還有Borland公司的TASM,無實質(zhì)差別四、目標程序機器語言程序匯編語言源程序經(jīng)匯編程序翻譯而成不能直接運行五、連接程序(Linker)連接程序?qū)R編后的目標模塊轉(zhuǎn)換為可執(zhí)行程序每個程序開發(fā)環(huán)境都有連接程序連接程序的文件名通常是:LINK.EXE六、調(diào)試程序(Debugger)調(diào)試程序進行程序排錯、分析等本課程采用DOS的DEBUG程序其他還有TurboDebugger等源程序可執(zhí)行文件目標模塊文本編輯器匯編程序連接程序調(diào)試程序§1.2為什么要學(xué)習(xí)和使用匯編語言一、匯編語言的主要特點二、匯編語言可操作的系統(tǒng)硬件資源三、匯編語言與高級語言之比較四、匯編語言的應(yīng)用場合一、匯編語言的主要特點匯編語言程序與處理器指令系統(tǒng)密切相關(guān)程序員可直接、有效地控制系統(tǒng)硬件資源形成的可執(zhí)行文件運行速度快、占用主存容量少二、匯編語言可操作的系統(tǒng)硬件資源中央處理單元存儲器(主存儲器)外部設(shè)備(接口電路)1、中央處理單元CPU

(Intel80x86) 對匯編語言程序員,最關(guān)心其中的寄存器(Register)2、存儲器(主存儲器)呈現(xiàn)給匯編語言程序員的,是存儲器地址(Address)存儲器是由大量存儲單元組成。為了區(qū)別每個單元,我們將它們編號存儲器地址是存儲器中存儲單元的編號微機的每個存儲單元存放一個字節(jié)的數(shù)據(jù)一個字節(jié)B(Byte)包含了8個二進制位b(bit)通常采用十六進制數(shù)來表達地址Intel8086具有1兆字節(jié)(1MB)存儲器容量其存儲器地址可以表示為:00000H~FFFFFH其中大寫H(或小寫h)表示是16進制數(shù)3、外部設(shè)備(接口電路)匯編語言程序員看到的是端口(Port)I/O接口電路由接口寄存器組成,為了區(qū)別它們,各個寄存器進行了編號,形成I/O地址。端口就是指I/O地址,是微機系統(tǒng)對I/O接口電路中與程序設(shè)計有關(guān)的寄存器的編號系統(tǒng)實際上就是通過這些端口與外設(shè)進行通訊的通常采用十六進制數(shù)來表達端口Intel8086支持64K個8位端口其I/O地址可以表示為:0000H~FFFFH三、匯編語言和高級語言(1)匯編語言與處理器密切相關(guān) ↘匯編語言程序的通用性、可移植性較差高級語言與具體計算機無關(guān) ↗高級語言程序可以在多種計算機上編譯后執(zhí)行三、匯編語言和高級語言(2)匯編語言功能有限、涉及硬件細節(jié) ↘編寫程序比較繁瑣,調(diào)試起來也比較困難高級語言提供了強大的功能,不必關(guān)心瑣碎問題 ↗類似自然語言的語法,易于掌握和應(yīng)用三、匯編語言和高級語言(3)匯編語言本質(zhì)上就是機器語言↗可以直接、有效地控制計算機硬件↗易于產(chǎn)生速度快、容量小的高效率目標程序高級語言不針對具體計算機系統(tǒng)↘不易直接控制計算機的各種操作↘目標程序比較龐大、運行速度較慢三、匯編語言和高級語言(4)匯編語言的優(yōu)點:直接控制計算機硬件部件可以編寫在“時間”和“空間”兩方面最有效的程序匯編語言的缺點:與處理器密切有關(guān)需要熟悉計算機硬件系統(tǒng)、考慮許多細節(jié)編寫繁瑣,調(diào)試、維護、交流和移植困難三、匯編語言和高級語言(5)匯編語言的優(yōu)點使得它在程序設(shè)計中占有重要的位置,是不可被取代的匯編語言的缺點使得人們主要采用高級語言進行程序開發(fā)工作有時需要采用高級語言和匯編語言混合編程的方法,互相取長補短,更好地解決實際問題四、匯編語言的應(yīng)用場合程序要具有較快的執(zhí)行時間,或者只能占用較小的存儲容量程序與計算機硬件密切相關(guān),程序要直接、有效地控制硬件大型軟件需要提高性能、優(yōu)化處理的部分沒有合適的高級語言、或只能采用匯編語言的時候分析具體系統(tǒng)尤其是該系統(tǒng)的低層軟件、加密解密軟件、分析和防治計算機病毒等微機的軟件系統(tǒng)軟件:DOS平臺MS-DOS6.22Windows9.x的DOS實地址方式MS-DOS虛擬環(huán)境應(yīng)用軟件:開發(fā)匯編語言程序涉及文本編輯器匯編程序連接程序調(diào)試程序集成化開發(fā)環(huán)境集成化開發(fā)環(huán)境集成開發(fā)環(huán)境是進行程序設(shè)計所用到的各種軟件的有機集合。其中,有文本編輯器,有語言翻譯程序,有連接程序,還組合有調(diào)試程序等。大型的程序設(shè)計項目往往要借助這種集成開發(fā)環(huán)境,也就是軟件開發(fā)工具(包)。教材中介紹有集編輯、匯編、連接和調(diào)試為一體的綜合開發(fā)環(huán)境,即MASM的程序員工作平臺PWB?!?.3一個簡單的匯編語言源程序舉例分別用C語言和匯編語言編制一程序,實現(xiàn)如下功能: 從鍵盤輸入兩個1位整數(shù),將其進行加法運算并在屏幕上顯示加法運算等式(和《=9)。

1 DATA SEGMENT ;定義數(shù)據(jù)段2 A DB03 B DB04 C DB?5 DATA ENDS6 PROG SEGMENT ;定義程序段7 MAIN PROCFAR ;定義一遠過程8 ASSUMECS:PROG,DS:DATA9 START: PUSH DS ;為返回做準備10 SUB AX,AX11 PUSH AX12 MOV AX,DATA13 MOV DS,AX

14 MOV AH,01H ;mainpartofprogramcodegoeshere15 INT 21H16 AND AL,0FH17 MOV A,AL18 MOV AH,01H19 INT 21H20 AND AL,0FH21 MOV B,AL22 ADD AL,A23 MOV C,AL24 MOV DL,A25 ADD DL,30H26 MOV AH,227 INT 21H28 MOV DL,”+”29 INT 21H30 MOV DL,B31 ADD DL,30H32 INT 21H33

MOV DL,“=”34 ADD DL,30H35 INT 21H36

MOV DL,C37 ADD DL,30H38 INT 21H39 RET40 MAIN ENDP ;ReturntoDOS41 PROG ENDS ;Endofmainpartofprogram42 END START ;Endassembly§1.4計算機中數(shù)和字符的表示一、數(shù)制及數(shù)制之間的轉(zhuǎn)換二、碼制三、BCD碼及其表示四、字符的編碼五、幾種基本的邏輯運算一、數(shù)制及數(shù)制之間的轉(zhuǎn)換匯編語言使用的數(shù)制:十進制數(shù)(D)二進制數(shù)(B)十六進制數(shù)(H)匯編程序自動完成二、碼制計算機中的數(shù)是用補碼表示的帶符號數(shù)的表示范圍(補碼) n位二進制數(shù) -2n-1

≦N≦2n-1-18位二進制數(shù): -128—+12716位二進制數(shù): -32768—+32767三、BCD碼及其表示76543210BCD無意義76543210BCDBCD個位十位用4位二進制數(shù)表示1位十進制數(shù)常用的BCD碼存儲格式組合(壓縮)型BCD碼(1Byte表示2個BCD碼)非組合(非壓縮)型BCD碼(1Byte表示1個BCD碼)四、字符的編碼采用7位編碼的ASCII碼,用1Byte表示

非打印字符33個(用于控制)

27=128

打印字符95個BEL(07H)響鈴DEL(7FH)刪除CR(0DH)回車LF(0AH)換行五、幾種基本的邏輯運算“與”運算(AND

)“或”運算(OR)“非”運算(NOT)“異或”運算(XOR)第二章80x86計算機組織§2.1 80x86微處理器§2.2 基于微處理器的計算機系統(tǒng)構(gòu)成§2.3 中央處理機§2.4 存儲器§2.5 外部設(shè)備§2.1 80x86微處理器§2.2 基于微處理器的計算機系統(tǒng)構(gòu)成系統(tǒng)資源:CPU、存儲器、I/O端口§2.3 中央處理機一、Intel8088/8086微處理器的功能結(jié)構(gòu)

1.編程結(jié)構(gòu) 2.工作過程二、8086/8088的寄存器組

1.通用寄存器 2.段寄存器 3.控制寄存器內(nèi)部暫存器

IP

ES

SS

DS

CS輸入/輸出控制電路外部總線執(zhí)行部分控制電路123456∑ALU標志寄存器

AHAL

BHBLCHCL

DHDL

SP

BP

SI

DI通用寄存器地址加法器指令隊列緩沖器執(zhí)行部件(EU)總線接口部件(BIU)16位20位16位8位8086編程結(jié)構(gòu)編程結(jié)構(gòu)BIU(總線接口部件)負責與存儲器及I/O設(shè)備交換信息 指令 數(shù)據(jù)EU(執(zhí)行部件)負責指令的執(zhí)行工作過程

兩部分并行工作,提高了工作效率每當指令隊列中有兩個空字節(jié),BIU自動把內(nèi)存中的指令送入指令隊列中EU從指令隊列中取出指令代碼去執(zhí)行(此時,BIU可繼續(xù)取指)。如在指令執(zhí)行過程中需要訪問存儲器或I/O設(shè)備,則EU會請求BIU進入總線周期,去完成訪問存儲器或I/O端口的操作BIU處于空閑狀態(tài),則立即響應(yīng)EU的總線請求BIU正在取指,完成當前取指操作后響應(yīng)EU的請求當指令隊列已滿,且EU沒有總線請求時,BIU進入空閑狀態(tài)在執(zhí)行轉(zhuǎn)移、調(diào)用和返回指令時,BIU指令隊列的原有內(nèi)容會被自動清除,而裝入轉(zhuǎn)移目標處的指令。二、8086/8088的寄存器組 是基本資源,亦是操作對象。對內(nèi)部寄存器的使用尤為重要: 可實現(xiàn)的操作多 速度快

1.通用寄存器

2.段寄存器

3.控制寄存器1.通用寄存器

8個16位寄存器位于EU中數(shù)據(jù)寄存器(共4個16位)指針及變址寄存器(共4個16位)內(nèi)部暫存器

IP

ES

SS

DS

CS輸入/輸出控制電路外部總線執(zhí)行部分控制電路123456∑ALU標志寄存器

AHAL

BHBLCHCL

DHDL

SP

BP

SI

DI通用寄存器地址加法器指令隊列緩沖器執(zhí)行部件(EU)總線接口部件(BIU)16位20位16位8位1.通用寄存器—數(shù)據(jù)寄存器AX(Accumulator)累加器:算術(shù)運算的主要R

,所有的I/O指令都用此RBX(Base)基址寄存器:除通用外,計算存儲器地址做基址用CX(Count)計數(shù)器:通用,作循環(huán)計數(shù)器DX(Data)數(shù)據(jù)寄存器:常用來存放雙字長數(shù)據(jù)的高16位,或存放外設(shè)端口地址特點: 可作16位R使用,也可將每個拆成2個8位寄存器使用,對其中某8位的操作,并不影響另外對應(yīng)8位的數(shù)據(jù)具有良好的通用性:在程序中即可存放操作數(shù),也可存放操作結(jié)果1.通用寄存器—指針及變址寄存器

變址寄存器SI(SourceIndex)源變址寄存器DI(DestinationIndex)目的變址寄存器

指針寄存器SP(StackPoint)堆棧指針寄存器—棧頂?shù)钠频刂稡P(BasePoint)基址指針寄存器—默認SS段

特點: 可用于存放操作數(shù),但只能作為16位R使用2.段寄存器4個16bitsSegmentRegisters在8086/8088系統(tǒng)中,存儲器是按段進行組織的,段寄存器就是用來存放段基值的(段起始地址的高16位)運行程序時所必要的指令、數(shù)據(jù)等存放于內(nèi)存的不同段內(nèi),根據(jù)其用途的不同,又不同的段寄存器指示,并稱其為當前段內(nèi)部暫存器

IP

ES

SS

DS

CS輸入/輸出控制電路外部總線執(zhí)行部分控制電路123456∑ALU標志寄存器

AHAL

BHBLCHCL

DHDL

SP

BP

SI

DI通用寄存器地址加法器指令隊列緩沖器執(zhí)行部件(EU)總線接口部件(BIU)16位20位16位8位 2.段寄存器CS:代碼段寄存器—對應(yīng)的段存放指令代碼DS:數(shù)據(jù)段寄存器—對應(yīng)的段存放數(shù)據(jù)或變量SS:堆棧段寄存器—對應(yīng)的段存放棧操作的數(shù)據(jù)ES:附加段寄存器—對應(yīng)的段一般存放數(shù)據(jù)或變量

整個內(nèi)存可劃分為多個段,但當前段最多只能有4個,如果需要改變當前段,則可通過程序修改段寄存器的內(nèi)容內(nèi)部暫存器

IP

ES

SS

DS

CS輸入/輸出控制電路外部總線執(zhí)行部分控制電路123456∑ALU標志寄存器

AHAL

BHBLCHCL

DHDL

SP

BP

SI

DI通用寄存器地址加法器指令隊列緩沖器執(zhí)行部件(EU)總線接口部件(BIU)16位20位16位8位3.控制寄存器3.控制寄存器—IPIP(InstructionPointer)指令指針寄存器IP(16bits)

指示代碼段中指令的偏移地址它與代碼段寄存器CS聯(lián)用,確定下一條指令的物理地址計算機通過CS:IP寄存器來控制指令序列的執(zhí)行流程IP寄存器是一個專用寄存器不能對IP指針直接進行訪問

程序順序執(zhí)行 修改 轉(zhuǎn)移指令的執(zhí)行 調(diào)用、返回指令的執(zhí)行CSIP正在執(zhí)行的指令下一條將要執(zhí)行的指令16bits偏移量XXXXXXXXXXXXXXXX3.控制寄存器—FLAGS標志(Flag)用于反映指令執(zhí)行結(jié)果或控制指令執(zhí)行形式8086處理器的各種標志形成了一個16位的標志寄存器FLAGS(程序狀態(tài)字PSW寄存器)OF111512DF10IF9TF8SF7ZF65AF43PF21CF0標志位的分類狀態(tài)標志(6):表示前面的操作執(zhí)行后,ALU所處的狀態(tài),將影響后面的操作控制標志(3):用專門的指令進行設(shè)置,用于控制處理器執(zhí)行指令的方式OF111512DF10IF9TF8SF7ZF65AF43PF21CF0標志位的功能—進位標志CF(CarryFlag)記錄運算時從最高有效位產(chǎn)生的進/借位值3AH+7CH=B6H,沒有進位:CF=0AAH+7CH=(1)26H,有進位:CF=10 NC 沒有產(chǎn)生進/借位1 CY 有進/借位產(chǎn)生CF=標志位的功能—零標志ZF(ZeroFlag)0 NZ 結(jié)果非零1 ZR 結(jié)果為零ZF=3AH+7CH=B6H,結(jié)果不是零:ZF=084H+7CH=(1)00H,結(jié)果是零:ZF=1

注意:ZF為1表示的結(jié)果是0標志位的功能—符號標志SF(SignFlag)表明有符號數(shù)運算結(jié)果的正負0 PL 結(jié)果為正1 NG 結(jié)果為負SF=

有符號數(shù)據(jù)用最高有效位表示數(shù)據(jù)的符號所以,最高有效位就是符號標志的狀態(tài)3AH+7CH=B6H,最高位D7=1:SF=184H+7CH=(1)00H,最高位D7=0:SF=0標志位的功能—奇偶標志PF(ParityFlag)表明運算結(jié)果最低字節(jié)中“1”的個數(shù)的奇偶0 PO “1”的個數(shù)為奇數(shù)1 PE “1”的個數(shù)為偶數(shù)PF=3AH+7CH=B6H=10110110B結(jié)果中有5個1,是奇數(shù):PF=0

PF標志僅反映最低8位中“1”的個數(shù)是

偶或奇,即使是進行16位字操作標志位的功能—溢出標志OF(OverflowFlag)表明補碼的運算結(jié)果是否有溢出0 NV 沒有溢出1 OV 溢出OF=3AH+7CH=B6H,產(chǎn)生溢出:OF=1AAH+7CH=(1)26H,沒有溢出:OF=0關(guān)于溢出處理器內(nèi)部以補碼表示有符號數(shù)8位表達的整數(shù)范圍是:-128~+12716位表達的范圍是:-32768~+32767如果運算結(jié)果超出這個范圍,就產(chǎn)生了溢出有溢出,說明有符號數(shù)的運算結(jié)果不正確3AH+7CH=B6H,就是58+124=182,已經(jīng)超出-128~+127范圍,產(chǎn)生溢出,故OF=1;另一方面,補碼B6H表達真值是-74,顯然運算結(jié)果也不正確溢出和進位溢出標志OF和進位標志CF是兩個意義不同的標志進位標志表示無符號數(shù)運算結(jié)果是否超出范圍,運算結(jié)果仍然正確;溢出標志表示有符號數(shù)運算結(jié)果是否超出范圍,如溢出,運算結(jié)果已經(jīng)不正確。溢出和進位的對比例1:3AH+7CH=B6H無符號數(shù)運算: 58+124=182 范圍內(nèi),無進位有符號數(shù)運算: 58+124=182 范圍外,有溢出CF=0OF=1例2:AAH+7CH=(1)26H無符號數(shù)運算: 170+124=294 范圍外,有進位有符號數(shù)運算: -86+124=28 范圍內(nèi),無溢出CF=1OF=0如何運用溢出和進位處理器對兩個操作數(shù)進行運算時,按照無符號數(shù)求得結(jié)果,并相應(yīng)設(shè)置進位標志CF;同時,根據(jù)是否超出有符號數(shù)的范圍設(shè)置溢出標志OF。應(yīng)該利用哪個標志,則由程序員來決定。也就是說,如果將參加運算的操作數(shù)認為是無符號數(shù),就應(yīng)該關(guān)心進位;認為是有符號數(shù),則要注意是否溢出。標志位的功能—

輔助進位標志AF(AuxiliaryCarryFlag)記錄運算時D3位(低半字節(jié))有無進位或借位0 NA D3未產(chǎn)生進/借位1 AC D3產(chǎn)生進/借位AF=3AH+7CH=B6H,D3有進位:AF=1

這個標志主要由處理器內(nèi)部使用,用于十進制算術(shù)運算調(diào)整指令中,用戶一般不必關(guān)心標志位的功能—方向標志DF(DirectionFlag)用于串操作指令中,控制地址的變化方向0 UP 存儲器地址自動增量修改1 DN 存儲器地址自動減量修改DF=CLD指令復(fù)位方向標志:DF=0STD指令置位方向標志:DF=1標志位的功能—中斷允許標志IF(Interrupt-enableFlag)用于開中斷或屏蔽中斷0 DI 關(guān)中斷,禁止響應(yīng)中斷1 EI 開中斷,允許響應(yīng)中斷IF=CLI指令復(fù)位中斷標志:IF=0STI指令置位中斷標志:IF=1標志位的功能—陷阱標志TF(TrapFlag)用于控制處理器進入單步操作方式0 處理器正常工作1 處理器單步執(zhí)行指令單步執(zhí)行指令——處理器在每條指令執(zhí)行結(jié)束時,便產(chǎn)生一個編號為1的內(nèi)部中斷這種內(nèi)部中斷稱為單步中斷所以TF也稱為單步標志利用單步中斷可對程序進行逐條指令的調(diào)試這種逐條指令調(diào)試程序的方法就是單步調(diào)試§2.4 存儲器一、存儲器的組成二、存儲器的段結(jié)構(gòu)三、邏輯地址與物理地址四、堆棧一、存儲器的組成

存儲器的編址數(shù)據(jù)的存儲8086/8088對內(nèi)存的訪問由若干個存儲單元組成,存儲單元的多少代表存儲器的容量每個存儲單元存儲8個2進制位—容量用Byte數(shù)來衡量1.存儲器的編址8086CPU有20條地址線最大可尋址空間為 220=1MB物理地址范圍 00000H~0FFFFFH存儲單元連續(xù)編號,被稱為存儲器地址00000H00001H00002H00003H0FFFFDH0FFFFEH0FFFFFH2.數(shù)據(jù)的存儲字節(jié)(Byte)每個字節(jié)占據(jù)1個存儲單元 (09234H)=78H字(Word)任何兩個相鄰的字節(jié)構(gòu)成1個Word存放形式:高地址單元對應(yīng)高位字節(jié),低地址單元對應(yīng)低位字節(jié)字的地址:用地址較小的字節(jié)單元的地址作為該字單元的地址(09235H)=3456H (09236H)=1234H雙字(DWord)兩個相鄰的字單元構(gòu)成1個雙字(09234H)=12345678H78H56H34H12H09234H09235H09236H09237H

字單元的地址可為奇數(shù)也可為偶數(shù),但由于機器中對字單元的訪問是以偶地址進行的,故若設(shè)字地址為奇地址,則需進行兩次存儲器訪問3.對內(nèi)存的訪問8086 字節(jié)

字80386 雙字 由指令明確規(guī)定或由指令中所使用的變量名(存儲單元的符號地址)的類型決定,變量名的類型是事先定義的。二、存儲器的段結(jié)構(gòu)8086CPU有20條地址線,存儲器地址是20位的8086的內(nèi)部寄存器(包括IP)都是16位的無法用寄存器直接對1MB的內(nèi)存空間直接進行尋址 引入分段的概念—實模式存儲器尋址

1MB的存儲空間可由用戶根據(jù)需要劃分成若干個邏輯段(Segment)每個段的容量≦64KB,連續(xù)的存儲單元。(段內(nèi)是16位的尋址,0000H—0FFFFH)每段地址最小的字節(jié)單元的地址為該段的段基址(首地址),要求其最低4位為0(如:00000H,00010H,000F0H,等)段與段之間的關(guān)系:鄰接、間隔、部分重疊、完全重疊。(一個物理存儲單元可以映象到一個或多個邏輯段中某一時刻,系統(tǒng)只允許訪問4個段中的內(nèi)容(由4個段寄存器指示,其中存放段首址的高16位—段基值)如果程序/數(shù)據(jù)較大(〉64KB)可修改段寄存器的內(nèi)容來訪問其他段段1段2段3段4段5鄰接部分重疊完全重疊間隔三、邏輯地址與物理地址1.物理地址即20位的地址編碼,每個存儲單元有唯一的物理地址信息的傳送是通過它來尋址存儲單元并進行傳送2.邏輯地址程序設(shè)計中使用的是邏輯地址由于段可重疊,同一個存儲單元可以有多個邏輯地址段基值:段起始單元地址的高16位,其值存放于段寄存器中偏移量:某存儲單元與它所在起始單元之間的距離,以字節(jié)數(shù)計偏移量為0:該單元就是段的起始單元偏移量的最大值:0FFFFH(0—0FFFFH共64K個)邏輯地址的表示方式段基值:偏移量內(nèi)部暫存器

IP

ES

SS

DS

CS輸入/輸出控制電路外部總線執(zhí)行部分控制電路123456∑ALU標志寄存器

AHAL

BHBLCHCL

DHDL

SP

BP

SI

DI通用寄存器地址加法器指令隊列緩沖器執(zhí)行部件(EU)總線接口部件(BIU)16位20位16位8位三、邏輯地址與物理地址3.邏輯地址與物理地址的邏輯關(guān)系當CPU訪問存儲器時,BIU將邏輯地址轉(zhuǎn)換為物理地址物理地址=段基值×16+偏移量16位段基值16位偏移量000015 015 0+20位物理地址20 0所選存儲單元⊕

20位物理地址20016位段基值15 0000016位偏移量15 0所選段3.邏輯地址與物理地址的邏輯關(guān)系 邏輯地址1460H:0100H、1380H:0F00H14600H+100H14700H段地址左移4位加上偏移地址得到物理地址13800H+F00H14700H 物理地址 14700H段的分配例:如代碼段程序占用8KB(2000H)存儲區(qū),數(shù)據(jù)段占用2KB(800H)存儲區(qū),堆棧段占用256B存儲區(qū)。內(nèi)存應(yīng)如何分配。每段均小于64KB,且總占用量小于1MB可有多種分配方案代碼段堆棧段數(shù)據(jù)段附加段0150HCS4200HDS1CD0HSSB000HES01500H42000H1CD00HB0000H每段占用64KB,且段間間隔,所占用空間遠多于實際需要。8KB代碼段2KB數(shù)據(jù)段256B堆棧段0200HCS0400HDS0480HSSES02000H04000H04800H段間鄰接此例中每段的長度都是16的整數(shù)倍,可鄰接;若不滿足此要求,則下一段將從最近的第一個小段開始,中間有少于16Bytes的間隔4.邏輯地址的來源程序運行中所需要的指令、數(shù)據(jù)根據(jù)用途不同存放在內(nèi)存的不同段中,對內(nèi)存進行訪問時根據(jù)操作類型的不同,通過不同的途徑給出邏輯地址,以獲得物理地址。SI,DI等取指 CS IP堆棧 SS SP數(shù)據(jù) DS CS ES SSSSBottomAHALSPSP=SP-2XXXXAHALAXBXPUSH AXPOP BXAHALSP=SP+2第3章80x86的指令系統(tǒng)和尋址方式§3.1 80x86的尋址方式§3.3 80x86的指令系統(tǒng)§3.4 80x86的機器語言指令概況基本概念—指令系統(tǒng) 每一種計算機都有一組指令集供用戶使用,這組指令集稱為該計算機的指令系統(tǒng)。指令集中的每條指令在匯編語言中都是用助記符來表示的?;靖拍睢噶畹臉?gòu)成指令由操作碼和操作數(shù)兩部分組成操作碼說明計算機要執(zhí)行哪種操作,如傳送、運算、移位、跳轉(zhuǎn)等操作,它是指令中不可缺少的組成部分操作數(shù)是指令執(zhí)行的參與者,即各種操作的對象有些指令不需要操作數(shù),通常的指令都有一個或兩個操作數(shù),也有個別指令有3個甚至4個操作數(shù)操作碼操作數(shù)基本概念—8086指令的基本格式操作碼 [目的操作數(shù)][,源操作數(shù)]][;注釋]DESTSRC[]內(nèi)的內(nèi)容可缺省書寫注意事項:操作碼與操作數(shù)至少有一個空格或制表符分隔操作數(shù)之間必須用“,”相分隔,DEST在前,SRC在后每種指令的操作碼:用一個唯一的助記符表示(指令功能的英文縮寫)對應(yīng)著機器指令的一個二進制編碼指令中的操作數(shù):可以是一個具體的數(shù)值可以是存放數(shù)據(jù)的寄存器或指明數(shù)據(jù)在主存位置的存儲器地址基本概念—尋址方式在指令中為了取得操作數(shù)地址所使用的方式尋找操作數(shù)的過程就是操作數(shù)的尋址不同的指令系統(tǒng)都規(guī)定一些尋址方式供編程時選用指令的尋址方式主要由操作數(shù)的形式表示出來操作數(shù)采取哪一種尋址方式,會影響機器運行的速度和效率§3.1 80x86的尋址方式一、與數(shù)據(jù)有關(guān)的尋址方式二、與轉(zhuǎn)移地址有關(guān)的尋址方式立即(數(shù))尋址寄存器尋址直接尋址寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址1.立即(數(shù))尋址指令中的操作數(shù)直接存放在機器代碼中,緊跟在操作碼之后(操作數(shù)作為指令的一部分存放在操作碼之后的主存單元中)這種操作數(shù)被稱為立即數(shù)imm它可以是8位數(shù)值i8(00H~FFH)也可以是16位數(shù)值i16(0000H~FFFFH)立即數(shù)尋址方式常用來給R/M賦值立即數(shù)只能用于源操作數(shù)立即數(shù)尋址指令MOVAL,05H ;AL←05HMOVAX,0102H ;AX←0102H立即數(shù)尋址的功能立即數(shù)尋址的執(zhí)行2.寄存器尋址操作數(shù)存放在CPU的內(nèi)部寄存器reg中,可以是:8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL16位寄存器: AX、BX、CX、DX、SI、DI、BP、SP4個段寄存器seg: CS、DS、SS、ES

MOVAX,1234H ;AX←1234H MOVBX,AX ;BX←AX寄存器尋址的功能寄存器尋址的執(zhí)行存儲器操作數(shù)的尋址當操作數(shù)存放在內(nèi)存中時,尋找操作數(shù)歸結(jié)為如何確定存儲單元的地址邏輯地址 段基值:偏移量由段寄存器的內(nèi)容給出主要確定該部分的內(nèi)容(EA)物理地址=(段寄存器)×16+EA位移量:指令中給出16位數(shù)(常數(shù)、符號)EA 基地址:有基址寄存器BX或基址指針BP給出 由變址寄存器(SI或DI)給出在實際尋址過程中,可能包含不同部分,EA為它們的相加之和,可在64KB范圍內(nèi)尋址。構(gòu)成EA的3個分量的不同組合,形成了不同的尋址方式。3.直接尋址有效地址在指令中直接給出 操作數(shù)的16位偏移量直接包含在指令中,與操作碼一起放在代碼段中用符號表示的位移量MOVBX,VAR ←

→ MOVBX,DS:VAR;表示將用符號VAR表示的字單元的內(nèi)容→AX;不聲明段則默認為數(shù)據(jù)段,指明段寄存器則可實現(xiàn)段跨越用常數(shù)表示的位移量MOVAX,DS:[2000H];表示將數(shù)據(jù)段偏移2000H字節(jié)的字單元的內(nèi)容→AX直接尋址的功能MOVAX,DS:[2000H]直接尋址的執(zhí)行MOVAX,DS:[2000H]4.寄存器間接尋址有效地址存放在寄存器中,如BX、BP、SI、DI所使用的寄存器相當于地址指針,當修改其內(nèi)容后可指向不同的存儲單元書寫時用[]括住寄存器名,以區(qū)別于寄存器尋址若以BX、SI、DI間址,操作數(shù)默認在數(shù)據(jù)段;若以BP間址,操作數(shù)默認在堆棧段;使用段超越前綴改變段 MOVAX,[SI]

MOVAX,

DS:[SI]

MOVCL,[BX]

MOVCL,

DS:[BX]

MOVBL,[BP]

MOVBL,

SS:[BP]寄存器間接尋址的功能寄存器間接尋址的執(zhí)行5.寄存器相對尋址方式直接變址尋址,基址尋址,變址尋址有效地址是寄存器內(nèi)容與有符號8位或16位位移量之和,寄存器可以是BX、BP或SI、DI

EA=BX/BP或SI/DI+0/8/16位位移量段地址對應(yīng)BX/SI/DI寄存器默認是DS,對應(yīng)BP寄存器默認是SS;可用段超越前綴改變該方式不僅可以修改指針,還可以修改位移量,對數(shù)組操作十分方便基址尋址變址尋址5.寄存器相對尋址方式MOVAX,10H[SI] ←

→MOVAX,DS:10H[SI]MOVAX,ARRAY[BX]←

→MOVAX,DS:ARRAY[BX]MOVTABLE[DI],AL ←

→MOVDS:TABLE[DI],ALMOVTABZ[BP],BL ←

→MOVSS:TABZ[BP],BL寄存器相對尋址的功能寄存器相對尋址的執(zhí)行代碼段DS數(shù)據(jù)段操作碼24H00H12H34H56H78H9AHMOVAL,0024H[SI]0024H(SI)=0 (AL)=12H(SI)=1 (AL)=34H(SI)=2 (AL)=56H(SI)=3 (AL)=78H(SI)=4 (AL)=9AHEA=24H+(SI)(SI)可看作數(shù)據(jù)起始單元的偏移量數(shù)組內(nèi)某元素距數(shù)組起始單元的偏移通過修改SI可遍歷整個數(shù)組6.基址變址尋址方式有效地址由基址寄存器(BX或BP)的內(nèi)容加上變址寄存器(SI或DI)的內(nèi)容構(gòu)成:EA=BX/BP+SI/DI段地址對應(yīng)BX基址寄存器默認是DS,對應(yīng)BP基址寄存器默認是SS;可用段超越前綴改變6.基址變址尋址方式MOVAX,[BX][SI]

→ MOVAX,DS:[BX+SI]MOVAX,[BP][DI] ←

MOVAX,SS:[BP+DI]MOVAX,DS:[BP][DI] ←

→MOVAX,DS:[BP+DI]基址變址尋址的功能請指出圖中的錯誤!基址變址尋址的執(zhí)行請注意圖中的錯誤!7.相對基址變址尋址方式有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個8位或16位位移量之和:EA=BX/BP+SI/DI+8/16位位移量該方式中,BX/BP選一,SI/DI選一段地址對應(yīng)BX基址寄存器默認是DS,對應(yīng)BP基址寄存器默認是SS;可用段超越前綴改變7.相對基址變址尋址方式MOVAX,06H[BX+SI] ←

MOVAX,DS:[BX+SI+06H]MOVAL,TAB[BX][DI]←

MOVAL,DS:TABLE[BX][DI]MOVDWORD[BP][SI],DX ←

→MOVSS:DWORD[BP][SI],DX

MOVAX,ARRAY[BX][BP] ×MOVAX,DA[SI][DI] ×31A003000:1A00BX、SI分別存放數(shù)組的腳標MOVAL,ARRAY[BX][SI]DS數(shù)據(jù)段ARRAYSIBX二維數(shù)組起始單元⊕

EA[]之間表示相加的關(guān)系 [BX][SI]←

→[BX+SI]二、與轉(zhuǎn)移地址有關(guān)的尋址方式程序代碼亦存放在存儲器中,如何控制程序的走向(轉(zhuǎn)移位置的地址CS:IP)是本部分所涉及的內(nèi)容直接尋址方式轉(zhuǎn)移地址象立即數(shù)一樣,直接在指令的機器代碼中,就是直接尋址方式間接尋址方式轉(zhuǎn)移地址在寄存器或主存單元中,就是通過寄存器或存儲器的間接尋址方式用標號表達用寄存器或存儲器操作數(shù)表達目標地址的范圍:段內(nèi)段內(nèi)轉(zhuǎn)移——近轉(zhuǎn)移(near)在當前代碼段64KB范圍內(nèi)轉(zhuǎn)移(±32KB范圍)不需要更改CS段基值,只要改變IP偏移地址段內(nèi)轉(zhuǎn)移——短轉(zhuǎn)移(short)轉(zhuǎn)移范圍可以用一個字節(jié)表達,在段內(nèi)-128~+127范圍的轉(zhuǎn)移代碼段代碼段目標地址的范圍:段間段間轉(zhuǎn)移——遠轉(zhuǎn)移(far)從當前代碼段跳轉(zhuǎn)到另一個代碼段,可以在1MB范圍需要更改CS段基值和IP偏移地址目標地址必須用一個32位數(shù)表達,叫做32位遠指針,它就是邏輯地址代碼段代碼段

實際編程時,匯編程序會根據(jù)目標地址的距離,自動處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠轉(zhuǎn)移程序員可用操作符short、nearptr

或farptr

強制段內(nèi)直接尋址轉(zhuǎn)移 JMPlabel ;IP←IP+位移量位移量是緊接著JMP指令后的那條指令的偏移地址,到目標指令的偏移地址的地址位移當向地址增大方向轉(zhuǎn)移時,位移量為正;向地址減小方向轉(zhuǎn)移時,位移量為負實際為相對尋址

jmpagain ;轉(zhuǎn)移到again處繼續(xù)執(zhí)行

…… again: dec

cx

;標號again的指令

……

jmpoutput

;轉(zhuǎn)向output

…… output: movresult,al

;標號output的指令段內(nèi)間接尋址轉(zhuǎn)移 JMPr16/m16

;IP←r16/m16將一個16位寄存器或主存字單元內(nèi)容送入IP寄存器,作為新的指令指針,但不修改CS寄存器的內(nèi)容

jmpax

;IP←AX

jmpwordptr[bx] ;IP←[BX]段間直接尋址轉(zhuǎn)移JMPfarptrlabel ;IP←label的偏移地址 ;CS←label的段基值將標號所在段的段基值作為新的CS值,標號在該段內(nèi)的偏移地址作為新的IP值;程序跳轉(zhuǎn)到新的代碼段執(zhí)行jmpfarptr

otherseg ;遠轉(zhuǎn)移到代碼段2的otherseg段間間接尋址轉(zhuǎn)移JMPfarptr

mem ;IP←[mem],CS←[mem+2]用一個雙字存儲單元表示要跳轉(zhuǎn)的目標地址。這個目標地址存放在主存中連續(xù)的兩個字單元中的,低位字送IP寄存器,高位字送CS寄存器movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx]

;轉(zhuǎn)移到1500h:0§3.3 80x86的指令系統(tǒng)指令分類功能格式數(shù)據(jù)傳送指令算術(shù)運算指令邏輯指令串操作指令程序轉(zhuǎn)移指令處理器控制指令雙操作數(shù)指令(DEST,SRC)單操作數(shù)指令(DEST)無操作數(shù)指令(隱含,按約定尋找操作數(shù))一、數(shù)據(jù)傳送指令數(shù)據(jù)傳送是計算機中最基本、最重要的一種操作傳送指令也是最常使用的一類指令傳送指令把數(shù)據(jù)從一個位置傳送到另一個位置除標志寄存器傳送指令外,均不影響標志位重點掌握MOVXCHGXLATPUSHPOPLEA1.通用數(shù)據(jù)傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGXLAT1) 傳送指令MOV(move)格式:MOVDEST,SRC功能:將源操作數(shù)的內(nèi)容傳送至目的操作數(shù)中即(DEST)←(SRC)說明:DEST可以是8/16位的R(CS、IP除外)/MSRC可以是8/16位的R/M/立即數(shù)只能出現(xiàn)在源操作數(shù)的位置1)傳送指令MOV—立即數(shù)傳送MOVreg/mem,imm ;立即數(shù)送寄存器或主存moval,4 ;(al)←4,字節(jié)傳送movcx,0ffh ;(cx)←00ffh,字傳送movsi,200h ;(si)←0200h,字傳送movbyteptr[si],0ah ;byteptr

說明是字節(jié)操作movwordptr[si+2],0bh

;wordptr

說明是字操作注意立即數(shù)是字節(jié)量還是字量明確指令是字節(jié)操作還是字操作1)傳送指令MOV

—寄存器之間數(shù)據(jù)傳送MOVreg,regmov

ax,bx ;(ax)←(bx),字傳送movah,al ;(ah)←(al),字節(jié)傳送mov

ds,ax ;(ds)←(ax),字傳送

CS不能做目的操作數(shù)1)傳送指令MOV

—寄存器與存儲器之間數(shù)據(jù)傳送MOVAL,D_BYTEMOVDX,[BP] ;DX←SS:[BP]MOVDL,[SI] ;DL←DS:[SI]1)傳送指令MOV

—使用該指令應(yīng)注意的問題SRC與DEST的長度必須一致

錯誤示例: MOVAX,BL MOVCL,3824HDEST不能為CS、IP及立即數(shù)

錯誤示例: MOVVAR1,VAR2

正確實現(xiàn): MOVAL,VAR2 MOVVAR1,ALSRC與DEST不能同時為存儲器操作數(shù)—8086不支持兩個存儲單元間數(shù)據(jù)的直接傳送SRC與DEST不能同時為段寄存器

例: DS←ES

錯誤: MOVDS,ES正確實現(xiàn): MOVAX,ES MOVDS,AX不能將立即數(shù)直接傳送到段寄存器例: MOVAX,ES

MOVDS,AX1)傳送指令MOV—數(shù)據(jù)傳送方向示意立即數(shù)段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存儲器2)交換指令XCHG(exchange)指令格式: XCHGDEST,SRC指令功能: (DEST)←

(SRC)

寄存器與寄存器之間對換數(shù)據(jù) 寄存器與存儲器之間對換數(shù)據(jù)注意:不能在存儲器與存儲器之間對換數(shù)據(jù)

2)交換指令XCHG—寄存器間交換例:(ax)=1234h

(bx)=5678h交換ax和bx的內(nèi)容。 Mov

cx,axMovax,bxMov

bx,cx

或:xchg

ax,bx

;ax=5678h,bx=1234hxchg

ah,al

;ax=7856h2)交換指令XCHG

—寄存器與存儲器交換xchgax,ds:[2000h] ;字交換;等同于xchgds:[2000h],axxchgal,ds:[2000h] ;字節(jié)交換;等同于xchgds:[2000h],al2)交換指令XCHG—例題分析例:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,在指令XCHGBX,[BP+SI]執(zhí)行后,相關(guān)寄存器和存儲器的內(nèi)容是什么?分析:源操作數(shù)的物理地址= (SS)×16+(BP)+(SI)= 2F000H+0200H+0046H=2F246H指令的功能:(BX)←

(2F246H)指令執(zhí)行結(jié)果:(BX)=4154H,(2F246H)=6F30H3)換碼指令XLAT(translate)指令格式:

XLAT指令功能:AL←DS:[BX+AL],將BX指定的緩沖區(qū)中、AL指定的位移處的一個字節(jié)數(shù)據(jù)取出賦給AL換碼指令執(zhí)行前:在主存建立一個字節(jié)量表格,內(nèi)含要轉(zhuǎn)換成的目的代碼表格首地址存放于BX,AL存放相對表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標代碼movbx,100hmoval,03hxlat3)換碼指令XLAT—例題(BX)(AL)DS數(shù)據(jù)段12H34H56H78H9AH78H(AL)=78H20000100010101020103AL←DS:[BX+AL]2.堆棧操作指令—進棧指令PUSH格式: PUSHSRC功能: SP←SP-2, SS:[SP]←(r16/m16/seg)例:pushaxpushDS:[2000h]2.堆棧操作指令—出棧指令POP格式: POPDEST功能: (r16/m16/seg)←SS:[SP]

SP←SP+2,

例:popDXpopDS:[2000h]2.堆棧操作指令—應(yīng)用舉例pushax ;進入子程序后pushbxpushds...popds

;返回主程序前popbxpopax3.標志寄存器傳送指令標志寄存器傳送指令用來傳送標志寄存器FLAGS的內(nèi)容,方便進行對各個標志位的直接操作有2對4條指令低8位傳送:LAHF和SAHF16位傳送:PUSHF和POPF標志寄存器傳送指令

—標志低字節(jié)進出AH指令格式:LAHF功能:(AH)←FLAGS的低字節(jié)LAHF指令將標志寄存器的低字節(jié)送寄存器AHSF/ZF/AF/PF/CF狀態(tài)標志位分別送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意格式:SAHF功能:FLAGS的低字節(jié)←(AH)SAHF將AH寄存器內(nèi)容送FLAGS的低字節(jié)用AH的第7/6/4/2/0位相應(yīng)設(shè)置SF/ZF/AF/PF/CF標志3.標志寄存器傳送指令—

標志寄存器進出堆棧指令格式:PUSHF功能:SP←SP-2SS:[SP]←FLAGSPUSHF指令將標志寄存器的內(nèi)容壓入堆棧,同時棧頂指針SP減2格式:POPF功能:FLAGS←SS:[SP] SP←SP+2POPF指令將棧頂字單元內(nèi)容送標志寄存器,同時棧頂指針SP加23.標志寄存器傳送指令—

標志寄存器進出堆棧指令(置位單步標志)pushf

;保存全部標志到堆棧popax ;從堆棧中取出全部標志orax,0100h ;設(shè)置D8=TF=1,ax其它位不變pushax ;將ax壓入堆棧popf ;FLAGS←AX;將堆棧內(nèi)容取到標志寄存器4.地址傳送指令地址傳送指令將存儲器單元的邏輯地址送至指定的寄存器有效地址傳送指令LEA指針傳送指令LDS和LES注意不是獲取存儲器單元的內(nèi)容4.地址傳送指令

—有效地址傳送指令LEA(loadEA)格式:LEADEST,SRC16位寄存器存儲器操作數(shù)功能:DEST←SRC的有效地址EA

將存儲器操作數(shù)的有效地址傳送至指定的16位寄存器中獲得主存單元的有效地址;不是物理地址,也不是該單元的內(nèi)容可以實現(xiàn)計算功能LEABX,BUFR9A78H(BX)=9A78H4.地址傳送指令

—有效地址傳送指令LEA(例)23H093A0HBUFR78H9AH093AHDS093A:0023H(BX)=0023H錯誤!4.地址傳送指令 —地址指針存儲單元的邏輯地址段基值(16位)段內(nèi)偏移量(16位)地址指針(32位) M的邏輯地址在M中需4個連續(xù)的存儲單元段基值A(chǔ)D_POINTXXXX偏移量XXXX4.地址傳送指令 —指針傳送指令格式:LDSDEST,SRC功能:(DEST)←(SRC)段內(nèi)偏移量DS←(SRC+2)段基值LDS指令將主存中SRC

指定的字送至16位寄存器DEST,并將SRC的下一字送DS寄存器格式:LESDEST,SRC功能:(DEST)←(SRC)段內(nèi)偏移量ES←(SRC+2)段基值LDS指令將主存中SRC

指定的字送至16位寄存器DEST,并將SRC的下一字送ES寄存器例:(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B80CH)=4000H,(405AEH)=9634H,在執(zhí)行指令

LDSDI,[BX] MOVAX,[DI]

后,(AX)=?BX=080AHB0000H0B80AH40000H34H96HAEH05H00H40H405AEH05AEH0B80EH(DI)=05AEH(DS)=4000H結(jié)果: (DS)=4000H(DI)=05AEH(AX)=9634H3.加/減1指令格式: INCDEST DECDEST功能: (DEST)←(DEST)+/-1受影響標志:PF,AF,ZF,SF,OF說明:DEST可以是字節(jié)或字R、M功能與ADD/SUB相似,但占用字節(jié)少,且不影響標志位CF。常用于修改地址指針及循環(huán)計數(shù)器。 4.求補指令(求負數(shù))格式: NEGDEST功能: (DEST)←0-(DEST)受影響標志:CF,PF,AF,ZF,SF,OF說明:DEST可以是字節(jié)或字R、M操作對象是有符號的數(shù)當操作數(shù)取最小值(-128或-32768)時,執(zhí)行該指令后,操作數(shù)無變化,OF=1當操作數(shù)為0時,結(jié)果為0,但CF=0,其他情況CF=14.求補指令(舉例)例:AL=13H,執(zhí)行指令

NEGAL

后AL的值1000000000001001111101101—ALAL=-13H100100100000000110010011+5.比較指令CMP(compare)格式: CMPDEST,SRC功能: (DEST)-(SRC)受影響標志:CF,PF,AF,ZF,SF,OF說明:DEST,SRC可以是字節(jié)或字R、M,長度必須一致SRC還可以是immDEST和SRC不能同時為M該指令主要用于比較兩數(shù)的關(guān)系5.比較指令CMP—應(yīng)用ZF=1 ;兩數(shù)相等兩個無符號數(shù)比較

CMPAX,BX ;

0 AX≥

BX1 AX<BX

CF= 兩個帶符號的數(shù)的比較不能用單一的符號判斷兩個數(shù)的關(guān)系

指令執(zhí)行后SF與OF相同,(DEST)>SRCSF與OF不同,(DEST)<SRC5.比較指令CMP—(CMPAL,BL)AL=-2BL=127111111100111111101111111-SF=0OF=1相異,AL<BLAL=-2BL=-11111111101111111111111111-SF=1OF=0相異,AL<BL5.比較指令CMP—(CMPAL,BL)AL=-1BL=-2111111111111111000000001-SF=0OF=0相同,AL>BLAL=127BL=-21011111111111111010000001-SF=1OF=1相同,AL>BL6.乘法指令MULr8/m8;無符號字節(jié)乘法;AX←AL×r8/m8MULr16/m16;無符號字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符號字節(jié)乘法;AX←AL×r8/m8IMULr16/m16;有符號字乘法;DX.AX←AX×r16/m166.乘法指令—功能乘法指令分無符號和有符號乘法指令乘法指令的源操作數(shù)顯式給出,隱含使用另一個操作數(shù)AX和DX字節(jié)相乘:AL與r8/m8相乘,得到16位的結(jié)果,存入AX字相乘:AX與r16/m16相乘,得到32位的結(jié)果,其高字存入DX,低字存入AX乘法指令利用OF和CF判斷乘積的高一半是否具有有效數(shù)值6.乘法指令—對標志的影響

乘法指令如下影響OF和CF標志:MUL指令——若乘積的高一半(AH或DX)為0,則OF=CF=0;否則OF=CF=1IMUL指令——若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為16.乘法指令—(例)moval,0b4h

;al=b4h=180movbl,11h

;bl=11h=17mul

bl

;ax=Obf4h=3060,OF=CF=1,AX高8位不為0moval,0b4h

;al=b4h=-76movbl,11h

;bl=11h=17imul

bl

;ax=faf4h=-1292,OF=CF=1,AX高8位有效6.除法指令DIVr8/m8

;無符號字節(jié)除法AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余數(shù)DIVr16/m16

;無符號字除法;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余數(shù)IDIVr8/m8

;有符號字節(jié)除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余數(shù)IDIVr16/m16

;有符號字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余數(shù)6.除法指令—功能除法指令分無符號和有符號除法指令除法指令的除數(shù)顯式給出,隱含使用另一個操作數(shù)AX和DX作為被除數(shù)字節(jié)量除法:AX除以r8/m8,8位商存入AL,8位余數(shù)存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余數(shù)存入DX除法指令對標志沒有影響除法指令會產(chǎn)生結(jié)果溢出6.除法指令—除法錯中斷當被除數(shù)遠大于除數(shù)時,所得的商就有可能超出它所能表達的范圍。如果存放商的寄存器AL/AX不能表達,便產(chǎn)生溢出,8086CPU中就產(chǎn)生編號為0的內(nèi)部中斷——除法錯中斷對DIV指令,除數(shù)為0,或者在字節(jié)除時商超過8位,或者在字除時商超過16位,則發(fā)生除法溢出對IDIV指令,除數(shù)為0,或者在字節(jié)除時商不在-128~127范圍內(nèi),或者在字除時商不在-32768~32767范圍內(nèi),則發(fā)生除法溢6.除法指令—(例)movax,0400h

;ax=400h=1024movbl,0b4h

;bl=b4h=180divbl

;商al=05h=5,余數(shù)ah=7ch=124movax,0400h

;ax=400h=1024movbl,0b4h

;bl=b4h=-76idiv

bl

;商al=f3h=-13,余數(shù)ah=24h=367.符號擴展指令—符號擴展的概念符號擴展是指用一個操作數(shù)的符號位(即最高位)形成另一個操作數(shù),后一個操作數(shù)的各位是全0(正數(shù))或全1(負數(shù))。符號擴展不改變數(shù)據(jù)大小對于數(shù)據(jù)64H(表示數(shù)據(jù)100),其最高位D7為0,符號擴展后高8位都是0,成為0064H(仍表示數(shù)據(jù)100)對于數(shù)據(jù)ff00H(表示有符號數(shù)-256),其最高位D15為1,符號擴展后高16位都是1,成為ffffff00H(仍表示有符號數(shù)-256)7.符號擴展指令CBW

;AL的符號擴展至AH;如AL的最高有效位是0,則AH=00;AL的最高有效位為1,則AH=FFH。AL不變CWD

;AX的符號擴展至DX;如AX的最高有效位是0,則DX=00;AX的最高有效位為1,則DX=FFFFH。AX不變符號擴展指令常用于獲得雙倍長的數(shù)據(jù)7.符號擴展指令—(例:AX/BX)cwd

;DX.AX←AXidiv

bx

;AX←DX.AX÷BX

利用符號擴展指令得到除法指令所需要的倍長于除數(shù)的被除數(shù)對無符號數(shù)除法應(yīng)該采用直接使高8位或高16位清0的方法,獲得倍長的被除數(shù)8.十進制調(diào)整指令十進制數(shù)調(diào)整指令對二進制運算的結(jié)果進行十進制調(diào)整,以得到十進制的運算結(jié)果分成壓縮BCD碼和非壓縮BCD碼調(diào)整8.十進制調(diào)整指令

—壓縮BCD碼加、減調(diào)整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)

DAA;AL←將AL的加和調(diào)整為壓縮BCD碼(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)

DAS;AL←將AL的減差調(diào)整為壓縮BCD碼使用DAA或DAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令DAA和DAS指令對OF標志無影響,按結(jié)果影響其他標志8.十進制調(diào)整指令—

壓縮BCD碼加、減調(diào)整指令(例)moval,68h ;al=68h,壓縮BCD碼表示真值68movbl,28h ;bl=28h,壓縮BCD碼表示真值28addal,bl

;二進制加法:al=68h+28h=90hdaa

;十進制調(diào)整:al=96h;實現(xiàn)壓縮BCD碼加法:68+28=96moval,68h ;al=68h,壓縮BCD碼表示真值68movbl,28h ;bl=28h,壓縮BCD碼表示真值28subal,bl

;二進制減法:al=68h-28h=40hdas ;十進制調(diào)整:al=40h;實現(xiàn)壓縮BCD碼加法:68-28=408.十進制調(diào)整指令

—非壓縮BCD碼加、減調(diào)整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)

AAA;AL←將AL的加和調(diào)整為非壓縮BCD碼;AH←AH+調(diào)整的進位(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)

AAS;AL←將AL的減差調(diào)整為非壓縮BCD碼;AH←AH-調(diào)整的借位使用AAA或AAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令A(yù)AA和AAS指令在調(diào)整中產(chǎn)生了進位或借位,則AH要加上進位或減去借位,同時CF=AF=1,否則CF=AF=0;它們對其他標志無影響8.十進制調(diào)整指令

—非壓縮BCD碼加、減調(diào)整指令(例)movax,0608h ;ax=0608h,非壓縮BCD碼表示真值68movbl,09h ;bl=09h,非壓縮BCD碼表示真值9addal,bl

;二進制加法:al=08h+09h=11haaa

;十進制調(diào)整:ax=0707h;實現(xiàn)非壓縮BCD碼加法:68+9=77movax,0608h

;ax=0608h,非壓縮BCD碼表示真值68movbl,09h

;bl=09h,非壓縮BCD碼表示真值9subal,bl

;二進制減法:al=08h-09h=ffhaas

;十進制調(diào)整:ax=0509h;實現(xiàn)非壓縮BCD碼減法:68-9=59例:用乘法指令實現(xiàn)32位二進制數(shù)的相乘cdabaxdxaxdxdxaxdxax×

+

b×da×db×ca×cDSEG SEGMENTPARA'Data‘num1 dw1220h,48a2hnum2 dw2398h,0ae41hprodu

dw4dup(0)DSEG ENDSabcdnum1num1+2num2num2+2produprodu+2produ+4produ+6三、邏輯指令

(邏輯)位操作類指令以二進制位為基本單位進行數(shù)據(jù)的操作;這是一類常用的指令,都應(yīng)該特別掌握邏輯運算指令測試指令移位指令1.邏輯運算指令格式:

ANDDEST,SRC ORDEST,SRC XORDEST,SRC NOTDEST功能: (DEST)←(DEST)(SRC)∧∨∨(DEST)←(DEST)

受影響標志:CF=0,OF=0,PF,ZF,SF,NOT對標志無影響1.邏輯運算指令—應(yīng)用moval,45h ;邏輯與al=01handal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;邏輯或al=75horal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;邏輯異或al=74hxoral,31h ;CF=OF=0,SF=0、ZF=0、PF=1moval,45h ;邏輯非al=0bahnotal ;標志不變1.邏輯運算指令—應(yīng)用AND指令可用于復(fù)位某些位(同0相與),不影響其他位:將BL中D3和D0位清0,其他位不變

ANDBL,11110110B

OR指令可用于置位某些位(同1相或),不影響其他位:將BL中D3和D0位置1,其他位不變

ORBL,00001001BXOR指令可用于求反某些位(同1

溫馨提示

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

評論

0/150

提交評論