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

下載本文檔

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

文檔簡介

課程性質(zhì)

本課程是計算機科學與技術(shù)專業(yè)的必修課程、也是本系其它專業(yè)專業(yè)課程學習的專業(yè)基礎(chǔ)課程。教學目的

本課程向?qū)W生介紹匯編語言程序設(shè)計的方法和技巧。以PC計算機的匯編語言為主,通過課堂教學和上機實習,使學生掌握DOS和Windows匯編序言程序設(shè)計的特點及技術(shù),即匯編工具Masm611和Masm32的使用;掌握軟件與硬件的交互原理,即DOS、BIOS功能的調(diào)用方法、MSDN的使用、API的調(diào)用熟練使用使用調(diào)試工具Debug和W32Dasm理解高級語言的實現(xiàn)原理1.1匯編語言的由來與特點計算機語言是人與計算機之間交流信息的工具程序:用計算機語言描述的處理步驟。程序設(shè)計:編制處理步驟的過程。計算機語言可分為三類:◆機器語言◆匯編語言◆通用語言面向機器設(shè)計的,低級語言面向程序設(shè)計人員設(shè)計的,高級語言機器指令是CPU能直接識別并執(zhí)行的指令它的表現(xiàn)形式是二進制編碼。機器指令通常由操作碼和操作數(shù)兩部分組成,操作碼指出該指令所要完成的操作,即指令的功能,操作數(shù)指出參與運算的對象,以及運算結(jié)果所存放的位置等。

機器語言是直接用描述機器指令來設(shè)計程序,它是CPU能直接識別的唯一一種語言。也就是說,CPU能直接執(zhí)行用機器語言描述的程序。一、機器語言10100000;1號單元內(nèi)容取入AL寄存器000000010000000010001010;2號單元內(nèi)容取入AH寄存器00100110000000100000000000000000;AL的內(nèi)容與AH的內(nèi)容相加,結(jié)11100000;果存入AL中10100010;AL的內(nèi)容送入3號單元000000110000000011110100;停機一、機器語言一、機器語言缺點:(1)機器語言難記,程序難編,易錯,調(diào)試困難;(2)機器語言通用性差。優(yōu)點:(1)計算機能直接認識、執(zhí)行;(2)算法刻畫細致;(3)程序緊湊,占用內(nèi)存空間少,執(zhí)行速度高;(4)能充分發(fā)揮計算機的硬件功能。二、匯編語言

隨著計算機的發(fā)展,產(chǎn)生了符號語言,上面的程序用符號語言編寫如下:

MOV AL,DATA1 ;取第一個數(shù)據(jù)

MOV AH,DATA2 ;取第二個數(shù)據(jù)

ADD AL,AH ;求和

MOV RLT,AL ;保存結(jié)果

HLT ;停機二、匯編語言匯編語言:符號語言的詞法、語法規(guī)則及偽指令符號就構(gòu)成了匯編語言。匯編過程:把匯編語言程序翻譯成機器語言程序的過程稱為匯編過程。匯編程序:完成匯編過程的程序稱為匯編程序。匯編語言程序:程序設(shè)計人員用匯編語言編寫的程序,是匯編程序加工的對象,稱為源程序。目標程序:匯編程序產(chǎn)生的結(jié)果,也稱作是目的程序。DSEGSEGMENT ;數(shù)據(jù)段開始DATA1DB15HDATA2DB26HRLTDB0DSEGENDS ;數(shù)據(jù)段結(jié)束CSEGSEGMENT ;代碼段開始

ASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEG ;設(shè)置數(shù)據(jù)段基址

MOVDS,AXMOVAL,DATA1 ;取第一個數(shù)據(jù)

MOVAH,DATA2 ;取第二個數(shù)據(jù)

ADDAL,AH ;求和

MOVRLT,AL ;保存結(jié)果

HLT ;停機CSEGENDS ;代碼段結(jié)束

ENDSTART ;源程序結(jié)束二、匯編語言種類:8086匯編,8051匯編等執(zhí)行過程:二、匯編語言匯編程序計算機源程序目標程序連接程序可執(zhí)行程序二、匯編語言優(yōu)點:(1)程序容易編制、出錯機會少、容易調(diào)試;(2)算法刻畫細致;(3)程序緊湊、占用內(nèi)存空間少、執(zhí)行速度高;(4)能充分發(fā)揮計算機的硬件功能。缺點:(1)計算機不能直接認識、執(zhí)行,必須經(jīng)過匯編變?yōu)闄C器語言程序;(2)通用性差。通用語言:是用來對計算機操作步驟進行描述的一整套標記符號、表達格式、結(jié)構(gòu)及其使用的語法規(guī)則。種類:Pascal,BASIC,C,COBOL,Java等等例子(C):inti,j,k;

k=i+j;三、通用語言(高級語言)執(zhí)行過程:三、通用語言(高級語言)編譯程序計算機源程序目標程序連接可執(zhí)行程序三、通用語言(高級語言)優(yōu)點:(1)程序容易編制、出錯機會少、容易調(diào)試;(2)容易表達算法;(3)通用性強。缺點:(1)計算機不能直接認識、執(zhí)行,必須經(jīng)過編譯變?yōu)闄C器語言程序;(2)編譯后生成的機器語言程序冗長、占用內(nèi)存空間多、執(zhí)行速度低;(3)不能充分發(fā)揮計算機的硬件功能。計算機語言發(fā)展簡史機器語言匯編語言高級語言FORTRANBASICCOBOLPASCALC/C++JAVA…...匯編語言的應(yīng)用領(lǐng)域匯編語言的優(yōu)點在于“與機器相關(guān)”和“執(zhí)行的高效率”。但也導致其可移植性差和調(diào)試難。所以,我們在選用匯編語言時要根據(jù)實際的應(yīng)用環(huán)境,盡可能避免其缺點對整個應(yīng)用系統(tǒng)的影響。匯編語言主要適用于下列領(lǐng)域:要求執(zhí)行效率高、反應(yīng)快的領(lǐng)域,如操作系統(tǒng)內(nèi)核,工業(yè)控制,實時系統(tǒng)等。系統(tǒng)性能的瓶頸,或頻繁被使用子程序或程序段。與硬件資源密切相關(guān)的軟件開發(fā),如設(shè)備驅(qū)動程序。受存儲容量限制的應(yīng)用領(lǐng)域,如家用電器的計算機控制功能。其它高級語言不適合的開發(fā)環(huán)境。學好匯編的意義理解硬件的控制原理:比如,控制磁盤驅(qū)動器、控制鍵盤、控制鼠標,等等。在學過匯編以后,可以和我們以前學習過的《計算機原理》結(jié)合起來,對硬件的控制,硬件與軟件的交互機理有深入的認識。深入理解高級語言:我們學過C語言,知道C語言用cin和cout怎么輸入輸出字符,在匯編中可以知道它們是怎么實現(xiàn)的。其它語句如switch、if…else、goto等,其它函數(shù)如strcmp、strlen、strcmp,我們也可以模擬它們的實現(xiàn)。軟件的加密解密:存在盜版軟件,是因為有人對軟件進行破解,讓其保護方式失去作用。保護自己的軟件,需要對軟件進行加密,匯編語言可以顯示它的威力。信息安全:尤其在反病毒方面。例如,病毒為什么能夠感染可執(zhí)行文件,假設(shè)一個文件感染了病毒,我們怎么去分析它,祛除病毒代碼,都只有匯編語言更適合一些。1.2系統(tǒng)結(jié)構(gòu)微型計算機的系統(tǒng)結(jié)構(gòu)微型計算機的系統(tǒng)包括硬件系統(tǒng)、軟件系統(tǒng)。首先介紹微型計算機系統(tǒng)的基本結(jié)構(gòu),然后分別以8086為例介紹16位微處理器的結(jié)構(gòu)和以80386為例介紹32位微處理器的結(jié)構(gòu)。

