ch02 匯編語言基礎(chǔ)C_第1頁(yè)
ch02 匯編語言基礎(chǔ)C_第2頁(yè)
ch02 匯編語言基礎(chǔ)C_第3頁(yè)
ch02 匯編語言基礎(chǔ)C_第4頁(yè)
ch02 匯編語言基礎(chǔ)C_第5頁(yè)
已閱讀5頁(yè),還剩371頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第二章

匯編語言基礎(chǔ)

第二章匯編語言基礎(chǔ)2.1

匯編語言概述2.2

8086/8088微處理器編程結(jié)構(gòu)

2.3

匯編語言上機(jī)調(diào)試2.4

匯編語言源程序組織2.5

匯編語言中的操作數(shù)2.68086/8088尋址方式2.78086/8088指令系統(tǒng)2.8基本I/O功能調(diào)用機(jī)器語言BASICC/C++JAVA...匯編語言高級(jí)語言2.1匯編語言概述計(jì)算機(jī)程序設(shè)計(jì)語言機(jī)器語言(MachineLanguage)A0102002061120A21220匯編語言(AssemblyLanguage)MOVAL,[2010H]ADDAL,[2011H]MOV[2012H],AL高級(jí)語言(High-levelLanguage)

二進(jìn)制編碼的機(jī)器指令用助記符表示的指令類似自然語言和數(shù)學(xué)描述語言什么是匯編語言以助記符形式表示計(jì)算機(jī)指令助記符是便于人們記憶、并能描述指令功能和指令操作數(shù)的符號(hào)助記符是表明指令功能的英語單詞或其縮寫匯編格式指令以及使用它們編寫程序的規(guī)則就形成匯編語言(AssemblyLanguage)匯編語言程序:用匯編語言書寫的程序匯編程序:將匯編語言程序“匯編”成機(jī)器代碼目標(biāo)模塊的程序

匯編語言程序與匯編程序是兩個(gè)概念匯編語言的特點(diǎn)匯編語言的優(yōu)點(diǎn):使用助記符表示的指令,易于編寫、調(diào)試和維護(hù)直接控制計(jì)算機(jī)硬件部件編寫“時(shí)間”和“空間”兩方面最有效程序匯編語言的缺點(diǎn):與處理器密切有關(guān)需要熟悉計(jì)算機(jī)硬件系統(tǒng)、考慮許多細(xì)節(jié)編寫繁瑣,調(diào)試、維護(hù)、交流和移植困難匯編語言和高級(jí)語言的混合編程匯編語言的優(yōu)點(diǎn)使得它在程序設(shè)計(jì)中占有重要的位置,不可被取代匯編語言的缺點(diǎn)使得人們主要采用高級(jí)語言進(jìn)行程序開發(fā)工作有時(shí)需要采用高級(jí)語言和匯編語言混合編程,互相取長(zhǎng)補(bǔ)短,更好地解決實(shí)際問題混合編程取長(zhǎng)補(bǔ)短匯編語言的應(yīng)用場(chǎng)合(1)對(duì)軟件的執(zhí)行時(shí)間或存儲(chǔ)容量有較高要求的場(chǎng)合。操作系統(tǒng)核心程序,智能化儀器儀表的控制系統(tǒng),實(shí)時(shí)控制系統(tǒng)等(2)需要提高大型軟件性能的場(chǎng)合。通常把大型軟件中執(zhí)行頻率高的子程序(過程)用匯編語言編寫,然后把它們與其他程序一起連接。(3)軟件與硬件關(guān)系密切,軟件需要直接和有效控制硬件的場(chǎng)合。如設(shè)備驅(qū)動(dòng)程序,I/O接口電路的初始化程序段等。(4)沒有合適的高級(jí)語言的場(chǎng)合或只能采用匯編語言的時(shí)候。開發(fā)最新的處理器程序時(shí),暫時(shí)沒有支持新指令的編譯程序。(5)其它,如系統(tǒng)的底層軟件、加密解密軟件、分析和防治計(jì)算機(jī)病毒軟件等。2.28086/8088微處理器編程結(jié)構(gòu)編程結(jié)構(gòu):是指從程序員和使用者的角度看到的結(jié)構(gòu),與芯片內(nèi)部的物理結(jié)構(gòu)和實(shí)際布局有區(qū)別。2.2.18086/8088的功能結(jié)構(gòu)2.2.28086/8088的存儲(chǔ)器組織2.2.38086/8088的寄存器結(jié)構(gòu)

兩大獨(dú)立部分:BIU(BusInterfaceUnit)

總線接口單元由5個(gè)主要部件構(gòu)成EU(ExecutionUnit)

執(zhí)行單元由4個(gè)主要部件構(gòu)成?2.2.1

8086/8088的功能結(jié)構(gòu)總線接口部件BIU構(gòu)成部分4個(gè)16位段寄存器:CS,DS,ES,SS16位IP指令指針寄存器20位地址加法器6字節(jié)的指令隊(duì)列(8088的指令隊(duì)列為4字節(jié)

)總線控制電路主要功能負(fù)責(zé)與存儲(chǔ)器、I/O接口傳遞數(shù)據(jù),完成所有的訪問操作具體完成:(1)計(jì)算形成20位物理地址(2)從內(nèi)存預(yù)取指令,送到指令隊(duì)列;

(3)與內(nèi)存或外設(shè)交換數(shù)據(jù):讀/寫操作數(shù)、執(zhí)行結(jié)果送至內(nèi)存或外設(shè)(4)總線控制:響應(yīng)外部中斷請(qǐng)求執(zhí)行部件EU構(gòu)成部分8個(gè)16位寄存器:AX、BX、CX、DX、SP、BP、DI、SI1個(gè)標(biāo)志寄存器PSW1個(gè)算術(shù)邏輯運(yùn)算部件ALU數(shù)據(jù)暫存器EU控制器主要功能負(fù)責(zé)指令的譯碼、執(zhí)行。具體完成:(1)從指令隊(duì)列中取指令(2)指令譯碼(3)執(zhí)行指令(4)指令執(zhí)行結(jié)果→BIU取指執(zhí)行取指執(zhí)行取指執(zhí)行取指執(zhí)行取指取指取指取指取指執(zhí)行執(zhí)行執(zhí)行執(zhí)行BIUEU時(shí)間時(shí)間8086/8088流水線執(zhí)行方式非流水執(zhí)行方式8086之前,CPU串行方式工作8086并行方式工作——首次引入指令流水線

