ch02 匯編語言基礎C_第1頁
ch02 匯編語言基礎C_第2頁
ch02 匯編語言基礎C_第3頁
ch02 匯編語言基礎C_第4頁
ch02 匯編語言基礎C_第5頁
已閱讀5頁,還剩371頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第二章

匯編語言基礎

第二章匯編語言基礎2.1

匯編語言概述2.2

8086/8088微處理器編程結構

2.3

匯編語言上機調試2.4

匯編語言源程序組織2.5

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

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

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

兩大獨立部分:BIU(BusInterfaceUnit)

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

執行單元由4個主要部件構成?2.2.1

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

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

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

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

8條數據線(準16位機)20條地址線重要差別

8086/8088兩者內部結構基本相同

8086指令對列為6字節,若出現2字節空閑,則預取指令。

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

80x86系統采用“高高低低”原則存儲,稱為“小端方式LittleEndian”。相對應還存在“大端方式BigEndian”。存儲器地址

8086具有20位地址總線,可尋址220=1MB存儲空間,存儲器的每一個存儲單元(每一個字節)與一個20位地址相對應,稱為物理地址。

物理地址:信息在存儲器中實際有效的地址單元號,

CPU訪問內存是按物理地址尋址的。

例如:1234H以不同方式存儲時的情況。

2FFFH3000H3001H3002H3003H34H12H小端方式12H34H大端方式2FFFH3000H3001H3002H3003H12345678H34H12H低高雙字數據56H78H

數據存儲格式(00002H)=12H,或[00002H]=12H(00003H)=34H,或[00003H]=34H

字數據3412H

=(00002H)雙字數據78563412H

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

段地址:

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

每個段最大空間為64KB

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

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

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

物理地址:信息在存儲器中實際有效的地址單元號,

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

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

8086微處理器20位物理地址的產生過程

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

CPU執行程序時,需要將邏輯地址轉換為物理地址,稱為地址重定位

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

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

20位物理地址計算例題

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

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

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

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

=FFFFH×10H+0000H=FFFF0H

FFFF0H~FFFFFH,存儲BIOS,16字節,轉移指令書P57102.2.38086/8088的寄存器結構共14個16位寄存器

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

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

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

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

IP寄存器是一個專用寄存器,在程序執行過程中,自動修改。注意:不能用指令直接讀取或設定IP的值,但是可以通過某些指令的執行而自動修改IP值。(例如轉移控制類指令)4.標志寄存器(FLAGS/PSW)(1)狀態標志(記錄程序中運行結果的狀態信息)OF

溢出標志SF

符號標志ZF

零標志CF

進位標志AF

輔助進位標志PF

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

方向標志IF

中斷標志TF

陷阱標志OF111512DF10IF9TF8SF7ZF65AF43PF21CF0符號標志SF(SignFlag)運算結果最高位為1,則SF=1;否則SF=0

有符號數據用最高有效位表示數據的符號所以,最高有效位就是符號標志的狀態CF:進位/借位標志位當運算結果的最高有效位有進位(加法)或借位(減法)時,進位標志置1,即CF=1;否則CF=0ZF:零標志位若運算結果為0,則ZF=1;否則ZF=0奇偶標志PF(ParityFlag)當運算結果最低字節中“1”的個數為零或偶數時,PF=1;否則PF=0

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

偶或奇,即使是進行16位字操作溢出標志OF(OverflowFlag)若有符號數運算的結果有溢出,則OF=1;否則OF=0所謂溢出,就是當對有符號數進行運算時,字節運算的結果超出-128~+127的范圍,或字運算的結果超出-32768~+32767的范圍時,稱為溢出。因為這時運算結果已超出目標單元所能表示的數值范圍,從而會丟失有效數字,出現錯誤結果。方向標志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也稱為單步標志利用單步中斷可對程序進行逐條指令的調試這種逐條指令調試程序的方法就是單步調試溢出的判斷當兩個相同符號數相加(包括不同符號數相減),而運算結果的符號與原數據符號相反時,產生溢出;其他情況下,則不會產生溢出.最高兩位轉換為使10進制數,看運算結果是否超出取值范圍例1:3AH+7CH=B6H 溢出例2:AAH+7CH 無溢出例3:3AH-7CH 無溢出例4:AAH-7CH=2DH 溢出關于CF與OF?那是不一樣滴,hoho……

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

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

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

EDIT

HELLO.ASM匯編源程序MASM

HELLO.ASM形成目標程序

HELLO.OBJ連接目標程序

LINK

HELLO.OBJ有連接錯誤信息?形成可執行程序

HELLO.EXE裝入可執行程序到內存,并執行HELLO下一程序用DEBUG調試可執行程序DEBUG

HELLO.EXE找到原因YNYNNYN有匯編錯誤信息?Y運行結果正確?用DEBUG調試程序查錯?D:\MASM>EDIThello.asm↙D:\MASM>MASMhello;↙

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

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