硬件系統(tǒng)硬件是指構(gòu)成計算機物理設(shè)備的實體(如CPU、顯卡、外部設(shè)備等),一臺計算機所有硬件的集合構(gòu)成了計算機的硬件系統(tǒng)。一般將其分為微處理器、主存儲器、接口電路、外部設(shè)備和系統(tǒng)總線等。微型計算機的系統(tǒng)結(jié)構(gòu)微處理器就是由控制器和算術(shù)邏輯部件(ALU)組成的中央處理器(即CPU)。它的作用是自動地執(zhí)行各條指令,協(xié)調(diào)整個系統(tǒng)的工作。主存儲器是計算機的記憶裝置,用于存儲計算機當前正在執(zhí)行的程序和數(shù)據(jù),我們通常接觸的是RAM,它是一種隨機存取存儲器。系統(tǒng)總線是將CPU與存儲器及外部設(shè)備連接起來的總線,它是用來傳輸信息的。按傳輸信息的種類不同把系統(tǒng)總線分為地址總線(AB)、數(shù)據(jù)總線(DB)、控制總線(CB)。外部設(shè)備按功能可分為二類:一類是與計算機進行通訊的設(shè)備如鍵盤、打印機和顯示器等,這些設(shè)備與計算機的通訊是通過I/O接口實現(xiàn)的。另一類是用來存儲信息的設(shè)備如磁盤、光盤等。

軟件系統(tǒng)軟件是指所有程序和數(shù)據(jù)的總稱。通常我們將它分為系統(tǒng)軟件和應(yīng)用軟件兩大類。

系統(tǒng)軟件主要用來對計算機系統(tǒng)實際運行進行控制,管理和服務(wù)的。它主要分為操作系統(tǒng)(如DOS、Unix、windows、Macintosh、Linux等),診斷程序,調(diào)試程序和語言處理程序如編譯程序、解釋程序和匯編程序等。

應(yīng)用軟件指的是用戶自己編寫的各類應(yīng)用程序。INTEL8086/808816位機的系統(tǒng)結(jié)構(gòu)Intel8086/8088是第三代微處理器。在匯編語言一級,它們與第二代微處理器8080/8085是兼容的。8086有20條地址線,16條數(shù)據(jù)線,直接尋址的內(nèi)存空間可達1MB(220)。8088和8086內(nèi)部組成完全相同,不同的是8088外部數(shù)據(jù)總線只有8條。因此8088被稱為準16機。IBMPC機及其兼容機上廣泛采用了8088CPU。8086/8088CPU按功能可分為二個部分:總線接口單元(BIU:BusInterfaceUnit)和執(zhí)行單元(EU:ExecuteUnit)。BIU由地址加法器,指令指針寄存器IP,指令流字節(jié)隊列和四個段寄存器(ES、CS、SS、DS)所組成的,它主要負責CPU與存儲器及外部設(shè)備之間的信息傳輸。EU由算術(shù)邏輯單元ALU(ArithmeticandLogicUnit),執(zhí)行單元控制系統(tǒng),8個16位寄存器和一個標志寄存器PSW組成,它負責全部指令的執(zhí)行,即負責向總線接口單元提供數(shù)據(jù)和地址,并對通用寄存器和標志寄存器進行管理,在ALU中進行算術(shù)運算和邏輯運算。8086/8088CPU的寄存器8086/8088的寄存器分為4種類型:(1)通用寄存器(2)指針和變址寄存器(3)段寄存器(4)標志寄存器(1)通用寄存器(2)指針與變址寄存器(3)段寄存器(4)標志寄存器標志寄存器長度為16位,其中9個位有定義?!痢痢痢罯F

DFIFTFSF

ZF×AF×PF

×CF1514131211109876543210CF,CarryFlag,進位標志,兩數(shù)相加,最高位向前的進位;或兩數(shù)相減最高位向前的借位,舉例:100000011000000000000001+1100000001000000111111111-1AF,AuxiliaryCarryFlag,輔助進位標志,兩數(shù)相加,第3位向前的進位;或兩數(shù)相減第3位向前的借位,舉例:000010010000100000010001+000000000000000111111111-PF,ParityFlag,奇偶標志,兩數(shù)操作(算術(shù)或邏輯),結(jié)果的低8位中含有1的位數(shù)是偶還是奇。舉例:100001011010110010011101100101111000010110000100∧結(jié)果:PF=1ZF,ZeroFlag,零標志,操作結(jié)果為0,則ZF為1。舉例:111111110000000100000000+進位1操作結(jié)果為0,ZF=1SF,SignFlag,符號標志,操作結(jié)果的符號位(即最高位的狀態(tài))。舉例:100001011010110010011101100101111000010110000100結(jié)果:SF=1∧OF,OverflowFlag,溢出標志,算術(shù)操作,結(jié)果超過目標所能容納的范圍。舉例:01111110(+126)00000011(+3)10000001(-127)+8086/8088存儲器結(jié)構(gòu)存儲器的分段結(jié)構(gòu)實際地址的產(chǎn)生存儲器的分段結(jié)構(gòu)長度≤64KB:段地址XXXX0H:偏移地址段地址:段首單元在整個1MB單元中的編號,其最低4位一定為0,高16位保存在段寄存器中。偏移地址:單元所在位置距離其所在段段首單元的距離,段首單元的偏移地址為0000H,后續(xù)的單元順次增1。因此,對于存儲空間中的任意一個單元,我們都可以通過段地址和段內(nèi)的偏移地址唯一地確定。存儲器的分段結(jié)構(gòu)存儲器的分段結(jié)構(gòu)

指針變址寄存器SI,DI,BP,SP存放的是在某一段內(nèi)尋址的單元的偏移地址。其中SI和DI存放的是數(shù)據(jù)段內(nèi)某單元的偏移地址,而BP和SP存放的則是堆棧段內(nèi)某單元的偏移地址。指令指針I(yè)P用以存放下一條要執(zhí)行的指令在當前代碼段內(nèi)的偏移地址。實際地址的產(chǎn)生實際地址:也稱物理地址,是該單元在整個1MB單元中的編號,用一個20位的二進制數(shù)表示,范圍從00000H~FFFFFH,該地址是唯一的。CPU與存儲器進行數(shù)據(jù)交換時所使用的地址即是實際地址。邏輯地址:由兩部分組成,即段地址和偏移地址。我們在編寫程序時所使用的地址即是邏輯地址。首先將存儲器分段之后段地址的高16位存入相應(yīng)的段寄存器中,然后再通過段內(nèi)的偏移地址對所需的單元進行訪問。實際地址的產(chǎn)生段地址偏移地址00450H0000H 0001H 0002H 0003H 0004H

:::

FFFDH FFFEH FFFFH邏輯地址:::00450H00451H00452H00453H00454H:::1044DH1044EH1044FH