BIU和EU并行工作的方式取指、執(zhí)指二級(jí)流水線BIU與EU的操作協(xié)調(diào)(1)(1)執(zhí)行單元EU并不直接與外部發(fā)生聯(lián)系,而是從總線接口單元BIU的指令隊(duì)列中源源不斷地獲取指令并執(zhí)行。每當(dāng)指令隊(duì)列中存滿一條指令后,EU就立即開始執(zhí)行。(2)每當(dāng)指令隊(duì)列中有2個(gè)空字節(jié)時(shí),BIU就會(huì)自動(dòng)地尋找空閑的總線周期進(jìn)行預(yù)取指令操作,直至填滿為止。其取指的順序是按指令在程序中出現(xiàn)的先后順序。(3)每當(dāng)EU準(zhǔn)備執(zhí)行一條指令時(shí),它會(huì)從BIU部件的指令隊(duì)列前部取出指令的代碼,然后用幾個(gè)時(shí)鐘周期去執(zhí)行指令。在執(zhí)行指令的過程中,如果必須訪問存儲(chǔ)器或者I/O端口,那么EU就會(huì)請(qǐng)求BIU進(jìn)入總線周期,并形成有效地址EA送給BIU,由BIU的地址加法器形成物理地址PA從存儲(chǔ)器或I/O端口取回操作數(shù)送給EU,完成訪問內(nèi)存或者I/O端口的操作。如果此時(shí)BIU正好處于空閑狀態(tài),會(huì)立即響應(yīng)EU的總線請(qǐng)求;如果BIU正將某個(gè)指令字取到指令隊(duì)列中,則BIU將首先完成這個(gè)取指令的總線周期,然后再去響應(yīng)EU發(fā)出的訪問總線的請(qǐng)求。BIU與EU的操作協(xié)調(diào)(2)(4)每當(dāng)EU執(zhí)行一條轉(zhuǎn)移、調(diào)用或返回指令后,BIU清除指令隊(duì)列緩沖器,并從新的目標(biāo)地址開始預(yù)取指令送入指令隊(duì)列,此時(shí)EU才能繼續(xù)執(zhí)行指令,實(shí)現(xiàn)程序執(zhí)行的轉(zhuǎn)移。這時(shí)EU和BIU的并行操作顯然要受到一定的影響,但只要轉(zhuǎn)移、調(diào)用指令出現(xiàn)的概率不是很高,EU和BIU間相互獨(dú)立又相互配合的工作方式仍將大大提高CPU的工作效率。(5)當(dāng)指令隊(duì)列已滿,且EU又沒有總線訪問請(qǐng)求時(shí),BIU便進(jìn)入空閑狀態(tài)。Intel808616條數(shù)據(jù)線(16位機(jī))20條地址線(尋址能力220=1MB)Intel8088與外部交換數(shù)據(jù)的數(shù)據(jù)總線

8條數(shù)據(jù)線(準(zhǔn)16位機(jī))20條地址線重要差別

8086/8088兩者內(nèi)部結(jié)構(gòu)基本相同

8086指令對(duì)列為6字節(jié),若出現(xiàn)2字節(jié)空閑,則預(yù)取指令。

8088指令對(duì)列為4字節(jié),若出現(xiàn)1字節(jié)空閑,則預(yù)取指令;8086CPU與8088CPU的區(qū)別8086/8088CPU分為哪兩大部件?其各自的主要功能是什么?8086與8088CPU的區(qū)別有哪些?總結(jié)2.2.28086的存儲(chǔ)器組織存儲(chǔ)器:用來存放程序、數(shù)據(jù)。存儲(chǔ)器以字節(jié)(8bit)為單位存儲(chǔ)信息每個(gè)字節(jié)的存儲(chǔ)單元有一個(gè)地址地址用二進(jìn)制數(shù)表示(無符號(hào)整數(shù),通常寫成十六進(jìn)制形式)多字節(jié)數(shù)據(jù)在存儲(chǔ)器中占連續(xù)的多個(gè)存儲(chǔ)單元:存放時(shí),高字節(jié)存入高地址,低字節(jié)存入低地址;表達(dá)時(shí),用它的低地址表示多字節(jié)數(shù)據(jù)占據(jù)的地址空間。

80x86系統(tǒng)采用“高高低低”原則存儲(chǔ),稱為“小端方式LittleEndian”。相對(duì)應(yīng)還存在“大端方式BigEndian”。存儲(chǔ)器地址

8086具有20位地址總線,可尋址220=1MB存儲(chǔ)空間,存儲(chǔ)器的每一個(gè)存儲(chǔ)單元(每一個(gè)字節(jié))與一個(gè)20位地址相對(duì)應(yīng),稱為物理地址。

物理地址:信息在存儲(chǔ)器中實(shí)際有效的地址單元號(hào),

CPU訪問內(nèi)存是按物理地址尋址的。

例如:1234H以不同方式存儲(chǔ)時(shí)的情況。

2FFFH3000H3001H3002H3003H34H12H小端方式12H34H大端方式2FFFH3000H3001H3002H3003H12345678H34H12H低高雙字?jǐn)?shù)據(jù)56H78H

數(shù)據(jù)存儲(chǔ)格式(00002H)=12H,或[00002H]=12H(00003H)=34H,或[00003H]=34H

字?jǐn)?shù)據(jù)3412H

=(00002H)雙字?jǐn)?shù)據(jù)78563412H

=(00002H)存儲(chǔ)器的分段管理8086CPU有20條地址線可尋址空間從00000H~FFFFFH,即220=1MB存儲(chǔ)系統(tǒng)中,對(duì)應(yīng)每個(gè)物理存儲(chǔ)單元的一個(gè)唯一的20位編號(hào),就是物理地址8086機(jī)器字長(zhǎng)16位僅能表示地址范圍0000H~FFFFH(64KB)存儲(chǔ)器的邏輯分段每個(gè)段最大限制為64KB,段地址的低4位為0000B分段后編程時(shí)采用邏輯地址,形式為

段地址:

段內(nèi)偏移地址8086首次引入存儲(chǔ)器分段管理機(jī)制,可分為4種分工不同、相對(duì)獨(dú)立的邏輯段:代碼段:存放程序的指令和常數(shù)數(shù)據(jù)段:存放數(shù)據(jù)堆棧段:用于保護(hù)數(shù)據(jù)、傳遞數(shù)據(jù)、保存返回地址附加段:存放數(shù)據(jù),可以作為數(shù)據(jù)段的擴(kuò)展;用于串操作存儲(chǔ)器的分段管理存儲(chǔ)器分段示意每個(gè)段可安排在1MB空間的任何位置段與段之間是相互獨(dú)立的段的排列非常靈活,可以連續(xù)、分開、重疊段內(nèi)地址是連續(xù)的

每個(gè)段最大空間為64KB

每個(gè)邏輯段的起始地址16的倍數(shù)低4位為0000Bxxxx0H代碼段起始地址堆棧段起始地址數(shù)據(jù)段起始地址附加段起始地址10550H250A0H8FFB0HEFF10HCS1055H250AH8FFBHEFF1HSSDSES段基址段寄存器8086/8088規(guī)定段起始地址必須是模16地址:xxxx0H,省略低4位0000B,段地址就可以用16位數(shù)據(jù)表示用16位段寄存器來存放段基址說明邏輯段在內(nèi)存中的起始位置

段起始地址確定了邏輯段在整個(gè)內(nèi)存空間的位置(邏輯段定位);偏移地址確定了要尋址的內(nèi)存單元在本邏輯段中的位置。段起始地址和偏移地址,共同確定了要尋址的內(nèi)存單元在整個(gè)內(nèi)存空間的位置

每個(gè)邏輯段不超過64KB,偏移地址也可用16位數(shù)據(jù)表示,存放在地址寄存器或直接提供程序中出現(xiàn)的地址是邏輯地址。物理地址和邏輯地址

物理地址:信息在存儲(chǔ)器中實(shí)際有效的地址單元號(hào),

CPU訪問內(nèi)存是按物理地址尋址的。邏輯地址段基址保存在段寄存器

偏移地址保存在地址寄存器邏輯地址的表示方法段基址:偏移地址由地址寄存器提供或直接提供由段寄存器提供

8086微處理器20位物理地址的產(chǎn)生過程

問題:8086具有20位地址總線,可尋址220=1MB存儲(chǔ)空間,而8086CPU的寄存器為16位,如何尋址20位地址?

CPU執(zhí)行程序時(shí),需要將邏輯地址轉(zhuǎn)換為物理地址,稱為地址重定位

邏輯地址:段基址、偏移地址

20位物理地址與邏輯地址的關(guān)系(計(jì)算)物理地址=(段基址)×10H+偏移地址解決:將段寄存器中的段基址左移4位,擴(kuò)展成20位;用20位地址加法器,將段基址與偏移地址相加,形成20位物理地址。

20位物理地址計(jì)算例題

設(shè)(CS)=1200H,(IP)=0200H,求待取指令存放的物理地址物理地址=(CS)×10H+(IP)

=1200H×10H+0200H=12200H該物理地址可表示為(CS):(IP)或1200H:0200H(區(qū)別?)訪問代碼段一定是用邏輯地址(CS和IP)尋址物理地址=(段基址)×10H+偏移地址