運行結果錯,回EDIT下修改程序或在DEBUG下調試,找原因。D:\MASM>DEBUGhello.exe↙任何一個文本編輯器可以實現源程序文件的編輯:DOS中的全屏幕文本編輯器EDIT其他程序開發工具中的編輯環境(記事本或寫字板)源程序文件要以ASM為擴展名EDIThello.asm↙過程1:源程序的編輯匯編是將源程序翻譯成由機器代碼組成的目標模塊文件的過程

MASMhello.asm↙

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

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

DEBUGhello.exe

↙過程4:可執行程序的運行調試DSEG

SEGMENT

;數據段開始

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

ENDS

;數據段結束CSEG

SEGMENT

;代碼段開始

ASSUMECS:CSEG,DS:DSEG

;設定段寄存器與邏輯段的關系START:MOVAX,DSEG MOVDS,AX;設置數據段段地址

MOVDX,OFFSETSTRING

;為DOS調用設置入口參數

MOVAH,9

;為DOS功能調用設置功能號

INT21H

;DOS功能調用,顯示字符串

MOVAX,4C00H;為DOS功能調用設置功能號和入口參數

INT21H;DOS功能調用,返回DOS操作系統CSEG

ENDS

;代碼段結束

ENDSTART

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

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

DEBUG程序采用的是命令行方式使用不方便,但實用性強。是學習匯編語言程序、計算機硬件等課程的有效工具。DEBUG程序的具體作用

查看/修改寄存器,內存單元的內容;

學習尋址方式和指令系統;

了解計算機取指令,執行指令的工作過程;

調試有問題的匯編語言程序。DEBUG主要命令DEBUG下符號與標志的對應關系D:\MASM>DEBUG

;進入DEBUG-R

;查看當前各寄存器的內容AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1271ES=1271SS=1271CS=1271IP=0100NVUPEIPL

NZ

NAPONC1271:0100B83412MOVAX,1234-D0:0

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

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

;匯編一條指令

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

;執行該指令

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

;查看指令執行后結果

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

;退出DEBUGD:\MASM>高級語言程序、匯編語言程序與機器語言程序的關系源程序***.ASM目標程序***.OBJMASM進行匯編可執行程序可執行程序***.EXEGO!LINK連接2.4匯編語言源程序組織2.4.1

匯編語言的語句格式2.4.2

匯編語言源程序格式2.4.1匯編語言的語句匯編語言源程序由語句序列構成.每條語句一般占一行。語句有兩種:指令語句(表達硬指令的執行性語句)偽指令語句(表達偽指令的說明性語句)匯編語言的語句格式⑴指令語句——匯編后翻譯為機器指令,產生目標代碼;

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

⑵偽指令語句——沒有對應的機器指令,不產生目標代碼;說明性語句,用于指示匯編程序對源程序如何匯編、定義常量、變量、邏輯段,設置過程等

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

標號:

指令助記符操作數,操作數

;注釋符號名

偽指令助記符

參數,參數,……

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

指令與具體的處理器有關、與匯編程序無關

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

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

EQU

DBPTR

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

OPdest無操作數指令/零地址指令

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

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

PORTEQU33H;令PORT=33H

注:第1個字符不能是數字字符串長度不能超過31個不能是系統保留字,如:指令名、寄存器名、偽指令名等在匯編語言中,下列符號可以做標識符(標號或符號名)字母:A~Z,a~z

數字:0~9

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

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

指令助記符操作數,操作數

;注釋符號名

偽指令助記符

參數,參數,……

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

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

MOVAX,4C00H ;(5)結束點,返回DOS

INT21HcodeENDS

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

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

組合

使用

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

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

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

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

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

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

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

;data1表示數據段的段地址

MOVDS,AX

;設置DS(5)程序終止應用程序執行結束,應該將控制權交還操作系統匯編語言程序設計中,有多種返回DOS的方法,但一般利用DOS功能調用的4CH子功能實現,它需要的入口參數是AL=返回數碼(通常用0表示程序沒有錯誤)應用程序執行結束,返回DOS的代碼就是:

MOVAX,4C00H INT21H(6)匯編結束匯編結束表示:匯編程序將源程序翻譯成目標模塊代碼的過程到此結束源程序的最后必須有一條END偽指令

END[標號]“標號”參數:程序開始執行點(如:start標識符),結束將源程序翻譯成目標模塊代碼的匯編過程;連接程序將將標號所指單元的段基址和偏移量自動裝入CS和IP中

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

SEGMENT

┊DATA

ENDSCODE

SEGMENT

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

MOVAX,4C00H INT21HCODE

ENDS

ENDSTART總結源程序:hello.asmDSEG

SEGMENT

;數據段開始

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

ENDS

;數據段結束CSEG

SEGMENT

;代碼段開始

ASSUMECS:CSEG,DS:DSEG

;設定段寄存器與邏輯段的關系START:MOVAX,DSEG MOVDS,AX;設置數據段段地址

MOVDX,OFFSETSTRING

;為DOS調用設置入口參數

MOVAH,9

;為DOS功能調用設置功能號

INT21H

;DOS功能調用,顯示字符串