物理地址(實際地址)實際地址的產(chǎn)生舉例:CS=9482,IP=2350,實際地址為:1001010010000010001000110101000010010110101101110000一個實際地址可以對應(yīng)多個邏輯地址。堆棧堆棧是按先進后出的原則在內(nèi)存中組織的一個特殊的存儲區(qū)域。該區(qū)域一端固定一端活動,固定的一端稱為棧底,而活動的一端稱為棧頂。往堆棧中存入或取出信息總是在堆棧的棧頂單元進行的。CPU中的堆棧指針指示器SP總是指向堆棧的棧頂,而堆棧段寄存器SS則指明了堆棧段的起始位置。8038632位機的系統(tǒng)結(jié)構(gòu)Intel80386是為滿足高性能的應(yīng)用領(lǐng)域與多用戶、多任務(wù)的操作系統(tǒng)的需要而設(shè)計的,其最大的特點是在CPU芯片上集成了一個存儲器管理部件(MMU),可對246字節(jié)的虛擬存儲器和4千兆字節(jié)的物理存儲器進行分段和分頁管理,段的最大長度為4千兆字節(jié)。80386采用CHMOS工藝,陶瓷網(wǎng)格陣列(PlasticGridArray,PGA)封裝,全32位結(jié)構(gòu),它的時鐘頻率有16MHZ和20MHZ兩種,總線周期只有2個時鐘周期。體系結(jié)構(gòu)80386的內(nèi)部結(jié)構(gòu)由六個功能部件組成:總線接口部件BIU(BusInterface)、指令預取部件IPU(InstructionPrefetchUnit)、指令譯碼部件IDU(InstructionDecodeUnit)、存儲器管理部件MMU(MemoryManagementUnit)、執(zhí)行部件EU(ExecutionUnit)和控制部件。這6個部件可以并行地工作,構(gòu)成一個六級流水線體系結(jié)構(gòu)。這樣,可以同時處理多條指令以減少程序?qū)嶋H執(zhí)行時間。總線接口部件BIU完成在總線周期內(nèi)對必要的信號進行控制。在80386內(nèi)部,指令預取部件要從存儲器取指令,執(zhí)行部件在執(zhí)行指令時要訪問存儲器以讀/寫數(shù)據(jù)、分頁部件將線形地址轉(zhuǎn)換成物理地址后,都會發(fā)出總線周期請求??偩€接口部件會根據(jù)優(yōu)先級對這些請求進行仲裁,從而有條不紊地服務(wù)于多個請求,并產(chǎn)生相應(yīng)總線操作所需信號,包括地址信號、數(shù)據(jù)信號、讀/寫控制信號等。此外,總線接口部件也實現(xiàn)80386和協(xié)處理器之間的協(xié)調(diào)控制。指令預取部件IPU從存儲器中以4個字節(jié)為單位預取指令,按順序存放到16個字節(jié)的預取指令隊列中,以便在CPU執(zhí)行當前指令時,指令譯碼部件對下一條指令進行譯碼。指令譯碼部件IDU從指令預取部件中的預取指令隊列里按順序取出指令并譯碼。執(zhí)行部件包括8個32位的通用寄存器組、32位的算術(shù)邏輯運算單元ALU、1個64位的桶形移位寄存器和一個乘法除法器,它們共同執(zhí)行各種數(shù)據(jù)處理和運算。此外,執(zhí)行部件中還包括ALU控制部分和保護測試部分,前者實現(xiàn)有效地址的計算、乘除法的加速等功能,后者檢驗指令執(zhí)行中是否符合涉及的存儲器分段規(guī)則。80386允許使用虛擬存儲器。所謂虛擬存儲器就是系統(tǒng)中有一個速度較快的、容量比較小的內(nèi)部主存儲器,還有一個速度較慢但容量較大的外部存儲器,通過存儲管理機制,使后者和前者有機地、靈活地組合在一起,這樣從程序員的角度看,系統(tǒng)中似乎有一個容量很大、速度也相當快的主存儲器MM(MainMemory),但它并不是真正的物理上的主存,所以稱為虛擬存儲器VM(VirtualMemory)。INTEI80386系統(tǒng)中,存儲體按段劃分,每個段的容量可變,最大可達4GB(232字節(jié))。分段的作用是可以對容量可變的代碼存儲塊或數(shù)據(jù)存儲塊提供模塊性和保護性。每個段又劃分為多個頁面,一個頁面可為1到4K字節(jié)。但在80386中,為了簡化硬件和操作系統(tǒng)中的頁定位計算,每頁固定為4K字節(jié)。分頁的作用是便于實現(xiàn)虛擬存儲器管理,通常在內(nèi)存和磁盤進行映象時,都以頁為單位把CPU的地址空間映象到磁盤。存儲器管理部件MMU的功能就是實現(xiàn)存儲器的管理,它由分段部件SU(SegmentUnit)和分頁部件PU(PageUnit)組成。分段部件SU管理面向程序員的邏輯地址空間,并且將邏輯地址轉(zhuǎn)換為線形地址,在芯片上有一個段描述符高速緩沖寄存器,其中存有當前使用的段描述符,它可以加快這種轉(zhuǎn)換;分頁部件PU管理物理地址空間,將分段部件或者指令譯碼部件產(chǎn)生的線形地址轉(zhuǎn)換為物理地址,在芯片上有一個頁描述符高速緩沖寄存器,它存放著頁描述符。

80386內(nèi)部寄存器

80386內(nèi)部共有34個寄存器,它們可以分為7類:通用寄存器、指令指針及標志寄存器、段寄存器、控制寄存器、系統(tǒng)地址寄存器、調(diào)試寄存器和測試寄存器。通用寄存器:是8086/8088/80286中相應(yīng)16位通用寄存器的擴展,命字分別是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP,用來存放數(shù)據(jù)和偏移地址。為了和8086/8088/80286兼容,每個通用寄存器的低16位可以獨立訪問,此時,它們的名稱分別為AX、BX、CX、DX、SI、DI、BP、SP。同時,為了和8080/8085兼容,AX、BX、CX、DX寄存器的低8位和高8位也可以獨立訪問,分別稱為AL、BL、CL、DL和AH、BH、CH和DH。32位的指令指針寄存器EIP由8086的IP擴展而來,用來存放將要執(zhí)行的下一條指令的地址偏移量,尋址范圍為4GB。為了和8086兼容,EIP的低16位可作為獨立指針,稱為IP,則其尋址范圍為64KB。32位的標志寄存器EFLAGS中容納三類標志:狀態(tài)標志、控制標志和系統(tǒng)方式標志。狀態(tài)標志是CPU在執(zhí)行指令過程中產(chǎn)生的,控制標志可以由程序員通過指令來設(shè)置,系統(tǒng)方式標志是和系統(tǒng)所處的工作模式密切相關(guān)。80386內(nèi)部設(shè)置了6個16位的段寄存器CS、SS、DS、ES、FS、GS。前4個段寄存器的名稱和8086/8088相同。為了得到更大的存儲空間,80386采用了比8086更加巧妙的辦法來得到段基地址。在這里,段寄存器作為進入存儲器中的一張表的變址寄存器,根據(jù)段寄存器的值可以從表中找到一個項,這張表是由操作系統(tǒng)建立的,稱為段描述符表。表內(nèi)每一項稱為描述符,每一個描述符對應(yīng)一個段。描述符中含有對應(yīng)段的起始地址即段基地址、段界限和段的屬性。CS寄存器指向代碼段對應(yīng)的段描述符,由此可以找到當前代碼段的段基地址,相類似的,SS指向當前堆棧段對應(yīng)的段描述符,DS寄存器指向當前數(shù)據(jù)段對應(yīng)的段描述符,而ES、FS、GS指向當前三個附加段對應(yīng)的段描述符。80386內(nèi)部有3個32位的控制寄存器CR0、CR2、CR3,用來保存機器的各種全局性狀態(tài)。這些狀態(tài)影響系統(tǒng)所有任務(wù)的運行,它們主要是供操作系統(tǒng)使用的,因此操作系統(tǒng)設(shè)計人員需要熟悉這些寄存器。在INTEL80386中有4個系統(tǒng)地址寄存器,即全局描述符表寄存器GDTR(GlobalDescriptorTableRegister)、中斷描述符寄存器IDTR(InterruptDescriptorTableRegister)、任務(wù)狀態(tài)寄存器TR(TaskStateRegister)和局部描述符表寄存器LDTR(LocalDescriptorTableRegister)。INTEL80386有8個32位的調(diào)試寄存器DR0~DR7。這些寄存器可以使程序員在調(diào)試過程中一次設(shè)置4個斷點,DR0~DR3用來容納4個32位的斷點線性地址;DR4、DR5為備用寄存器;DR6是斷點狀態(tài)寄存器,其中保存了幾個調(diào)試標志,用來協(xié)助斷點調(diào)試;DR7為斷點控制寄存器,可以通過對應(yīng)位的設(shè)置來有選擇地允許和禁止斷點調(diào)試,比如僅在寫數(shù)據(jù)時作為斷點,或者僅在讀/寫數(shù)據(jù)時作為斷點等。INTEL80386設(shè)置了8個32位的測試寄存器TR0~TR7,其中TR0~TR5由Intel公司保留,用戶只能訪問TR6、TR7。這2個32位測試寄存器TR6和TR7用于存儲器測試,TR6為測試命令寄存器,其中存放測試控制命令,TR7為數(shù)據(jù)寄存器,容納存儲器測試所得的數(shù)據(jù)。。