某數(shù)據(jù)所在數(shù)據(jù)段(DS)=1350H,偏移地址=0020H,求存放該數(shù)據(jù)存儲(chǔ)單元的物理地址物理地址=(DS)×10H+0020H=1350H×10H+0020H=13520H訪問數(shù)據(jù)段時(shí),偏移地址表示比較靈活,可以存放在地址寄存器SI、DI、BX中,也可以在指令中直接給出數(shù)據(jù)段中可以定義變量,變量具有偏移地址屬性物理地址=(段基址)×10H+偏移地址一個(gè)存儲(chǔ)單元具有一個(gè)唯一的物理地址,一個(gè)物理地址可對(duì)應(yīng)多個(gè)邏輯地址邏輯地址 2012:3042、2002:3142物理地址 23162H23162H20120H+3042H23162H20020H+3142H23162H段地址左移4位加上偏移地址得到物理地址圖2?68086微處理器如何計(jì)算20位物理地址?8086開機(jī)或復(fù)位時(shí),設(shè)(CS)=FFFFH,(IP)=0000H,復(fù)位后CPU執(zhí)行第一條指令所在的物理地址?總結(jié)思考題:8086開機(jī)或復(fù)位時(shí)設(shè)(CS)=FFFFH,(IP)=0000H,復(fù)位后CPU執(zhí)行第一條指令所在的物理地址?

物理地址=(CS)×10H+(IP)

=FFFFH×10H+0000H=FFFF0H

FFFF0H~FFFFFH,存儲(chǔ)BIOS,16字節(jié),轉(zhuǎn)移指令書P57102.2.38086/8088的寄存器結(jié)構(gòu)共14個(gè)16位寄存器

1.通用寄存器8086有8個(gè)通用的16位寄存器(1)數(shù)據(jù)寄存器:AXBXCXDX(2)變址寄存器:SIDI(3)指針寄存器:BPSP(1)數(shù)據(jù)寄存器AX稱為累加器(Accumulator)使用頻度最高。用于算術(shù)、邏輯運(yùn)算、與外設(shè)傳送信息等BX稱為基址寄存器(BaseaddressRegister)常用做存放存儲(chǔ)器地址CX稱為計(jì)數(shù)器(Counter)作為循環(huán)和串操作等指令中的隱含計(jì)數(shù)器DX稱為數(shù)據(jù)寄存器(Dataregister)常用來存放雙字長(zhǎng)數(shù)據(jù)的高16位,或存放外設(shè)端口地址4個(gè)數(shù)據(jù)寄存器還可以分成高8位和低8位兩個(gè)獨(dú)立的寄存器,這樣又形成8個(gè)通用的8位寄存器,8位寄存器只能存放數(shù)據(jù)。例:匯編指令中寄存器的使用INAX,28H將(28H)端口數(shù)據(jù)傳送到AX(2)變址寄存器16位變址寄存器SI和DI常用于存儲(chǔ)器變址尋址方式時(shí)提供地址SI是源變址寄存器(SourceIndex)DI是目的變址寄存器(DestinationIndex)串操作指令:MOVSdest,scr目的操作數(shù)源操作數(shù)MOVAX,BX操作碼操作數(shù)指令的一般格式DS:SIES:DI(3)指針寄存器指針寄存器用于尋址內(nèi)存堆棧內(nèi)的數(shù)據(jù)SP為堆棧指針寄存器(StackPointer),指示堆棧段棧頂?shù)奈恢茫ㄆ频刂罚〣P為基址指針寄存器(BasePointer),表示數(shù)據(jù)在堆棧段中的基地址SP和BP寄存器與SS段寄存器聯(lián)合使用以確定堆棧段中的存儲(chǔ)單元地址SS:SPSS:BP關(guān)于堆棧(Stack)10500H10502H10504H10506H10508H1050AH堆棧段存取原則:LIFO(后進(jìn)先出)雙字節(jié)(字)操作高位字節(jié)對(duì)應(yīng)高地址,低位字節(jié)對(duì)應(yīng)低地址堆棧向低地址方向生成

入棧SP-2,出棧SP+2堆棧總滿

SP所指示的棧頂已有數(shù)據(jù)用SS和SP(BP)尋址棧生成方向

堆棧?像裝糖豆兒的小盒特點(diǎn):先進(jìn)后出,后進(jìn)先出2.段寄存器8086有4個(gè)16位段寄存器,可同時(shí)使用4種邏輯段CS(代碼段寄存器)指明當(dāng)前代碼段的起始地址CPU利用CS:IP取得將要執(zhí)行的指令。SS(堆棧段寄存器)指明當(dāng)前堆棧段的起始地址PUSH和POP指令,利用SS:SP尋址棧頂單元數(shù)據(jù)。DS(數(shù)據(jù)段寄存器)指明當(dāng)前數(shù)據(jù)段的起始地址CPU利用DS:EA讀寫內(nèi)存數(shù)據(jù)段數(shù)據(jù)ES(附加段寄存器)指明當(dāng)前附加段的起始地址CPU利用ES:EA讀寫內(nèi)存附加段數(shù)據(jù)每個(gè)段寄存器用來確定一個(gè)邏輯段的起始地址,每種邏輯段均有各自的用途3.指令指針寄存器IPIP(InstructionPointer)為指令指針寄存器,存放即將執(zhí)行指令的偏移地址(有效地址EA)。IP寄存器與CS段寄存器聯(lián)合使用以確定下一條指令的存儲(chǔ)單元地址(CS:IP)

IP寄存器是一個(gè)專用寄存器,在程序執(zhí)行過程中,自動(dòng)修改。注意:不能用指令直接讀取或設(shè)定IP的值,但是可以通過某些指令的執(zhí)行而自動(dòng)修改IP值。(例如轉(zhuǎn)移控制類指令)4.標(biāo)志寄存器(FLAGS/PSW)(1)狀態(tài)標(biāo)志(記錄程序中運(yùn)行結(jié)果的狀態(tài)信息)OF

溢出標(biāo)志SF

符號(hào)標(biāo)志ZF

零標(biāo)志CF

進(jìn)位標(biāo)志AF

輔助進(jìn)位標(biāo)志PF

奇偶標(biāo)志(2)控制標(biāo)志用于控制處理器執(zhí)行指令的方式DF

方向標(biāo)志IF

中斷標(biāo)志TF

陷阱標(biāo)志OF111512DF10IF9TF8SF7ZF65AF43PF21CF0符號(hào)標(biāo)志SF(SignFlag)運(yùn)算結(jié)果最高位為1,則SF=1;否則SF=0

有符號(hào)數(shù)據(jù)用最高有效位表示數(shù)據(jù)的符號(hào)所以,最高有效位就是符號(hào)標(biāo)志的狀態(tài)CF:進(jìn)位/借位標(biāo)志位當(dāng)運(yùn)算結(jié)果的最高有效位有進(jìn)位(加法)或借位(減法)時(shí),進(jìn)位標(biāo)志置1,即CF=1;否則CF=0ZF:零標(biāo)志位若運(yùn)算結(jié)果為0,則ZF=1;否則ZF=0奇偶標(biāo)志PF(ParityFlag)當(dāng)運(yùn)算結(jié)果最低字節(jié)中“1”的個(gè)數(shù)為零或偶數(shù)時(shí),PF=1;否則PF=0

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