MOVAX,4C00H;為DOS功能調用設置功能號和入口參數

INT21H;DOS功能調用,返回DOS操作系統CSEG

ENDS

;代碼段結束

ENDSTART

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

‘d’(等于64H)

‘AB’(等于4142H)

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

數值表達式 符號名=數值表達式例:DATEQU99;等值語句

NUM=100;等號語句EQU用于數值等價時不能重復定義符號名,“=”允許有重復賦值。例如:

X=7; X=X+5 ;“XEQUX+5”是錯誤的匯編時,對EQU定義的符號名用對應的表達式進行“替換”。例如:NUM EQU 215MOD15ERR_MSG EQU “DataOverride”MESSAGE DB ERR_MSG

;等價于MESSAGEDB“DataOverride”MOV CX,NUM+1

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

(shl,shr,and,or,xor,not)關系運算符

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

(seg,offset)類型運算符

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

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的值與常數2相加并存入AX的操作只能在程序執行階段由以下兩條指令完成:MOV AX,BX;BX寄存器值存入AX寄存器ADD AX,2 ;AX寄存器的值加2,結果存AX√×不良用法2.5.2變量變量實質上是指內存單元的數據,雖然內存單元地址不變,但其中存放的數據可以改變變量需要事先定義才能使用變量定義偽指令為變量申請以固定長度為單位的存儲空間,并可以同時將相應的存儲單元初始化定義后的變量可以利用變量名等方法引用其中的數據,即變量的數值1.變量的定義變量定義的匯編語言格式為:

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

重復次數DUP(重復參數)變量定義偽指令DB(DefineByte):每個數據占用一個字節(8b)

DW(DefineWord):每個數據占用一個字(16b)

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

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

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

VAR1DWWVAR,DVAR,DVAR-WVAR,VAR1-DVAR ;字變量,4項

VAR2DDWVAR,DVAR,DVAR-WVAR,VAR1-DVAR ;雙字變量,4項

VAR3DBDVAR-WVAR,VAR1-DVAR ;字節變量,2項DSEG ENDS

有符號數用它的補碼存儲字符用ASCII代碼存儲DB定義的數據在[-128~255]之內變量名代表首個單元的地址DW定義的數據在[-32768,65535]內出現在參數部分的變量名用這個變量的偏移地址代替多字節數據的存放:

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

/標號

/常數

DBDWDDDFDQDTNEARFAR常數

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

名字/標號返回名字或標號的段地址OFFSET

名字/標號返回名字或標號的偏移地址TYPE

名字/標號返回變量或標號的類型,類型用數值表示LENGTH

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

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

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

變量/標號功能:回送變量或標號的偏址/段地址TYPE

變量

/標號

/常數

DBDWDDDFDQDTNEARFAR常數

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

DATASEGMENTLISTDW10,20,30DATAENDS下面三條指令都是把DATA段的段基址裝入AX:MOVAX,DATA;DATA代表該段的段基址,是一個立即數MOVAX,SEGDATA;取DATA的段基址,結果是立即數MOVAX,SEGLIST;取LIST的段基址,結果是立即數對比:;取出變量LIST第一個元素送入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.屬性運算符提高訪問變量、標號和一般存儲器操作數的靈活性常用屬性運算符類型PTR

變量名/標號臨時指定或臨時改變變量和標號的使用類型THIS

類型用于創建采用當前地址但為指定類型的操作數SHORT

標號將標號作為短轉移處理段寄存器

:用來給一個存儲器操作數指定一個段屬性,

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

類型名PTR名字/標號類型名可以是BYTE、WORD、DWORD(依次表示字節、字、雙字)等,或者是NEAR、FAR(分別表示近、遠)等例: MOVAX,BVAR

MOVAX,WORDPTR

BVAR

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

ORG

參數ORG偽指令是將當前偏移地址指針指向參數表達的偏移地址。例如:

ORG100h

;從100H處安排數據或程序

ORG$+10

;偏移地址加10,即跳過10個字節空間匯編語言程序中,符號“$”表示當前偏移地址值例:變量定位DATASEGMENT

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

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

MOVAX,3069H2.6.2寄存器尋址

MOVAL,BH2.6.3直接尋址

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

MOVAX,[BX]2.6.5寄存器相對尋址

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

MOVAX,[BP][DI]2.6.7相對基址變址尋址

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

AX低地址高地址1.指令在代碼段的存儲形式2.指令的運行結果立即數尋址只能用于源操作數位置,不能用于目的操作數位置指令中立即數長度應與其他操作數保持一致MOVAH,-40

;MOVAX,-40

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

;MOVAL,1234H;

常用于給寄存器或存儲單元賦初值

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

立即尋址只能用于源操作數√D8HAHFFD8HAX0041HAX42HBL34HAH,D8HAL2.6.2寄存器尋址特點:操作數存放在CPU寄存器中,指令指定寄存器名尋址在CPU內部進行,指令執行速度快例:MOVBX,AX

AX

BX

DX

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

11數據段30000

溫馨提示

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

評論

0/150

提交評論