80386的三種工作方式實地址模式(RealAddressModal)保護虛地址模式(ProtectedVirtualAddressMode)虛擬8086模式(Virtual8086Modal)。1.3

數(shù)據(jù)表示計算機處理的信息可分為兩大類:一類是按進位計算制表示的有大小、正負之分的數(shù)值信息;另一類是非數(shù)值信息,如字符、文字、圖像、邏輯數(shù)據(jù)等。但在計算機內(nèi)部所有信息都要轉(zhuǎn)換成0和1表示的二進制編碼。數(shù)制及其轉(zhuǎn)換計算機匯編語言中常用的計數(shù)制有:十進制數(shù)(Decimal)二進制數(shù)(Binary)十六進制數(shù)(Hexadecimal)八進制數(shù)(Octal)。數(shù)制的轉(zhuǎn)換

整數(shù)的轉(zhuǎn)換采用“除2取余”法。把要轉(zhuǎn)換的十進制數(shù)的整數(shù)部分不斷除以2并在右邊記下余數(shù),然后以此類推,直到最后的商為0,最后我們將余數(shù)倒著排列即得結(jié)果。

小數(shù)的轉(zhuǎn)換采用“乘2取整”法。小數(shù)的轉(zhuǎn)換正好與整數(shù)的轉(zhuǎn)換相反,將小數(shù)部分不斷的乘以2在右邊記下成績整數(shù)部分,依此類推,直到最后小數(shù)部分為0或結(jié)果已達到精度要求為止。先取出來的整數(shù)作高位,后取出的整數(shù)作低位,順序排列即可。將十進制數(shù)轉(zhuǎn)換成二進制數(shù)。

125.6875D=1111101.1011B將十進制數(shù)轉(zhuǎn)換成八/十六進制數(shù)

100D=64H

65535=0FFFFH

255=0FFH二/八/十六進制數(shù)轉(zhuǎn)換成十進制數(shù)轉(zhuǎn)換方法是采用位置記數(shù)法把他們寫成相應(yīng)的冪運算形式,然后求和即可得到結(jié)果。

572.34Q=5*82+7*8+2+3*8-1+4*8-2=378.4375D

二進制數(shù)與八進制數(shù)的轉(zhuǎn)換

二進制數(shù)轉(zhuǎn)換成八進制數(shù)只需將二進制數(shù)從小數(shù)點開始每3位轉(zhuǎn)成一位八進制數(shù),整數(shù)部分由最低位開始劃分,小數(shù)部分從最高位開始劃分。

101111010.011100B

=572.34Q二進制數(shù)與十六進制數(shù)的轉(zhuǎn)換

101111010.011111B

=17A.7CH有符號數(shù)的表示法原碼:原碼表示最高位為0表示正數(shù),為1表示負數(shù),其余位表示數(shù)的絕對值。對于整數(shù),原碼可以用下面的公式表示:

X當0≤X<2n[X]原=

2n-X=2n+|X|當0≥X>-2n對于小數(shù),原碼用下面的公式表示:

X當1>X≥0[X]原=

1-X=1+|X|當0≥X>-1反碼:正數(shù)的反碼表示和原碼相同,最高位為0表示正數(shù),其余位表示數(shù)的絕對值。負數(shù)的反碼表示可以在其原碼表示的基礎(chǔ)上保持符號位不變,其余位求反。對于整數(shù),反碼用下面的公式表示:

X當0≤X<2n[X]反=

(2n+1-1)+X當0≥X>-2n對于小數(shù),反碼用下面的公式表示:

X當0≤X<2n[X]反=

(2-2-n)+X當0≥X>-1補碼:正數(shù)的補碼表示和原碼相同,最高位為0表示正數(shù),其余位表示數(shù)的絕對值。負數(shù)的補碼表示可以在其原碼表示的基礎(chǔ)上保持符號位不變,其余位求反末位加1。對于整數(shù),補碼用下面的公式表示:

X當0≤X<2n[X]補=

2n+1+X當0≥X>-2n對于小數(shù),反碼用下面的公式表示:

X當0≤X<2n[X]補=

2+X=2-|X|當0≥X>-1BCD碼和字符編碼

BCD碼(BinaryCodeDecimal)在日常生活中人們常用的是十進制數(shù),而機器內(nèi)部又只能處理二進制數(shù),因此我們引進了BCD碼。BCD碼是用四位的二進制數(shù)來表示一位十進制數(shù)。常用的BCD碼有8421BCD碼,5421BCD碼,2421BCD碼和余3碼等。

ASCII碼(

AmericanStandardCodeforInformationInterchange)除了數(shù)值數(shù)據(jù)外,計算機還可處理人們常用的符號,如字母,標點符號等。在計算機中這些符號是用ASCII碼來表示的。ASCII碼用一個字節(jié)的二進制數(shù)來表示一個字符,但實際只用了七位,最高位被用來做奇偶校驗位。在原來7位ASCII碼的基礎(chǔ)上加上一位校驗位,使一個字節(jié)中包含1的個數(shù)為奇數(shù)(或偶數(shù))就稱為奇校驗或偶校驗。