偶或奇,即使是進(jìn)行16位字操作溢出標(biāo)志OF(OverflowFlag)若有符號(hào)數(shù)運(yùn)算的結(jié)果有溢出,則OF=1;否則OF=0所謂溢出,就是當(dāng)對(duì)有符號(hào)數(shù)進(jìn)行運(yùn)算時(shí),字節(jié)運(yùn)算的結(jié)果超出-128~+127的范圍,或字運(yùn)算的結(jié)果超出-32768~+32767的范圍時(shí),稱為溢出。因?yàn)檫@時(shí)運(yùn)算結(jié)果已超出目標(biāo)單元所能表示的數(shù)值范圍,從而會(huì)丟失有效數(shù)字,出現(xiàn)錯(cuò)誤結(jié)果。方向標(biāo)志DF(DirectionFlag)用于串操作指令中,控制地址的變化方向:設(shè)置DF=0,存儲(chǔ)器地址自動(dòng)增加;設(shè)置DF=1,存儲(chǔ)器地址自動(dòng)減少CLD指令復(fù)位方向標(biāo)志:DF=0STD指令置位方向標(biāo)志:DF=1中斷允許標(biāo)志IF(Interrupt-enableFlag)控制可屏蔽中斷是否可以被處理器響應(yīng):設(shè)置IF=1,則允許中斷;設(shè)置IF=0,則禁止中斷CLI指令復(fù)位中斷標(biāo)志:IF=0STI指令置位中斷標(biāo)志:IF=1陷阱標(biāo)志TF(TrapFlag)用于控制處理器進(jìn)入單步操作方式:設(shè)置TF=0,處理器正常工作;設(shè)置TF=1,處理器單步執(zhí)行指令單步執(zhí)行指令——處理器在每條指令執(zhí)行結(jié)束時(shí),便產(chǎn)生一個(gè)編號(hào)為1的內(nèi)部中斷這種內(nèi)部中斷稱為單步中斷所以TF也稱為單步標(biāo)志利用單步中斷可對(duì)程序進(jìn)行逐條指令的調(diào)試這種逐條指令調(diào)試程序的方法就是單步調(diào)試溢出的判斷當(dāng)兩個(gè)相同符號(hào)數(shù)相加(包括不同符號(hào)數(shù)相減),而運(yùn)算結(jié)果的符號(hào)與原數(shù)據(jù)符號(hào)相反時(shí),產(chǎn)生溢出;其他情況下,則不會(huì)產(chǎn)生溢出.最高兩位轉(zhuǎn)換為使10進(jìn)制數(shù),看運(yùn)算結(jié)果是否超出取值范圍例1:3AH+7CH=B6H 溢出例2:AAH+7CH 無溢出例3:3AH-7CH 無溢出例4:AAH-7CH=2DH 溢出關(guān)于CF與OF?那是不一樣滴,hoho……

10000100111010010111010010001101110010CF=1,OF=1CF=0,OF=1CF=1,OF=0

010000110111CF=0,OF=0思考題:以下的幾個(gè)4位十六進(jìn)制數(shù)相加,會(huì)使得8086狀態(tài)寄存器的以下幾位為什么值?CFPFAFZFSFOF8000H8000H+0000HC000HC000H+8000H4008H4008H+8010H0808HC000H+C808H110101110010001011000010總結(jié)段基址:偏移地址,基本搭配?舉例如下,具體取決于指令中的尋址方式段寄存器和相應(yīng)存放偏移地址的寄存器之間的默認(rèn)組合

段偏移CSIPSSSP或BPDSAX、BX、CX、DX、DI、SIESDI(用于串指令)如何判斷運(yùn)算結(jié)果是否溢出?標(biāo)志寄存器中進(jìn)位標(biāo)志與溢出標(biāo)志的區(qū)別?CFPFAFZFSFOF8000H8000H+0000HC000HC000H+8000H4008H4008H+8010H0808HC000H+C808H2.3匯編語言程序的開發(fā)過程編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如ML.EXE目標(biāo)模塊:文件名.obj連接連接程序,如LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如DEBUG.EXE應(yīng)用程序錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤編輯源程序

EDIT

HELLO.ASM匯編源程序MASM

HELLO.ASM形成目標(biāo)程序

HELLO.OBJ連接目標(biāo)程序

LINK

HELLO.OBJ有連接錯(cuò)誤信息?形成可執(zhí)行程序

HELLO.EXE裝入可執(zhí)行程序到內(nèi)存,并執(zhí)行HELLO下一程序用DEBUG調(diào)試可執(zhí)行程序DEBUG

HELLO.EXE找到原因YNYNNYN有匯編錯(cuò)誤信息?Y運(yùn)行結(jié)果正確?用DEBUG調(diào)試程序查錯(cuò)?D:\MASM>EDIThello.asm↙D:\MASM>MASMhello;↙

有語法錯(cuò),回EDIT下修改該程序D:\MASM>LINKhello;↙

有錯(cuò),回EDIT下修改程序D:\MASM>hello↙

運(yùn)行結(jié)果錯(cuò),回EDIT下修改程序或在DEBUG下調(diào)試,找原因。D:\MASM>DEBUGhello.exe↙任何一個(gè)文本編輯器可以實(shí)現(xiàn)源程序文件的編輯:DOS中的全屏幕文本編輯器EDIT其他程序開發(fā)工具中的編輯環(huán)境(記事本或?qū)懽职澹┰闯绦蛭募訟SM為擴(kuò)展名EDIThello.asm↙過程1:源程序的編輯匯編是將源程序翻譯成由機(jī)器代碼組成的目標(biāo)模塊文件的過程

MASMhello.asm↙

或MASMhello↙;后綴可以省略如果源程序中沒有語法錯(cuò)誤,MASM將自動(dòng)生成一個(gè)目標(biāo)模塊文件(*.obj);否則MASM將給出相應(yīng)的錯(cuò)誤信息,這時(shí)應(yīng)根據(jù)錯(cuò)誤信息,重新編輯修改源程序后,再進(jìn)行匯編。過程2:源程序的匯編連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫(kù)文件合成一個(gè)可執(zhí)行程序(.EXE、.COM文件):LINKhello.obj↙

LINKhello↙;后綴可以省略如果沒有嚴(yán)重錯(cuò)誤,LINK將生成一個(gè)可執(zhí)行文件(*.exe);否則將提示相應(yīng)的錯(cuò)誤信息,這時(shí)需要根據(jù)錯(cuò)誤信息重新修改源程序后再匯編、鏈接,直到生成可執(zhí)行文件過程3:目標(biāo)模塊的連接經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運(yùn)行:hello↙操作系統(tǒng)裝載該文件進(jìn)入主存,并開始運(yùn)行如果出現(xiàn)運(yùn)行錯(cuò)誤,可以從源程序開始排錯(cuò),也可以利用調(diào)試程序幫助發(fā)現(xiàn)錯(cuò)誤采用DEBUG.EXE調(diào)試程序:

DEBUGhello.exe

↙過程4:可執(zhí)行程序的運(yùn)行調(diào)試DSEG

SEGMENT

;數(shù)據(jù)段開始

STRING DB0DH,0AH,'Hello,Assembly!',0DH,0AH,'$'DSEG

ENDS

;數(shù)據(jù)段結(jié)束CSEG

SEGMENT

;代碼段開始

ASSUMECS:CSEG,DS:DSEG

;設(shè)定段寄存器與邏輯段的關(guān)系START:MOVAX,DSEG MOVDS,AX;設(shè)置數(shù)據(jù)段段地址

MOVDX,OFFSETSTRING

;為DOS調(diào)用設(shè)置入口參數(shù)

MOVAH,9

;為DOS功能調(diào)用設(shè)置功能號(hào)

INT21H

;DOS功能調(diào)用,顯示字符串

MOVAX,4C00H;為DOS功能調(diào)用設(shè)置功能號(hào)和入口參數(shù)

INT21H;DOS功能調(diào)用,返回DOS操作系統(tǒng)CSEG

ENDS

;代碼段結(jié)束

ENDSTART