ASCII碼UnicodeUnicode是一個16位的字符集,它包括了幾乎所有常見的信息交換用的字符(英、法、德、中(簡、繁)、朝鮮、日等),其64K的編碼空間有大約1/3尚未分配。學習要求●掌握16位指令系統(tǒng)中常用指令的使用?!裾莆赵闯绦蛑谐S玫膫沃噶睢!裾莆蘸陞R編源程序的結(jié)構(gòu)及其編程方法?!裾莆蘸陞R編語言上機調(diào)試過程。2.116位匯編程序設(shè)計概述在DOS下用匯編語言開發(fā)程序的工具是Masm和Tasm。Masm常用的有Masm611和Masm614兩個版本,Tasm是Borland公司提供的工具。用Masm.exe來將源程序生成目標文件。ML.exe既可以產(chǎn)生目標文件,也可以產(chǎn)生可執(zhí)行文件。調(diào)試可執(zhí)行文件用Debug.exe或CV.exe。匯編語言程序的特點編程的第一步是編寫源程序。用記事本等一切可以以純文本方式編輯保存文件的工具進行。文件必須保存為擴展名為asm的文件,且文件名不能超過8個ASCII碼字符。匯編語言程序的特點源程序中要使用指令,指令是最小的代碼單元。指令分為兩種,一種叫硬指令,另一種叫偽指令。硬指令是機器事實上存在的指令例如:MOVAX,1234

在源程序中寫下這條指令,生成可執(zhí)行文件后,反匯編仍然存在這條指令。匯編語言程序的特點偽指令是告訴編譯器的一些說明性語句,編譯器承認,而CPU中無此指令。例如:X1DW0

這是一條用偽指令DW定義字變量的語句,編譯器會將它在數(shù)據(jù)段中產(chǎn)生一個字的空間且初始化為0。程序中并沒有X1這個變量,其它指令操作該變量都會被編譯成從X1的地址讀寫數(shù)據(jù)。指令尋址方式從8086的機器代碼格式入手,論述:立即數(shù)尋址方式寄存器尋址方式存儲器尋址方式進而熟悉8086匯編語言指令格式,尤其是其中操作數(shù)的表達方法;為展開8086指令系統(tǒng)做好準備指令的組成指令由操作碼和操作數(shù)兩部分組成操作碼說明計算機要執(zhí)行哪種操作,如傳送、運算、移位、跳轉(zhuǎn)等操作,它是指令中不可缺少的組成部分操作數(shù)是指令執(zhí)行的參與者,即各種操作的對象有些指令不需要操作數(shù),通常的指令都有一個或兩個操作數(shù),也有個別指令有3個甚至4個操作數(shù)操作碼操作數(shù)指令的操作碼和操作數(shù)每種指令的操作碼:用一個唯一的助記符表示(指令功能的英文縮寫)對應(yīng)著機器指令的一個二進制編碼指令中的操作數(shù):可以是一個具體的數(shù)值可以是存放數(shù)據(jù)的寄存器或指明數(shù)據(jù)在主存位置的存儲器地址尋址方式指令系統(tǒng)設(shè)計了多種操作數(shù)的來源尋找操作數(shù)的過程就是操作數(shù)的尋址操作數(shù)采取哪一種尋址方式,會影響機器運行的速度和效率標準機器代碼示例

mov

ax,[BP+0]

;機器代碼是8B4600前一個字節(jié)8B是操作碼(含w=1表示字操作)中間一個字節(jié)46(01000110)是“modregr/m”字節(jié)reg=000表示目的操作數(shù)為AXmod=01和r/m=110表示源操作數(shù)為[BP+D8]最后一個字節(jié)就是8位位移量〔D8=〕001/2字節(jié)0/1字節(jié)0/1/2字節(jié)0/1/2字節(jié)操作碼modregr/m位移量立即數(shù)其它機器代碼形式moval,05;機器代碼是B005前一個字節(jié)B0是操作碼(含一個操作數(shù)AL),后一個字節(jié)05是立即數(shù)movax,0102H;機器代碼是B80201前一個字節(jié)B8是操作碼(含一個操作數(shù)AX),后兩個字節(jié)0201是16位立即數(shù)(低字節(jié)02在低地址)操作碼操作數(shù)指令的助記符格式

操作碼操作數(shù)1,操作數(shù)2

;注釋操作數(shù)2,稱為源操作數(shù)src,它表示參與指令操作的一個對象操作數(shù)1,稱為目的操作數(shù)dest,它不僅可以作為指令操作的一個對象,還可以用來存放指令操作的結(jié)果分號后的內(nèi)容是對指令的解釋示例傳送指令MOV的格式MOV

dest,src

;dest←srcMOV指令的功能是將源操作數(shù)src傳送至目的操作數(shù)dest,例如:MOVAL,05H ;AL←05HMOVBX,AX ;BX←AXMOVAX,[SI] ;AX←DS:[SI]MOVAX,[BP+06H] ;AX←SS:[BP+06H]MOVAX,[BX+SI] ;AX←DS:[BX+SI]演示傳送指令MOV的功能源操作數(shù)src目的操作數(shù)dest30H30H被傳送的數(shù)據(jù)立即數(shù)尋址方式指令中的操作數(shù)直接存放在機器代碼中,緊跟在操作碼之后(操作數(shù)作為指令的一部分存放在操作碼之后的主存單元中)這種操作數(shù)被稱為立即數(shù)imm它可以是8位數(shù)值i8(00H~FFH)也可以是16位數(shù)值i16(0000H~FFFFH)立即數(shù)尋址方式常用來給寄存器賦值立即數(shù)尋址指令MOVAL,05H

;AL←05HMOVAX,0102H

;AX←0102H指令功能執(zhí)行過程寄存器尋址方式操作數(shù)存放在CPU的內(nèi)部寄存器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,1234H ;AX←1234HMOVBX,AX

;BX←AX指令功能執(zhí)行過程存儲器尋址方式指令中給出操作數(shù)的主存地址信息(偏移地址,稱之為有效地址EA),而段地址在默認的或用段超越前綴指定的段寄存器中8086設(shè)計了多種存儲器尋址方式1、直接尋址方式2、寄存器間接尋址方式3、寄存器相對尋址方式4、基址變址尋址方式5、相對基址變址尋址方式直接尋址方式有效地址在指令中直接給出默認的段地址在DS段寄存器,可使用段超越前綴改變MOVAX,[2000H];AX←DS:[2000H];指令代碼:A10020MOVAX,ES:[2000H];AX←ES:[2000H];指令代碼:26A10020指令功能執(zhí)行過程寄存器間接尋址方式有效地址存放在基址寄存器BX或變址寄存器SI、DI中默認的段地址在DS段寄存器,可使用段超越前綴改變MOVAX,[SI]

;AX←DS:[SI]指令功能執(zhí)行過程寄存器相對尋址方式有效地址是寄存器內(nèi)容與有符號8位或16位位移量之和,寄存器可以是BX、BP或SI、DI有效地址=BX/BP/SI/DI+8/16位位移量段地址對應(yīng)BX/SI/DI寄存器默認是DS,對應(yīng)BP寄存器默認是SS;可用段超越前綴改變寄存器相對尋址指令MOVAX,[DI+06H]

;AX←DS:[DI+06H]MOVAX,[BP+06H]

;AX←SS:[BP+06H]指令功能執(zhí)行過程基址變址尋址方式有效地址由基址寄存器(BX或BP)的內(nèi)容加上變址寄存器(SI或DI)的內(nèi)容構(gòu)成:有效地址=BX/BP+SI/DI段地址對應(yīng)BX基址寄存器默認是DS,對應(yīng)BP基址寄存器默認是SS;可用段超越前綴改變基址變址尋址指令MOVAX,[BX+SI]

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

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

;AX←DS:[BP+DI]指令功能執(zhí)行過程相對基址變址尋址方式有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址對應(yīng)BX基址寄存器默認是DS,對應(yīng)BP基址寄存器默認是SS;可用段超越前綴改變相對基址變址尋址指令MOVAX,[BX+SI+06H]

;AX←DS:[BX+SI+06H]

位移量可用符號表示

同一尋址方式有多種表達形式指令功能執(zhí)行過程用符號表示位移量在寄存器相對尋址或相對基址變址尋址方式中,位移量可用符號表示:MOVAX,[SI+COUNT];COUNT是事先定義的變量或常量(就是數(shù)值)MOVAX,[BX+SI+WNUM];WNUM也是變量或常量多種表達形式同一尋址方式可以寫成不同的形式:MOVAX,[BX][SI]

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

;等同于MOVAX,[SI+COUNT]MOVAX,WNUM[BX][SI]

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

;等同于MOVAX,[BX+SI+WNUM]匯編語言指令格式由4部分組成:標號:指令助記符目的操作數(shù),源操作數(shù) ;注釋

標號表示該指令在主存中的邏輯地址

每個指令助記符就代表一種指令

目的和源操作數(shù)表示參與操作的對象

注釋是對該指令或程序段功能的說明指令操作數(shù)的表達(1)r8——任意一個8位通用寄存器AHALBHBLCHCLDHDLr16——任意一個16位通用寄存器AXBXCXDXSIDIBPSPreg——代表r8或r16seg——段寄存器CS/DS/ES/SS指令操作數(shù)的表達(2)m8——一個8位存儲器操作數(shù)單元(所有主存尋址方式)m16——一個16位存儲器操作數(shù)單元(所有主存尋址方式)mem——代表m8或m16指令操作數(shù)的表達(3)i8——一個8位立即數(shù)i16——一個16位立即數(shù)imm——代表i8或i16dest——目的操作數(shù)src——源操作數(shù)邏輯段分配立即數(shù)尋址的功能立即數(shù)尋址的執(zhí)行寄存器尋址的功能寄存器尋址的執(zhí)行直接尋址的功能直接尋址的執(zhí)行寄存器間接尋址的功能寄存器間接尋址的執(zhí)行寄存器相對尋址的功能寄存器相對尋址的執(zhí)行基址變址尋址的功能基址變址尋址的執(zhí)行相對基址變址尋址的功能相對基址變址尋址的執(zhí)行2.2.1數(shù)據(jù)傳送類指令把數(shù)據(jù)從一個位置傳送到另一個位置14條指令分5組1、通用數(shù)據(jù)傳送:MOV

XCHG

XLAT2、堆棧操作:PUSH

POP3、標志寄存器傳送:LAHF

SAHF

PUSHF

POPF4、地址傳送:LEA

LDS

LES5、輸入輸出:IN

OUT學習要求數(shù)據(jù)傳送是計算機中最基本、最重要的一種操作。傳送指令也是最常使用的一類指令。傳送指令把數(shù)據(jù)從一個位置傳送到另一個位置。除標志寄存器傳送指令外,均不影響標志位重點掌握:MOVPUSHPOP特別熟悉:

XCHGXLATLEA一般了解:LAHFSAHFPUSHFPOPFLDSLES以后展開:INOUT傳送指令MOV(move)把一個字節(jié)或字的操作數(shù)從源地址傳送至目的地址MOVreg/mem,imm ;立即數(shù)送寄存器或主存:例2.1MOVreg/mem/seg,reg

;寄存器送(段)寄存器或主存:例2.2MOVreg/seg,mem ;主存送寄存器:例2.3MOVreg/mem,seg ;段寄存器送寄存器或主存:例2.4傳送指令不是萬能的,有不少非法傳送的情況。例子段寄存器:CS/DS/ES/SS通用寄存器:AX/BX/CX/DXAH/AL/BH/BL/CH/CL/DH/DL立即數(shù)

MEM例2.1:立即數(shù)傳送MOVAL,55HMOVAX,55AAHMOVCX,0F943HMOVBYTEPTR[BX],12H;12h

DS:[BX]MOVWORDPTR[BX+SI],100h;100h

DS:[BX+SI]注意:立即數(shù)是字節(jié)(byte)還是字(word),也就是明確指令是字節(jié)操作還是字操作。進一步解釋例2.2:寄存器傳送MOVAX,BXMOVAH,BL例2.3:存儲器傳送MOVAX,[BX]MOV[SI],ALMOVSS,[2000H]MOVES:[DI],CS注意:不存在存儲器向存儲器的傳送指令進一步解釋例2.4:段寄存器傳送MOVAX,CSMOVDS,AX注意:對段寄存器的操作有一些限制進一步解釋非法傳送種種兩個操作數(shù)的類型不一致例如源操作數(shù)是字節(jié),而目的操作數(shù)是字;或相反兩個操作數(shù)不能都是存儲器傳送指令很靈活,但主存之間的直接傳送卻不允許段寄存器的操作有一些限制段寄存器屬專用寄存器,對他們的操作能力有限實例實例實例兩個操作數(shù)的類型要一致絕大多數(shù)雙操作數(shù)指令(包括傳送指令),除非特別說明,目的操作數(shù)與源操作數(shù)必須類型一致,或者同為字,或者同為字節(jié),否則為非法指令。

MOVAL,050AH;非法指令:050Ah為字,而AL為字節(jié)寄存器有明確的字節(jié)或字類型,有寄存器參與的指令其操作數(shù)類型就是寄存器的類型。對于存儲器單元與立即數(shù)同時作為操作數(shù)的情況,必須顯式指明。byteptr指示字節(jié)類型,wordptr指示字類型。兩個操作數(shù)不能都是存儲器8086指令系統(tǒng)不允許兩個操作數(shù)都是存儲單元(除串操作指令),沒有主存至主存的數(shù)據(jù)傳送。要實現(xiàn)這種傳送,可通過寄存器間接實現(xiàn)。例2.5:buffer1單元的數(shù)據(jù)傳送到buffer2單元movax,buffer1 ;ax←buffer1(將buffer1內(nèi)容送ax)movbuffer2,ax ;buffer2←ax;這里buffer1和buffer2是兩個字變量;實際表示直接尋址方式段寄存器的操作有一些限制不允許立即數(shù)傳送給段寄存器MOVDS,100H

;非法指令:立即數(shù)不能傳送段寄存器不允許直接改變CS值MOVCS,[SI]

;不允許使用的指令不允許段寄存器之間的直接數(shù)據(jù)傳送MOVDS,ES

;非法指令:不允許段寄存器間傳送交換指令XCHG(exchange)把兩個地方的數(shù)據(jù)進行互換XCHGreg,reg/mem