;匯編結(jié)束[例2-1]源程序:hello.asm,在屏幕上顯示字符串“Hello,Assembly!”。匯編連接運(yùn)行文件路徑目錄(Directory):管理磁盤上文件的文件夾路徑(Path):分區(qū):\根目錄\子目錄\文件名絕對(duì)路徑:文件的完整路徑d:\masm\hello.asm相對(duì)路徑:相對(duì)當(dāng)前目錄的路徑轉(zhuǎn)換分區(qū)d:↙進(jìn)入當(dāng)前目錄(CurrentDirectory)cd\masm↙調(diào)試程序DEBUGDEBUG.exe

是DOS提供的一個(gè)調(diào)試匯編語言程序的程序。每個(gè)版本的DOS都帶有該程序,在windows\system32文件夾下。

DEBUG程序采用的是命令行方式使用不方便,但實(shí)用性強(qiáng)。是學(xué)習(xí)匯編語言程序、計(jì)算機(jī)硬件等課程的有效工具。DEBUG程序的具體作用

查看/修改寄存器,內(nèi)存單元的內(nèi)容;

學(xué)習(xí)尋址方式和指令系統(tǒng);

了解計(jì)算機(jī)取指令,執(zhí)行指令的工作過程;

調(diào)試有問題的匯編語言程序。DEBUG主要命令DEBUG下符號(hào)與標(biāo)志的對(duì)應(yīng)關(guān)系D:\MASM>DEBUG

;進(jìn)入DEBUG-R

;查看當(dāng)前各寄存器的內(nèi)容AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1271ES=1271SS=1271CS=1271IP=0100NVUPEIPL

NZ

NAPONC1271:0100B83412MOVAX,1234-D0:0

;查看0:0~7FH內(nèi)存塊的內(nèi)容0000:00009E0FC90065047000-1600EB0765047000e.pe.p.0000:00106504700054FF00F0-587F00F0F5E700F0e.p.T...X…、、、、、、-UFFFF:0

;反匯編FFFF:0處的指令FFFF:0000CD19INT19FFFF:0002E000LOOPNZ0004、、、、、、課后可參照下列步驟做實(shí)驗(yàn):-A

;匯編一條指令

1271:0100MOVAX,12341271:0103-T=100

;執(zhí)行該指令

AX=1234BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1271ES=1271SS=1271CS=1271IP=0103NVUPEIPLNZNAPONC1271:0103E9C300JMP01C9-R

;查看指令執(zhí)行后結(jié)果

AX=1234BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1271ES=1271SS=1271CS=1271IP=0103NVUPEIPLNZNAPONC-Q

;退出DEBUGD:\MASM>高級(jí)語言程序、匯編語言程序與機(jī)器語言程序的關(guān)系源程序***.ASM目標(biāo)程序***.OBJMASM進(jìn)行匯編可執(zhí)行程序可執(zhí)行程序***.EXEGO!LINK連接2.4匯編語言源程序組織2.4.1

匯編語言的語句格式2.4.2

匯編語言源程序格式2.4.1匯編語言的語句匯編語言源程序由語句序列構(gòu)成.每條語句一般占一行。語句有兩種:指令語句(表達(dá)硬指令的執(zhí)行性語句)偽指令語句(表達(dá)偽指令的說明性語句)匯編語言的語句格式⑴指令語句——匯編后翻譯為機(jī)器指令,產(chǎn)生目標(biāo)代碼;

執(zhí)行性語句,用于表達(dá)處理器指令(也稱為硬指令)。指令與具體的處理器有關(guān)、與匯編程序無關(guān)

⑵偽指令語句——沒有對(duì)應(yīng)的機(jī)器指令,不產(chǎn)生目標(biāo)代碼;說明性語句,用于指示匯編程序?qū)υ闯绦蛉绾螀R編、定義常量、變量、邏輯段,設(shè)置過程等

偽指令與具體的處理器類型無關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令

標(biāo)號(hào):

指令助記符操作數(shù),操作數(shù)

;注釋符號(hào)名

偽指令助記符

參數(shù),參數(shù),……

;注釋NEXT:MOVYY,AL;YY←(AL)PORTEQU33H;令PORT=33H指令與偽指令指令(Instruction)——與機(jī)器指令一一對(duì)應(yīng),在程序執(zhí)行時(shí)才處理的指令,表明CPU所執(zhí)行的具體操作

指令與具體的處理器有關(guān)、與匯編程序無關(guān)

MOVADDJMP偽指令(Directive)——沒有與其對(duì)應(yīng)的機(jī)器指令,在程序執(zhí)行前指示匯編程序所作處理的說明性指令

偽指令與具體的處理器類型無關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令

EQU

DBPTR

指令和偽指令采用助記符表達(dá)操作數(shù)和參數(shù)指令的操作數(shù)可以是常數(shù)操作數(shù)、寄存器操作數(shù)和存儲(chǔ)器操作數(shù)指令語句中,操作數(shù)可以是1個(gè)、2個(gè)或沒有,用,隔開偽指令的參數(shù)可以是常數(shù)、變量名、表達(dá)式等,可以有多個(gè),參數(shù)之間用逗號(hào)分隔不需要操作數(shù)隱含操作數(shù)雙操作數(shù)指令/二地址指令OPdest,src單操作數(shù)指令/一地址指令

OPdest無操作數(shù)指令/零地址指令

OP標(biāo)號(hào)表示一條指令的符號(hào)地址(后一定有“:”)一般用于主程序或程序模塊的開始

JMP/CALL標(biāo)號(hào)符號(hào)名可以是常量名、變量名、段名、過程名表示一條偽指令的符號(hào)地址(后沒有“:”)符號(hào)化的偏移地址

PORTEQU33H;令PORT=33H

注:第1個(gè)字符不能是數(shù)字字符串長(zhǎng)度不能超過31個(gè)不能是系統(tǒng)保留字,如:指令名、寄存器名、偽指令名等在匯編語言中,下列符號(hào)可以做標(biāo)識(shí)符(標(biāo)號(hào)或符號(hào)名)字母:A~Z,a~z

數(shù)字:0~9

特殊字符:?,@,$,_,!,%MOV、ADDAX、CSDB、DW

匯編語言不區(qū)別大小寫注釋語句中由分號(hào)“;”開始的部分為注釋內(nèi)容,用以增加源程序的可讀性,說明語句或程序的功能匯編程序在翻譯源程序時(shí)將忽略注釋部分,不對(duì)它們做任何處理分隔符語句的4個(gè)組成部分要用分隔符分開標(biāo)號(hào)后用冒號(hào),注釋前用分號(hào)操作數(shù)之間和參數(shù)之間使用逗號(hào)分隔其他部分通常采用空格或制表符多個(gè)空格和制表符的作用與一個(gè)相同MASM支持續(xù)行符“\”標(biāo)號(hào):

指令助記符操作數(shù),操作數(shù)

;注釋符號(hào)名

偽指令助記符

參數(shù),參數(shù),……

;注釋2.4.2匯編語言源程序格式完整的匯編語言源程序由邏輯段組成包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段,并指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只有一個(gè)起始點(diǎn)所有的可執(zhí)行性語句必須位于某一個(gè)代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi)完整匯編語言源程序格式(1)處理器選擇偽指令(2)邏輯段定義偽指令(3)段使用設(shè)定偽指令(4)程序開始(5)程序終止(6)匯編結(jié)束完整匯編語言程序框架一.8086 ;(1)處理器選擇偽指令data1SEGMENT ;(2)數(shù)據(jù)段定義,(可據(jù)需要設(shè)定,也可無)…… ;常量、變量定義data1ENDSdata2SEGMENT ;附加段定義(可據(jù)需要設(shè)定,也可無)……data2ENDScodeSEGMENT;代碼段定義

ASSUMECS:code,DS:data1,ES:data2;(3)設(shè)定段寄存器與邏輯段關(guān)系start:MOVAX,data1 ;(4)起始點(diǎn),MOVDS,AX ;設(shè)置段寄存器、、、 ;程序主體部分、、、

MOVAX,4C00H ;(5)結(jié)束點(diǎn),返回DOS

INT21HcodeENDS

ENDstart ;(6)匯編結(jié)束(1)處理器選擇偽指令.386.386P.486.486P.586.586P.686.686P.386表示程序選用80386的基本指令集,

.386P表示選用80386的基本指令和保護(hù)模式下的特權(quán)指令。缺省的處理器選擇偽指令是.8086(2)邏輯段定義偽指令段名SEGMENT 定位

組合

使用

'類別' ... ;語句序列段名ENDS邏輯段的名稱,用戶確定,具有段屬性和偏移屬性段定義指令后的4個(gè)關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類型,代碼段應(yīng)具有‘code’類別,其他為可選屬性參數(shù)如果不指定,則采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序各個(gè)邏輯段用“段定義偽指令”SEGMENT和ENDS一對(duì)偽指令定義,必須成對(duì)出現(xiàn)需要配合ASSUME偽指令指明邏輯段是代碼段、堆棧段、數(shù)據(jù)段還是附加段段名由用戶定必須成對(duì)出現(xiàn)且必須一致段定位(align)屬性指定邏輯段在主存儲(chǔ)器中的起始邊界,告訴連接程序邏輯段的起始位置;可為:

BYTE:字節(jié)地址開始,任何地址開始(xxxxxxxxb)

WORD:字邊界開始,偶數(shù)地址(xxxxxxx0b)

DWORD:雙字邊界開始,4倍數(shù)地址(xxxxxx00b)

PARA:小段邊界開始,16倍數(shù)地址(xxxx0000b)

PAGE:頁(yè)邊界開始,256倍數(shù)地址(00000000b)默認(rèn)定位屬性是PARA段組合(combine)屬性告訴連接程序各個(gè)邏輯段如何連接,指定多個(gè)邏輯段之間的關(guān)系,可為:PRIVATE 本段不與其他模塊中同名段合并,每段都有自己的段地址。這是完整段定義偽指令默認(rèn)的段組合方式。PUBLIC 本段與所有同名同類型的其他段相鄰地連接在一起,合成一個(gè)大的物理段,指定一個(gè)共同的段地址。原段間存在小于16B的間隙。COMMON

同名段重疊在一起,形成一個(gè)段,內(nèi)容為排在最后的段的內(nèi)容。STACK 將所有STACK段按照與PUBLIC段的同樣方式進(jìn)行無縫合并。這是堆棧段必須具有的段組合使用類型(use)屬性為支持32位段而設(shè)置的屬性USE16:使用16位尋址方式,段長(zhǎng)不超過64K。USE32:使用32位的尋址方式,段長(zhǎng)可達(dá)4GB。默認(rèn)類型為USE16段類別(class)屬性段類別可以是任意名稱,但必須位于單引號(hào)中當(dāng)連接程序組織段時(shí),將類別名相同的段存入到存儲(chǔ)器中的連續(xù)區(qū)域大多數(shù)MASM程序使用'code'、'data'和'stack’來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)(3)段使用設(shè)定偽指令A(yù)SSUME段寄存器:段名[,段寄存器名:段名,...]ASSUME偽指令一般放在代碼段的開始通知MASM用指定的段寄存器來尋址對(duì)應(yīng)的邏輯段,即建立段寄存器與段的對(duì)應(yīng)關(guān)系A(chǔ)SSUME是偽指令,只是通知匯編程序:段寄存器和邏輯段的對(duì)應(yīng)關(guān)系,并沒有將邏輯段的段基址存入段寄存器在初始化程序中,要對(duì)段寄存器賦初值,將段基址存入段寄存器ASSUMECS:code,DS:data1,ES:data2;(4)程序開始為了指明程序開始執(zhí)行的位置,需要使用一個(gè)標(biāo)號(hào)(如:采用start標(biāo)識(shí)符)連接程序會(huì)根據(jù)程序起始點(diǎn)正確地設(shè)置CS和IP值,根據(jù)程序大小和堆棧段大小設(shè)置SS和SP值連接程序沒有設(shè)置DS和ES值。程序如果使用數(shù)據(jù)段或附加段,必須明確給DS或ES賦值大多數(shù)程序需要數(shù)據(jù)段,程序的執(zhí)行開始應(yīng)是:start: MOVAX,data1

;data1表示數(shù)據(jù)段的段地址

MOVDS,AX

;設(shè)置DS(5)程序終止應(yīng)用程序執(zhí)行結(jié)束,應(yīng)該將控制權(quán)交還操作系統(tǒng)匯編語言程序設(shè)計(jì)中,有多種返回DOS的方法,但一般利用DOS功能調(diào)用的4CH子功能實(shí)現(xiàn),它需要的入口參數(shù)是AL=返回?cái)?shù)碼(通常用0表示程序沒有錯(cuò)誤)應(yīng)用程序執(zhí)行結(jié)束,返回DOS的代碼就是:

MOVAX,4C00H INT21H(6)匯編結(jié)束匯編結(jié)束表示:匯編程序?qū)⒃闯绦蚍g成目標(biāo)模塊代碼的過程到此結(jié)束源程序的最后必須有一條END偽指令

END[標(biāo)號(hào)]“標(biāo)號(hào)”參數(shù):程序開始執(zhí)行點(diǎn)(如:start標(biāo)識(shí)符),結(jié)束將源程序翻譯成目標(biāo)模塊代碼的匯編過程;連接程序?qū)?biāo)號(hào)所指單元的段基址和偏移量自動(dòng)裝入CS和IP中

————不要糊涂————程序終止和匯編結(jié)束是兩碼事匯編語言的源程序采用分段結(jié)構(gòu),框架:DATA

SEGMENT

┊DATA

ENDSCODE

SEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVAX,4C00H INT21HCODE

ENDS

ENDSTART總結(jié)源程序:hello.asmDSEG

SEGMENT

;數(shù)據(jù)段開始

STRINGDB0DH,0AH,'Hello,Assembly!',0DH,0AH,'$'DSEG

ENDS

;數(shù)據(jù)段結(jié)束CSEG

SEGMENT

;代碼段開始

ASSUMECS:CSEG,DS:DSEG

;設(shè)定段寄存器與邏輯段的關(guān)系START:MOVAX,DSEG MOVDS,AX;設(shè)置數(shù)據(jù)段段地址

MOVDX,OFFSETSTRING

;為DOS調(diào)用設(shè)置入口參數(shù)

MOVAH,9

;為DOS功能調(diào)用設(shè)置功能號(hào)

INT21H

;DOS功能調(diào)用,顯示字符串

MOVAX,4C00H;為DOS功能調(diào)用設(shè)置功能號(hào)和入口參數(shù)

INT21H;DOS功能調(diào)用,返回DOS操作系統(tǒng)CSEG

ENDS

;代碼段結(jié)束

ENDSTART

;匯編結(jié)束[例2-1]在屏幕上顯示字符串“Hello,Assembly!”。2.5匯編語言中的操作數(shù)常量:作為硬指令的立即數(shù)或偽指令的參數(shù)變量:主要作為存儲(chǔ)器操作數(shù)2.5.1常量常量表示一個(gè)固定的數(shù)值,它又分成多種形式常數(shù)字符串符號(hào)常量數(shù)值表達(dá)式(1)常數(shù)指由10、16、2和8進(jìn)制形式表達(dá)的數(shù)值,各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)十進(jìn)制由0~9數(shù)字組成,以字母D(d)結(jié)尾(缺省情況可以省略)100,255D十六進(jìn)制由0~9、A~F數(shù)字組成,以字母H(h)結(jié)尾。為避免與標(biāo)識(shí)符混淆,以字母開頭的常數(shù)需要加一個(gè)前導(dǎo)064H,0FFH,0B800H二進(jìn)制由0和1兩個(gè)數(shù)字組成,以字母B(b)結(jié)尾01100100B(2)字符串字符串常量是用單引號(hào)或雙引號(hào)括起來的單個(gè)字符或多個(gè)字符其數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼值例如:

‘d’(等于64H)

‘AB’(等于4142H)

‘Hello,Assembly!’(3)符號(hào)常量經(jīng)常使用的常數(shù),可通過給一個(gè)符號(hào)名賦值來表示符號(hào)常量定義偽指令有“EQU”和“=”兩種: 符號(hào)名EQU

數(shù)值表達(dá)式 符號(hào)名=數(shù)值表達(dá)式例:DATEQU99;等值語句

NUM=100;等號(hào)語句EQU用于數(shù)值等價(jià)時(shí)不能重復(fù)定義符號(hào)名,“=”允許有重復(fù)賦值。例如:

X=7; X=X+5 ;“XEQUX+5”是錯(cuò)誤的匯編時(shí),對(duì)EQU定義的符號(hào)名用對(duì)應(yīng)的表達(dá)式進(jìn)行“替換”。例如:NUM EQU 215MOD15ERR_MSG EQU “DataOverride”MESSAGE DB ERR_MSG

;等價(jià)于MESSAGEDB“DataOverride”MOV CX,NUM+1

;等價(jià)于MOV CX,215MOD15+1(4)數(shù)值表達(dá)式數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常量所構(gòu)成的表達(dá)式匯編程序在匯編過程中計(jì)算表達(dá)式,最終得到一個(gè)確定的數(shù)值,所以也是常量表達(dá)式的數(shù)值在程序運(yùn)行前的匯編階段計(jì)算,所以組成表達(dá)式的各部分必須在匯編時(shí)就能確定匯編語言支持多種運(yùn)算符例如:movax,3*4+5 ;等價(jià)于:movax,17構(gòu)成數(shù)值表達(dá)式可使用以下幾類運(yùn)算符:算術(shù)運(yùn)算符(+,-,*,/,mod)邏輯運(yùn)算符

(shl,shr,and,or,xor,not)關(guān)系運(yùn)算符

(gt,ge,eq,le,lt,ne)地址運(yùn)算符

(seg,offset)類型運(yùn)算符

(type,length,size)【例2?5】數(shù)值表達(dá)式及其應(yīng)用;匯編語言指令

MOVDH,01100100BSHR2MOVBL,8CHAND73HMOVAH,8CHOR73HMOVAX,10HGT16 MOVBL,6EQ0110B

MOVBX,32+((13/6)MOD3) ;匯編后形成的指令;MOVDH,19H;MOVBL,0;MOVAH,0FFH;MOVAX,0;MOVBL,0FFH

;MOVBX,0022HMOVAX,BX+2需要把BX的值與常數(shù)2相加并存入AX的操作只能在程序執(zhí)行階段由以下兩條指令完成:MOV AX,BX;BX寄存器值存入AX寄存器ADD AX,2 ;AX寄存器的值加2,結(jié)果存AX√×不良用法2.5.2變量變量實(shí)質(zhì)上是指內(nèi)存單元的數(shù)據(jù),雖然內(nèi)存單元地址不變,但其中存放的數(shù)據(jù)可以改變變量需要事先定義才能使用變量定義偽指令為變量申請(qǐng)以固定長(zhǎng)度為單位的存儲(chǔ)空間,并可以同時(shí)將相應(yīng)的存儲(chǔ)單元初始化定義后的變量可以利用變量名等方法引用其中的數(shù)據(jù),即變量的數(shù)值1.變量的定義變量定義的匯編語言格式為:

變量名偽指令初值表變量名為用戶自定義標(biāo)識(shí)符,表示初值表首元素的邏輯地址,常稱為符號(hào)地址。初值表是用逗號(hào)分隔的參數(shù),主要由常量或“?”組成。其中“?”表示未賦初值多個(gè)存儲(chǔ)單元如果初值相同,可以用復(fù)制操作符(重復(fù)定義符)DUP進(jìn)行定義:

重復(fù)次數(shù)DUP(重復(fù)參數(shù))變量定義偽指令DB(DefineByte):每個(gè)數(shù)據(jù)占用一個(gè)字節(jié)(8b)

DW(DefineWord):每個(gè)數(shù)據(jù)占用一個(gè)字(16b)

DD(DefineDoubleWord):每個(gè)數(shù)據(jù)占用一個(gè)雙字(32b)DQ(DefineQuartWord):每個(gè)數(shù)據(jù)占用8個(gè)字節(jié)(64b)DT(DefineTenByte):每個(gè)數(shù)據(jù)占用10個(gè)字節(jié)(80b)【例2?3】變量定義舉例DSEG SEGMENT BVARDB1,-2,'AB',3DUP('a'),? ;字節(jié)變量,8項(xiàng)

WVARDW1,-2,'AB',3DUP('a'),? ;字變量,7項(xiàng)

DVARDD1,-2,'AB',3DUP('a'),? ;雙字變量,7項(xiàng)

VAR1DWWVAR,DVAR,DVAR-WVAR,VAR1-DVAR ;字變量,4項(xiàng)

VAR2DDWVAR,DVAR,DVAR-WVAR,VAR1-DVAR ;雙字變量,4項(xiàng)

VAR3DBDVAR-WVAR,VAR1-DVAR ;字節(jié)變量,2項(xiàng)DSEG ENDS

有符號(hào)數(shù)用它的補(bǔ)碼存儲(chǔ)字符用ASCII代碼存儲(chǔ)DB定義的數(shù)據(jù)在[-128~255]之內(nèi)變量名代表首個(gè)單元的地址DW定義的數(shù)據(jù)在[-32768,65535]內(nèi)出現(xiàn)在參數(shù)部分的變量名用這個(gè)變量的偏移地址代替多字節(jié)數(shù)據(jù)的存放:

“高高低低”(小端方式)存儲(chǔ)區(qū)域分配(1,-2,'AB',3DUP('a'),?)2.變量和標(biāo)號(hào)的屬性變量和標(biāo)號(hào)都表示存儲(chǔ)單元。變量表示的存儲(chǔ)單元中存放數(shù)值標(biāo)號(hào)表示的存儲(chǔ)單元中存放指令代碼。變量和標(biāo)號(hào)具有如下三種屬性:①段屬性(SEG):變量或標(biāo)號(hào)對(duì)應(yīng)存儲(chǔ)單元所在段的段地址。②偏移地址屬性(OFFSET):變量或標(biāo)號(hào)對(duì)應(yīng)的首個(gè)存儲(chǔ)單元的段內(nèi)偏移地址。③類型屬性(TYPE):變量的類型屬性指的是變量占用存儲(chǔ)單元的字節(jié)數(shù)。屬性值由變量定義偽指令來決定。主要的變量和標(biāo)號(hào)類型屬性及返回值變量

/標(biāo)號(hào)

/常數(shù)

DBDWDDDFDQDTNEARFAR常數(shù)

1246810-1-203.析值運(yùn)算符析值運(yùn)算符也稱為數(shù)值回送運(yùn)算符,把一些特征或存儲(chǔ)器地址的一部分作為數(shù)值回送。常用析值運(yùn)算符SEG

名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的段地址OFFSET

名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的偏移地址TYPE

名字/標(biāo)號(hào)返回變量或標(biāo)號(hào)的類型,類型用數(shù)值表示LENGTH

變量名返回利用DUP定義的變量中元素的個(gè)數(shù),即重復(fù)操作符DUP前的重復(fù)次數(shù)值,其它情況回送1SIZE

變量名返回LENGTH×TYPE的值數(shù)值回送操作符:

OFFSET、SEG、TYPE、LENGTH、SIZESIZE變量功能:LENGTH*TYPEOFFSET/SEG

變量/標(biāo)號(hào)功能:回送變量或標(biāo)號(hào)的偏址/段地址TYPE

變量

/標(biāo)號(hào)