;reg←→reg/mem交換指令可以在寄存器與寄存器之間對換數(shù)據(jù)交換指令可以在寄存器與存儲器之間對換數(shù)據(jù)交換指令不能在存儲器與存儲器之間對換數(shù)據(jù)例2.7例2.6Why例2.6:寄存器與寄存器數(shù)據(jù)交換MOVAX,1234HMOVBX,5678HXCHGAX,BX。操作該段程序執(zhí)行完:AX=5678H,BX=1234H例2.7:寄存器與存儲器數(shù)據(jù)交換MOVBP,0200HMOVSI,0046HXCHGAX,[BP+SI];這里是BP,則對應(yīng)的段寄存器為SS設(shè)SS=5000H,則存儲單元的物理地址PA=SS*16+EA=50000H+0200H+0046H=50246H,指令執(zhí)行前:AX=5621H,(50246H)=12H,(50247H)=34H指令執(zhí)行后:AX=3412H,(50246H)=21H,(50247H)=56H換碼指令XLAT(translate)將BX指定的緩沖區(qū)中、AL指定的位移處的一個字節(jié)數(shù)據(jù)取出賦給ALXLAT ;al←ds:[bx+al]:例2.8換碼指令執(zhí)行前:在主存中建立一個字節(jié)表格,內(nèi)容是要轉(zhuǎn)換成的目的代碼,表格的首地址存放于BX,AL存放相對表格首地址的位移量然后,執(zhí)行換碼指令:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標代碼隱含尋址方式例2.8:代碼轉(zhuǎn)換換碼指令沒有顯式的操作數(shù),但使用了BX和AL;因為換碼指令使用了隱含尋址方式。隱含尋址方式——采用默認操作數(shù)的尋址方式。

例2.8例2.8:將0~9,A~F的16進制數(shù)轉(zhuǎn)換為ASCII碼并顯示

.MODELSMALL .STACK .DATA TABLEDB'0123456789ABCDEF';0~9,A~F的ASCII碼

.CODE

.STARTUP MOVBX,OFFSETTABLE MOVAL,10 XLAT;AL=41H,為A的ASCII碼

MOVDL,AL MOVAH,02H INT21H

.EXIT0 END堆棧操作指令堆棧的概念堆棧的操作:進棧和出棧堆棧的特點PUSHr16/m16/seg;進棧指令:;SP←SP-2;SS:[SP]←r16/m16/segPOPr16/m16/seg;出棧指令:;r16/m16/seg←SS:[SP];SP←SP+2什么是堆棧堆棧是一個“先進后出”的主存區(qū)域,位于堆棧段中,使用SS段寄存器記錄其段地址。堆棧只有一個出口,即當前棧頂。棧頂是地址較小的一端(低端),它用堆棧指針寄存器SP指定。圖a中的堆棧是個空棧。堆棧的操作堆棧只有兩種基本操作:進棧和出棧,對應(yīng)兩條指令PUSH和POP。進棧指令PUSH:進棧指令先使堆棧指針SP減2,然后把一個字操作數(shù)存入堆棧頂部出棧指令POP:出棧指令把棧頂?shù)囊粋€字傳送至指定的目的操作數(shù),然后堆棧指針SP加2請參看實例2.9和例2.10請對照圖b和圖c堆棧的實例和圖例MOVAX,1278HPUSHAXPOPAX操作堆棧的特點堆棧操作的單位是字,進棧和出棧只對字量字量數(shù)據(jù)從棧頂壓入和彈出時,都是低地址字節(jié)送低字節(jié),高地址字節(jié)送高字節(jié)堆棧操作遵循先進后出原則可用存儲器尋址方式隨機存取堆棧中的數(shù)據(jù)堆棧常用來臨時存放數(shù)據(jù)傳遞參數(shù)保存和恢復寄存器例2.11例2.11:現(xiàn)場的保護和恢復pushax ;進入子程序后pushbxpushds...popds ;返回主程序前popbxpopax有效地址傳送指令LEA(loadEA)將存儲器操作數(shù)的有效地址傳送至指定寄存器中LEAr16,mem ;r16←mem的有效地址例2.12:有效地址的獲取LEABX,[2000H];把[2000H]操作數(shù)的偏移地址送給BX

指令執(zhí)行后:BX=2000H。要注意和

MOVBX,[2000H]的區(qū)別,它是把DS:[2000H]的內(nèi)容送給BX。操作指針傳送指令LDSr16,mem;r16←mem,;DS←mem+2LDS指令將主存中mem指定的字送至r16,并將mem的下一字送DS寄存器LESr16,mem;r16←mem,;ES←mem+2LES指令將主存中mem指定的字送至r16,并將mem的下一字送ES寄存器例2.13例2.14例2.13:LDSBX,ADDRx[SI]若DS=2000H,SI=1000H,ADDRx=0020H,則存儲器操作數(shù)的物理地址是:PA=DS*16+EA=20000H+1000H+0020H=21020H。指令執(zhí)行前:BX=6543H,(21020H)=1040H,(21022H)=4000H。指令執(zhí)行后:BX=1040H,DS=4000H,(21020H)=1040H,(21022H)=4000H。操作例2.14LESBX,[SI]若DS=2000H,SI=1000H,則存儲器操作數(shù)的物理地址是:PA=DS*16=20000H+1000H=21000H。設(shè)指令執(zhí)行前:(21000H)=1400H,(21002H)=4000H。指令執(zhí)行后:BX=1400H,ES=4000H,(21000H)=1400H,(21002H)=4000H。標志低字節(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é)←AHSAHF將AH寄存器內(nèi)容送FLAGS的低字節(jié)用AH的第7/6/4/2/0位相應(yīng)設(shè)置SF/ZF/AF/PF/CF標志標志寄存器出入堆棧指令PUSHF;SP←SP-2;SS:[SP]←FLAGSPUSHF指令將標志寄存器的內(nèi)容壓入堆棧,同時棧頂指針SP減2POPF;FLAGS←SS:[SP];SP←SP+2POPF指令將棧頂字單元內(nèi)容送標志寄存器,同時棧頂指針SP加2例2.15例2.15:置位單步標志pushf ;保存全部標志到堆棧popax ;從堆棧中取出全部標志orax,0100h ;設(shè)置D8=TF=1, ;ax其他位不變pushax ;將ax壓入堆棧popf ;將堆棧內(nèi)容取到標志寄存器, ;即FLAGS←AX輸入輸出指令I(lǐng)NAL/AX,i8/DX;AL/AX←I/O端口輸入IN指令將外設(shè)數(shù)據(jù)傳送給CPU內(nèi)的AL/AXOUTi8/DX,AL/AX;I/O端口←AL/AX輸出OUT指令將CPU內(nèi)的AL/AX數(shù)據(jù)傳送給外設(shè)8086通過輸入輸出指令與外設(shè)進行數(shù)據(jù)傳送輸入輸出指令8086通過輸入輸出指令與外設(shè)進行數(shù)據(jù)交換;呈現(xiàn)給程序員的外設(shè)是端口(Port)即I/O地址8086用于尋址外設(shè)端口的地址線為16條,端口最多為216=65536(64K)個,端口號為0000H~FFFFH每個端口用于傳送一個字節(jié)的外設(shè)數(shù)據(jù)輸入輸出尋址方式8086的端口有64K個,無需分段,設(shè)計有兩種尋址方式直接尋址:只用于尋址00H~FFH前256個端口,操作數(shù)i8表示端口號間接尋址:可用于尋址全部64K個端口,DX寄存器的值就是端口號對大于FFH的端口只能采用間接尋址方式例2.16INAL,60H;從端口60H讀入一個字節(jié)到AL中INAX,20H;把端口20H、21H按“高高低低”組成的字讀入AXMOVDX,2F8HINAL,DX;從端口2F8H讀入一個字節(jié)到AL中INAX,DX;把端口2F8H、2F9H按“高高低低”組成的字讀入AXINOUT61H,AL;把AL的內(nèi)容輸出到端口61H中OUT20H,AX;把AX的內(nèi)容輸出到端口20H、21HMOVDX,3C0HOUTDX,AL;把AL的內(nèi)容輸出到端口3C0H中OUTDX,AX;把AX的內(nèi)容輸出到端口3C0H、3C1H例2.17OUT教學提示全面而準確地理解每條指令的功能和應(yīng)用,是編寫匯編語言程序的關(guān)鍵逐個展開指令2.2.2算術(shù)運算類指令四則運算是計算機經(jīng)常進行的一種操作。算術(shù)運算指令實現(xiàn)二進制(和十進制)數(shù)據(jù)的四則運算請注意算術(shù)運算類指令對標志的影響掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP熟悉:MUL/IMUL、DIV/IDIV理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD1、加法指令ADDADD指令將源與目的操作數(shù)相加,結(jié)果送到目的操作數(shù)ADD指令按狀態(tài)標志的定義相應(yīng)設(shè)置ADDADDreg,imm/reg/mem

;reg←reg+imm/reg/memADDmem,imm/reg

;mem←mem+imm/reg例題2.18例2.18:加法運算MOVBX,1000HMOVWORDPTR[BX],0A988H

;WORDPTR指明操作類型ADDWORDPTR[BX],9F76H程序段執(zhí)行后:[1000H]=48FEH,BX=1000H,CF=1,ZF=0,OF=1,SF=0,PF=0,AF=0。ADD帶進位加法指令ADCADC指令將源與目的操作數(shù)相加,再加上進位CF標志,結(jié)果送到目的操作數(shù)ADC指令按狀態(tài)標志的定義相應(yīng)設(shè)置ADC指令主要與ADD配合,實現(xiàn)多精度加法運算ADCADCreg,imm/reg/mem

;reg←reg+imm/reg/mem+CFADCmem,imm/reg

;mem←mem+imm/reg+CF例題2.19例2.19:雙字加法MOVDX,0002H;高16位MOVAX,0F365H;低16位ADDAX,0E024H;低16位+低16位ADCDX,0005H;高16位相加,同時加進位計算結(jié)果高16位為0008(DX,為0002+0005+進位CY),低16位為0D389H(AX)。ADC增量指令I(lǐng)NC(increment)INC指令對操作數(shù)加1(增量)INC指令不影響進位CF標志,按定義設(shè)置其他狀態(tài)標志INCINCreg/mem;reg/mem←reg/mem+1incbxincbyteptr[bx]2、減法指令SUB(subtract)SUB指令將目的操作數(shù)減去源操作數(shù),結(jié)果送到目的操作數(shù)SUB指令按照定義相應(yīng)設(shè)置狀態(tài)標志SUBSUBreg,imm/reg/mem

;reg←reg-imm/reg/memSUBmem,imm/reg

;mem←mem-imm/reg例題2.20例2.20:減法運算MOVBX,9548HMOVCX,28A7HSUBBX,CX程序段執(zhí)行后:BX=6C9CH,CX=28A7H,CF=0,ZF=0,OF=1,SF=0,PF=1,AF=1。SUB帶借位減法指令SBBSBB指令將目的操作數(shù)減去源操作數(shù),再減去借位CF(進位),結(jié)果送到目的操作數(shù)。SBB指令按照定義相應(yīng)設(shè)置狀態(tài)標志SBB指令主要與SUB配合,實現(xiàn)多精度減法運算SBBSBBreg,imm/reg/mem

;reg←reg-imm/reg/mem-CFSBBmem,imm/reg

;mem←mem-imm/reg-CF例題2.21例2.21:雙字減法MOVDX,0012HMOVAX,7546HMOVCX,0010HMOVBX,9428HSUBAX,BXSBBDX,CXSUB指令執(zhí)行后:AX=E11EH,BX=9428H,CF=1,ZF=0,OF=1,SF=1,PF=1,AF=1。SBB指令執(zhí)行后:DX=0001H,CX=0010H,CF=0,ZF=0,OF=0,SF=0,PF=0,AF=0。SBB減量指令DEC(decrement)DEC指令對操作數(shù)減1(減量)DEC指令不影響進位CF標志,按定義設(shè)置其他狀態(tài)標志DECDECreg/mem;reg/mem←reg/mem-1deccxdecwordptr[si]

INC指令和DEC指令都是單操作數(shù)指令主要用于對計數(shù)器和地址指針的調(diào)整3、求補指令NEG(negative)NEG指令對操作數(shù)執(zhí)行求補運算:用零減去操作數(shù),然后結(jié)果返回操作數(shù)求補運算也可以表達成:將操作數(shù)按位取反后加1NEG指令對標志的影響與用零作減法的SUB指令一樣NEGNEGreg/mem;reg/mem←0-reg/mem例題2.22例2.22:求補運算MOVBX,6780HNEGBX程序段執(zhí)行后:BX=9880H,CF=1,ZF=0,OF=1,SF=1,PF=0,AF=0。NEG4、比較指令CMP(compare)CMP指令將目的操作數(shù)減去源操作數(shù),按照定義相應(yīng)設(shè)置狀態(tài)標志CMP指令執(zhí)行的功能與SUB指令,但結(jié)果不回送目的操作數(shù)CMPreg,imm/reg/mem

;reg-imm/reg/memCMPmem,imm/reg

;mem-imm/reg例題2.23CMP例2.23:比較AL與200CMPAX,200JGGREATER;大于則跳轉(zhuǎn)到GREATER,

ADDAX,100INCCXGREATER:……

執(zhí)行比較指令之后,可以根據(jù)標志判斷兩個數(shù)是否相等、大小關(guān)系等CMP5、乘法指令MULr8/m8;無符號字節(jié)乘法;AX←AL×r8/m8MULr16/m16;無符號字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符號字節(jié)乘法;AX←AL×r8/m8IMULr16/m16;有符號字乘法;DX.AX←AX×r16/m16例題2.24說明乘法指令的功能乘法指令分無符號和有符號乘法指令乘法指令的源操作數(shù)顯式給出,隱含使用另一個操作數(shù)AX和DX字節(jié)量相乘:AL與r8/m8相乘,得到16位的結(jié)果,存入AX字量相乘:AX與r16/m16相乘,得到32位的結(jié)果,其高字存入DX,低字存入AX乘法指令利用OF和CF判斷乘積的高一半是否具有有效數(shù)值乘法指令對標志的影響乘法指令如下影響OF和CF標志:MUL指令——若乘積的高一半(AH或DX)為0,則OF=CF=0;否則OF=CF=1IMUL指令——若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為1乘法指令對其他狀態(tài)標志沒有定義

對標志沒有定義:指令執(zhí)行后這些標志是任意的、不可預測(就是誰也不知道是0還是1)對標志沒有影響:指令執(zhí)行不改變標志狀態(tài)例2.24:乘法運算MOVAL,0B4HMOVBL,11HMULBL程序段執(zhí)行后:AX=0BF4H=3060D,BL=11H,CF=OF=1。MOVAL,0B4H;對于有符號數(shù)B4H,去二進制編碼高位,變反加1,為-76(-4CH)MOVBL,11HIMULBL程序段執(zhí)行后:AX=FAF4H=-1292,BL=11H,CF=OF=1。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ù)例題2.25說明除法指令的功能除法指令分無符號和有符號除法指令除法指令的除數(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é)果溢出除法錯中斷當被除數(shù)遠大于除數(shù)時,所得的商就有可能超出它所能表達的范圍。如果存放商的寄存器AL/AX不能表達,便產(chǎn)生溢出,8086CPU中就產(chǎn)生編號為0的內(nèi)部中斷——除法錯中斷對DIV指令,除

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論