/常數(shù)

DBDWDDDFDQDTNEARFAR常數(shù)

1246810-1-20LENGTH變量功能:回送由DUP定義的變量的單元數(shù),其它情況回送1MOVAX,LIST MOVAX,OFFSETLIST設(shè)變量LIST定義在DATA段中,

DATASEGMENTLISTDW10,20,30DATAENDS下面三條指令都是把DATA段的段基址裝入AX:MOVAX,DATA;DATA代表該段的段基址,是一個(gè)立即數(shù)MOVAX,SEGDATA;取DATA的段基址,結(jié)果是立即數(shù)MOVAX,SEGLIST;取LIST的段基址,結(jié)果是立即數(shù)對(duì)比:;取出變量LIST第一個(gè)元素送入AX;取變量LIST的偏移地址送入AXADB “ABCDE” ;TYPE=1,LENGTH=1,SIZE=1BDW 3DUP(5),4DUP(-1);TYPE=2,LENGTH=3,SIZE=6CDD 34,49,18 ;TYPE=4,LENGTH=1,SIZE=4MOVAX,TYPEA ;AX=1MOVBX,LENGTHB ;BX=3MOVCX,SIZEC ;CX=44.屬性運(yùn)算符提高訪問變量、標(biāo)號(hào)和一般存儲(chǔ)器操作數(shù)的靈活性常用屬性運(yùn)算符類型PTR

變量名/標(biāo)號(hào)臨時(shí)指定或臨時(shí)改變變量和標(biāo)號(hào)的使用類型THIS

類型用于創(chuàng)建采用當(dāng)前地址但為指定類型的操作數(shù)SHORT

標(biāo)號(hào)將標(biāo)號(hào)作為短轉(zhuǎn)移處理段寄存器

:用來給一個(gè)存儲(chǔ)器操作數(shù)指定一個(gè)段屬性,

即段超越5.變量的應(yīng)用變量具有存儲(chǔ)單元的邏輯地址指令語句中通過變量名引用其指向的首個(gè)數(shù)據(jù)通過變量名加減位移量存取以首個(gè)數(shù)據(jù)為基地址的前后數(shù)據(jù)偽指令語句中主要是在另一個(gè)變量定義語句中作為參數(shù)部分出現(xiàn)。MOVAL,BVAR ;AL←1MOVBL,BVAR+3 ;BL←‘A’類型限定操作符PTR類型限定操作符對(duì)類型屬性進(jìn)行設(shè)置

類型名PTR名字/標(biāo)號(hào)類型名可以是BYTE、WORD、DWORD(依次表示字節(jié)、字、雙字)等,或者是NEAR、FAR(分別表示近、遠(yuǎn))等例: MOVAX,BVAR

MOVAX,WORDPTR

BVAR

×√【例2?3】變量應(yīng)用舉例;代碼段MOVCL,BVAR ;BVAR第1個(gè)數(shù)據(jù)送CL,(CL)=01HMOVCH,BVAR+2 ;BVAR第3個(gè)數(shù)據(jù)送CH,(CH)=41HMOVBX,WVAR ;WVAR第1個(gè)數(shù)據(jù)送BX,(BX)=0001HMOVSI,WVAR+2 ;WVAR第2個(gè)數(shù)據(jù)送SI,(SI)=0FFFEH(-2)MOVDX,WORDPTRDVAR ;DVAR第1個(gè)數(shù)據(jù)低字送DX,(DX)=0001HMOVAX,WORDPTRDVAR+2 ;DVAR第1個(gè)數(shù)據(jù)高字送AX,(AX)=0000HMOVDI,VAR1+4 ;VAR1第3個(gè)數(shù)據(jù)送WVAR第7個(gè)數(shù)據(jù)單元。MOVWVAR+12,DI6.變量的定位匯編程序按照指令的先后順序一個(gè)接著一個(gè)分配存儲(chǔ)空間,按照段定義偽指令規(guī)定的邊界定位屬性確定每個(gè)邏輯段的起始位置(包括偏移地址)定位偽指令ORG控制數(shù)據(jù)或代碼所在的偏移地址

ORG

參數(shù)ORG偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址。例如:

ORG100h

;從100H處安排數(shù)據(jù)或程序

ORG$+10

;偏移地址加10,即跳過10個(gè)字節(jié)空間匯編語言程序中,符號(hào)“$”表示當(dāng)前偏移地址值例:變量定位DATASEGMENT

ORG10HVAR1DB1,'A'ORG$+2VAR2DW1234H,$-VAR1DATAENDS2.68086/8088的尋址方式

尋找指令所需的操作數(shù)或操作數(shù)地址的方法2.6.1立即尋址

MOVAX,3069H2.6.2寄存器尋址

MOVAL,BH2.6.3直接尋址

MOVAX,[2000H]2.6.4寄存器間接尋址

MOVAX,[BX]2.6.5寄存器相對(duì)尋址

MOVAX,06H[SI]2.6.6基址變址尋址

MOVAX,[BP][DI]2.6.7相對(duì)基址變址尋址

MOVAX,06H[BX][SI]操作數(shù)位于存儲(chǔ)器考核要點(diǎn)尋址方式能夠識(shí)別指令中操作數(shù)采用的尋址方式能夠根據(jù)尋址方式確定操作數(shù)的來源能夠在指令中正確地使用各種尋址方式2.6.1立即尋址特點(diǎn):操作數(shù)以常量形式出現(xiàn)在指令中(立即尋址、立即數(shù))操作碼之后,存放在代碼段中立即數(shù)可以是16位或8位例:MOVAX,1234H12H34HAHALOP代碼段┇

AX低地址高地址1.指令在代碼段的存儲(chǔ)形式2.指令的運(yùn)行結(jié)果立即數(shù)尋址只能用于源操作數(shù)位置,不能用于目的操作數(shù)位置指令中立即數(shù)長(zhǎng)度應(yīng)與其他操作數(shù)保持一致MOVAH,-40

;MOVAX,-40

;MOVAX,‘A’;MOVBL,‘B’;MOVAX,34D8H

;MOVAL,1234H;

常用于給寄存器或存儲(chǔ)單元賦初值

(段寄存器、標(biāo)志寄存器除外)MOVAX,1234H;MOV5,AL

;

立即尋址只能用于源操作數(shù)√D8HAHFFD8HAX0041HAX42HBL34HAH,D8HAL2.6.2寄存器尋址特點(diǎn):操作數(shù)存放在CPU寄存器中,指令指定寄存器名尋址在CPU內(nèi)部進(jìn)行,指令執(zhí)行速度快例:MOVBX,AX

AX

BX

DX

CX例:MOVAH,BL;(BL)-->AHMOVDX,AX;(AX)-->DX操作數(shù)可以是8位,也可以是16位,但SRC和DST的字長(zhǎng)要一致。由這個(gè)段跨越前綴指明源操作數(shù)存放在附加段存儲(chǔ)器操作數(shù)2.6.3直接尋址特點(diǎn):操作數(shù)位于存儲(chǔ)器中在指令中直接給出操作數(shù)所在存儲(chǔ)單元的偏移地址將該存儲(chǔ)單元作為起始位置,取出數(shù)據(jù),8位或16位分兩種情況(1)系統(tǒng)默認(rèn)操作數(shù)存放在數(shù)據(jù)段(段基址存放在DS)例:MOVAX,[1200H][]內(nèi):是偏移地址!不是立即數(shù)(有效地址EA)(2)操作數(shù)存放在其他邏輯段應(yīng)在指令中指定段跨越前綴例:MOVAX,ES:[1200H]操作數(shù)的物理地址=(ES)×10H+1200H設(shè)(DS)=3000H,則該數(shù)據(jù)段起始地址為:30000H22H11H31200H操作數(shù)所在存儲(chǔ)單元的物理地址AHAL┇

11數(shù)據(jù)段30000

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論