二進制課程高級匯編語言講解_第1頁
二進制課程高級匯編語言講解_第2頁
二進制課程高級匯編語言講解_第3頁
二進制課程高級匯編語言講解_第4頁
二進制課程高級匯編語言講解_第5頁
已閱讀5頁,還剩110頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

高級匯編語言講解GAOJIHUIBIANYUYANJIANGJIE河南賽客信息技術有限公司

目錄0102匯編語言概述數據的表示及類型030405匯編程序開發調試方法寄存器講解尋址方式講解06指令系統講解07子程序設計第一章匯編語言概述第一章匯編語言概述

機器指令是指CPU能直接識別并遵照執行的指令。機器指令一般有操作碼和操作數兩部分構成,操作碼在前,操作數在后。操作碼指出要進行的操作和運算,操作數指出參與操作或運算的對象。01:匯編語言的概念

機器語言是用二進制編碼的機器指令的集合及一組使用機器指令的規則。它是CPU能直接識別的唯一語言。只有用機器語言描述的程序,CPU才能直接執行。目標程序是指用機器語言描述的程序。第一章匯編語言概述01:匯編語言的概念示例:

將偏移2200H存儲單元中的數與偏移2201H存儲單元中的數相加,將它們的和送入偏移2202H存儲單元。完成這一操作的程序片段包含的三條機器指令為:缺點:

機器語言不能用人們熟悉的形式來描述計算機要執行的任務。編程復雜,調試困難。Intel808601:匯編語言的概念

匯編指令是用指令助記符、地址符號等符號表示的指令。第一章匯編語言概述01:匯編語言的概念

匯編語言是匯編指令、偽指令的集合及其表示、使用這些指令的一組規則。用匯編語言書寫的程序成為匯編語言源程序。優點:

使用匯編語言編寫的程序比用機器語言編寫的程序容易理解、調試和維護。第一章匯編語言概述匯編是指把匯編語言源程序翻譯成目標程序的過程。完成匯編任務的程序叫做匯編程序。

01:匯編語言的概念第一章匯編語言概述更底層:匯編語言源程序與高級語言源程序相比,其通用性和可移植性要差得多。由于匯編指令與機器有著密切的關系,所以可以通過匯編語言直接有效地控制機器。匯編指令是機器指令的符號表示,所以匯編指令與機器有著密切的關系,與機器所帶的CPU關系密切。不同種類的CPU對應不同的匯編語言。02:匯編語言的特點第一章匯編語言概述效率高:過程匯編語言主體的匯編指令是機器指令的符號表示,每一條匯編指令都有相對應的機器指令,編譯之后產生的冗余指令少。匯編語言程序能直接并充分利用機器硬件系統的許多特性。運行速度快目標程序短02:匯編語言的特點第一章匯編語言概述編程繁瑣:太過注重高效率而導致程序結構較差。每條匯編指令所能完成的操作極為有限。程序員使用匯編指令編寫程序時,必須考慮包括寄存器、存儲單元和尋址方式在內的幾乎所有細節問題。02:匯編語言的特點匯編語言是面向機器的語言,高級語言是面向過程或面向目標、對象的語言。第一章匯編語言概述與CPU類型密切相關02:匯編語言的特點通用性和可移植性差直接有效地實現控制運行速度快目標程序短面向對象不同指令功能有限需注意的細節太多第一章匯編語言概述03:匯編語言的使用時機優點缺點1、“時空”兩個方面最有效率的程序;2、可以最直接和最有效的操縱機器硬件系統。1、編程繁瑣;2、調試困難;3、可移植性差第一章匯編語言概述綜合考慮優缺點,合適的使用時機有:對軟件的執行時間或存儲容量有較高要求的場合。例如系統程序的關鍵核心;03:匯編語言的使用時機需要提高大型軟件性能的場合,通常把大型軟件中執行頻率高的子程序用匯編語言編寫;軟件與硬件關系密切,軟件要有直接和有效控制硬件的場合。第一章匯編語言概述綜合考慮優缺點,合適的使用時機有:對軟件的執行時間或存儲容量有較高要求的場合。例如系統程序的關鍵核心;03:匯編語言的使用時機需要提高大型軟件性能的場合,通常把大型軟件中執行頻率高的子程序用匯編語言編寫;軟件與硬件關系密切,軟件要有直接和有效控制硬件的場合。第一章匯編語言概述比如ShellCode,空間要求高面對的代碼內容是匯編指令04:匯編語言二進制逆向中的作用第一章匯編語言概述開發攻擊代碼調試分析程序第二章數據的表示及類型01:數據的表示

CPU是計算機的核心部件,控制整個計算機的運作,CPU正常工作必須提供指令和數據。指令和數據在存儲器中存放,CPU運行需要讀取內存中的數據,磁盤中的數據需要首先讀入內存再被CPU使用。第二章數據的表示及類型01:數據的表示指令和數據是應用上的概念。在內存或磁盤上,指令和數據沒有任何區別,都會二進制信息。計算機系統內部采用二進制表示數值數據,也采用二進制編碼表示非數值數據和指令。這也是很多漏洞產生的根本原因。第二章數據的表示及類型示例:

內存中的二進制信息1000100111011000,計算機可以把它看作大小為89D8H的數據來處理,也可以將其看作指令movax,bx來執行。01:數據的表示

x進制與十進制轉換的方式是從高位到低位,依次將每一位上的數乘以相應進制的冪次所得的結果。第二章數據的表示及類型示例:

十進制數123的二進制、十六進制換算方法。02:數據的類型計算機中存儲信息的最小單位稱為bit(比特),也就是一個二進制位,它有兩種狀態分別代表0和1。第二章數據的表示及類型

8個bit組成一個Byte,通常稱之為一個字節。微型機存儲器的存儲單元可以存儲一個Byte,也就是8個二進制位,存儲器的容量是以字節為最小單位來計算的。各單位之間的換算關系如下:1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB……02:數據的類型計算機中存儲信息的最小單位稱為bit(比特),也就是一個二進制位,它有兩種狀態分別代表0和1。第二章數據的表示及類型

8個bit組成一個Byte,通常稱之為一個字節。微型機存儲器的存儲單元可以存儲一個Byte,也就是8個二進制位,存儲器的容量是以字節為最小單位來計算的。各單位之間的換算關系如下:1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB……02:數據的類型計算機存取的以二進制位表示的信息位數一般是8的倍數,它們有專門的名稱。第二章數據的表示及類型字節:

一個字節由8個二進制位組成,最低位稱為第0位,最高位稱為第7位。一個字節可分為2個4位的位組,稱為半字節。02:數據的類型第二章數據的表示及類型字:2個字節(即16個二進制位)組成一個字,最低位稱為第0位,最高位稱為第15位。字的低8位稱為低字節,高8位稱為高字節。02:數據的類型第二章數據的表示及類型雙字:2個字(即32個二進制位)組成一個雙字,最低位稱為第0位,最高位稱為第31位。雙字的低16位稱為低字,高16位稱為高字。第三章匯編程序開發調試方法環境準備:編譯器masm鏈接器link調試器debug文本編輯器第三章匯編程序開發調試方法匯編代碼寫出到執行的過程:匯編語言編寫的源文件從寫出到執行主要包括三步:對源程序進行編譯鏈接執行可執行文件中的程序。編寫匯編源程序第三章匯編程序開發調試方法01:匯編代碼的開發示例:

給出一段簡單的匯編語言程序,利用寄存器完成簡單的加法操作后返回。第三章匯編程序開發調試方法02:匯編代碼的編譯命令:masm或者masm1;第三章匯編程序開發調試方法03:匯編代碼的鏈接命令:link或者link1;第三章匯編程序開發調試方法04:匯編代碼的調試命令:debug1.exe第三章匯編程序開發調試方法04:匯編代碼的調試命令:debug1.exe第三章匯編程序開發調試方法-d,查看內存中的內容-e,改寫內存中的內容-r,查看、改變寄存器內容-u,將內存中的機器指令翻譯成匯編指令-t,執行一條機器指令-p,執行int指令05:匯編程序從寫出到執行的全過程

前幾步完成了一個匯編程序從寫出到執行的全部過程,總共經歷了如下階段:第三章匯編程序開發調試方法第四章寄存器講解01:寄存器的分類

不同的CPU,寄存器的個數、結構是不相同的。8086CPU有14個寄存器,大致可以分為三類:第四章寄存器講解控制寄存器段寄存器通用寄存器

其中通用寄存器又可以分為數據寄存器、指針寄存器和變址寄存器。01:寄存器的分類第四章寄存器講解02:通用寄存器

數據寄存器、指針寄存器和變址寄存器統稱為通用寄存器。這些寄存器除了各自規定的專門用途外,均可用于傳送和暫存數據,可以保存算術邏輯運算中的操作數據和運算結果。第四章寄存器講解寄存器用途CX計數器SI串操作中的源指針DI串操作中的目的指針BP存取堆棧的指針SP堆棧指針03:段寄存器8086CPU依賴其內部的四個段寄存器實現尋址1M字節物理地址空間。8086把1M字節地址空間劃分為若干邏輯段,當前使用段的段值存放在段寄存器中。由段寄存器和段內偏移形成20位地址。第四章寄存器講解計算方法:物理地址=段值×16+偏移表示方法:段值:偏移03:段寄存器第四章寄存器講解示例:用16進制表示的邏輯地址1234:3456H所對應的存儲單元的物理地址為15796H。03:段寄存器第四章寄存器講解

8086CPU有四個段寄存器,可保存4個段值,所以可同時使用四個段,但這四個段有所分工。04:標志寄存器第四章寄存器講解

8086CPU中有一個16位的標志寄存器,包含了9個標志,主要用于反映處理器的狀態和運算結果的某些特征。

9個標志寄存器可以分為兩組,第一組6個標志寄存器主要受加減運算和邏輯運算結果的影響,稱為運算結果標志,第二組標志不受運算結果的影響,稱為狀態控制標志。標志類別寄存器運算結果標志OF、SF、ZF、AF、PF、CF狀態控制標志DF、IF、TF04:標志寄存器第四章寄存器講解第五章尋址方式講解01:尋址方式的分類

表示指令中操作數所在的方法稱為尋址方式。8086共有七種尋址方式:第五章尋址方式講解立即尋址寄存器尋址

直接尋址寄存器間接尋址寄存器相對尋址基址加變址尋址相對基址加變址尋址02:立即尋址方式

立即尋址方式是指操作數就包含在指令中,它作為指令的一部分,跟在操作碼后存放在代碼段。這種操作數稱為立即數。第五章尋址方式講解

立即數可以是8位也可以是16位。如果是16位,那么按照“高高低低”原則存放,即高位字節在高地址存儲單元,低位字節在低地址存儲單元。

立即尋址方式主要用于給寄存器或存儲單元賦初值的場合。02:立即尋址方式第五章尋址方式講解示例:指令“MOVAX,1234H”源操作數采用立即尋址方式,其存儲和執行情況如下所示:大端模式和小端模式小端模式:第五章尋址方式講解

低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。大端模式:

高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。大端模式和小端模式小端模式:第五章尋址方式講解低地址----------------->高地址大端模式:示例:數字0x12345678在內存中的表示形式。0x78|0x56|0x34|0x12低地址----------------->高地址0x12|0x34|0x56|0x78大端模式和小端模式小端模式:第五章尋址方式講解大端模式:強制轉換數據不需要調整字節內容,1、2、4字節的存儲方式一樣。典型的使用小端存儲的CPU有Intelx86和ARM。符號位的判定固定為第一個字節,容易判斷正負。典型的使用大端存儲的CPU有PowerPC和MIPSUNIX。03:寄存器尋址方式寄存器尋址方式是指操作數在CPU內部的寄存器中,指令中指定寄存器號。如立即尋址方式示例中指令“MOVAX,1234H”目的操作數采用寄存器尋址。第五章尋址方式講解

寄存器尋址中16位操作數的寄存器可以有AX、BX、CX、DX、SI、DI、SP和BP等;對于8位操作數,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。

由于操作數在寄存器中,不需要通過訪問存儲器來取得操作數,所以采用這種尋址方式的指令執行速度較快。04:直接尋址方式直接尋址方式是指操作數在存儲器中,指令直接包含有操作數的有效地址。第五章尋址方式講解操作數一般存放在數據段,所以操作數的地址由DS加上指令中直接給出的16位偏移得到。

直接尋址方式用于處理單個存儲器變量的情況。它可以實現在64K字節的段內尋找操作數。直接尋址的操作數通常是程序使用的變量。第五章尋址方式講解示例:指令“MOVAX,[1234H]”(DS為5000H)源操作數采用直接尋址方式,其存儲和執行情況如下所示:04:直接尋址方式05:寄存器間接尋址方式寄存器間接尋址方式是指操作數據在存儲器中,操作數有效地址在SI、DI、BX、BP這四個寄存器之一中。第五章尋址方式講解如果有效地址在SI、DI和BX中,則以DS段寄存器的內容為段值;如果有效地址在BP中,則以SS段寄存器的內容為段值。

注意與寄存器尋址方式的區別,例如指令“MOV[SI],AX”和“MOVSI,AX”的區別。第五章尋址方式講解示例:指令“MOVAX,[SI]”(DS為5000H,SI為1234H)源操作數采用寄存器間接尋址方式,其存儲和執行情況如下所示:05:寄存器間接尋址方式06:寄存器相對尋址方式寄存器相對尋址方式是指操作數在存儲器中,操作數的有效地址是一個基址寄存器(BX、BP)或變址寄存器(SI、DI)內容加上指令中給定的8位或16位位移量之和。第五章尋址方式講解第五章尋址方式講解示例:指令“MOVAX,[DIH]”(DS為5000H,DI為3678H)源操作數采用寄存器相對尋址方式,其存儲和執行情況如下所示:06:寄存器相對尋址方式07:基址加變址尋址方式基址加變址尋址方式是指操作數在存儲器中,操作數的有效地址由基址寄存器之一的內容與變址寄存器之一的內容相加得到。第五章尋址方式講解第五章尋址方式講解示例:指令“MOVAX,[BX+DI]”(DS為5000H,BX為1223H,DI為54H)源操作數采用基址加變址尋址方式,其存儲和執行情況如下所示:07:基址加變址尋址方式08:相對基址加變址尋址方式相對基址加變址尋址方式是指操作數在存儲器中,操作數的有效地址由基址寄存器之一的內容與變址寄存器之一的內容及指令中給定的8位或者16位位移量相加得到。第五章尋址方式講解第五章尋址方式講解示例:指令“MOVAX,[BX+DI-2]”(DS為5000H,BX為1223H,DI為54H)源操作數采用相對基址加變址尋址方式,其存儲和執行情況如下所示:08:相對基址加變址尋址方式第六章指令系統講解01:指令系統的分類8086的指令系統可分為六個功能組:第六章指令系統講解數據傳遞算術運算

邏輯運算串操作程序控制處理器控制02:數據傳遞指令格式:MOVDST,SRC第六章指令系統講解使用情形:(1)CPU內部寄存器之間的數據傳遞;(2)立即數送至通用寄存器或者存儲單元;(3)寄存器與存儲器之間的數據傳遞。02:數據傳遞指令格式:XCHGOPRD1,OPRD2第六章指令系統講解此指令把操作數OPRD1與OPRD2的內容交換,操作數同時是字節或字。例如XCHGAL,AH。格式:LEAREG,OPRD此指令把操作數OPRD的有效地址傳遞到操作數REG。操作數OPRD必須是一個存儲器操作數,操作數REG必須是一個16位的通用寄存器。例如LEASI,[BX+3]。03:棧操作指令第六章指令系統講解棧是一段RAM區域。稱為棧底的一端地址較大,稱為棧頂的一端地址較小。棧的段值在棧段寄存器SS中,棧指針寄存器SP始終指向棧頂。棧操作始終遵循“后進先出”的原則。所有數據的存入和取出都在棧頂進行。棧主要用途:

現場和返回地址的保護寄存器內容的保護傳遞參數存儲局部變量格式:PUSHSRC第六章指令系統講解此指令把源操作數SRC壓入堆棧。它先把堆棧指針寄存器SP的值減2,然后把源操作數SRC送入由SP所指的棧頂。例如指令“PUSHAX”(AX為8A9BH)。03:棧操作指令格式:POPDST第六章指令系統講解03:棧操作指令此指令從棧頂彈出一個字數據到目的操作數DST。它先把堆棧指針寄存器SP所指的字數據送至目的操作數DST,然后SP值加2,使其仍指向棧頂。例如指令“POPAX”

。格式:ADDOPRD1,OPRD2第六章指令系統講解04:加減乘除運算指令此指令完成兩個操作數相加,結果送至目的操作數OPRD1。例如ADDAL,5。格式:INCOPRD此指令完成對操作數OPRD加1,然后把結果送回OPRD。例如INCAL。格式:SUBOPRD1,OPRD2第六章指令系統講解04:加減乘除運算指令此指令完成兩個操作數相減,從OPRD1減去OPRD2,結果送到目的操作數OPRD1中,例如SUBAH,12。格式:DECOPRD此指令完成對操作數OPRD減1,然后把結果送回OPRD。例如DECAL。格式:CMPOPRD1,OPRD2第六章指令系統講解04:加減乘除運算指令

比較指令完成操作數OPRD1減去操作數OPRD2,運算結果不送到OPRD1,但影響標志CF、ZF、SF、OF、AF和PF。比較指令主要用于比較兩個數的關系,是否相等,誰大誰小。示例:判斷ZF是否置位,比較兩數是否相等無符號數,根據CF判斷大小有符號數,根據SF和OF判斷大小第六章指令系統講解標志位標志位名稱及外語全稱=1=0CF進位標志/CarryFlagCY/Carry/進位NC/NoCarry/無進位PF奇偶標志/ParityFlagPE/ParityEven/偶PO/ParityOdd/奇AF輔助進位標志/AuxiliaryCarryFlagAC/AuxiliaryCarry/進位NA/NoAuxiliaryCarry/無進位ZF零標志/ZeroFlagZR/Zero/等于零NZ/NotZero/不等于零SF符號標志/SignFlagNG/Negative/負PL/Positive/非負OF溢出標志/OverflowFlagOV/Overflow/溢出NV/NotOverflow/未溢出格式:MULOPRD第六章指令系統講解04:加減乘除運算指令

無符號數乘法指令完成操作數OPRD與AL或AX的無符號乘法操作,如果OPRD為字節操作數,則將結果保存至AX;如果OPRD為字操作數,則將結果保存至DX和AX對中,DX含高16位,AX含低16位。格式:IMULOPRD

有符號數乘法指令完成操作數OPRD與AL或AX的有符號數乘法操作。如果有效進位至高半部分,則標志CF和OF置1,否則置0。格式:DIVOPRD第六章指令系統講解04:加減乘除運算指令

無符號數除法指令完成AX或(DX,AX)除以操作數OPRD的無符號除法操作。如果OPRD是字節操作數,8位商保存至AL,8位余數保存至AH;如果OPRD是字操作數,16位商保存至AX,余數保存至DX。格式:IDIVOPRD

有符號數除法指令完成的操作與DIV完全類似。當除數為0時,引發0號中斷。格式:CBW第六章指令系統講解04:加減乘除運算指令

字節轉換為字指令完成把寄存器AL中的符號擴展到寄存器AH中。即若AL的最高有效位為0,則AH=0;若AL的最高有效位為1,則AH=0FFH。格式:CWD

字轉換為雙字指令完成把寄存器AX中的符號擴展到寄存器DX。CBW和CWD主要用于有符號數消除時產生字或雙字長度的被除數,指令不影響標志位。格式:NOTOPRD第六章指令系統講解05:邏輯運算和移位指令

否操作指令把操作數OPRD取反,然后送回OPRD。指令對標志位沒有影響。格式:ANDOPRD1,OPRD2

與操作指令把兩個操作數進行按位的邏輯“與”運算,結果送到目的操作數OPRD1。主要用在使一個操作數中的若干位維持不變,而另外若干位清為0的場合。格式:OROPRD1,OPRD2第六章指令系統講解05:邏輯運算和移位指令

或操作指令把兩個操作數進行按位的邏輯“或”運算,結果送到目的操作數OPRD1。主要用在使一個操作數中的若干位維持不變,而另外若干位置1的場合。格式:XOROPRD1,OPRD2

異或操作指令把兩個操作數進行按位的邏輯“異或”運算,結果送到目的操作數OPRD1。操作數可以自己和自己異或實現清0操作,也用于若干位維持不變,而另外若干位取反的場合。格式:TESTOPRD1,OPRD2第六章指令系統講解05:邏輯運算和移位指令

測試指令把與AND指令類似,也把兩個操作進行按位“與”操作,但結果不送到操作數OPRD1,僅僅影響標志。常用于檢測某些位是否為1但又不改變原操作數的的情況。示例:

檢查AL中的第6位和第2位是否有一位包含1,可使用指令“TESTAL,01000100B”,如果AL的位6和位2均為0,則指令執行后ZF被置1,否則ZF被置0。第六章指令系統講解05:邏輯運算和移位指令移位指令:SALOPRD,mSHLOPRD,mSAROPRD,mSHROPRD,m第六章指令系統講解05:邏輯運算和移位指令循環指令:ROLOPRD,mROROPRD,mRCLOPRD,mRCROPRD,m第六章指令系統講解06:轉移指令8086提供了大量用于控制程序流程的指令,按照功能可分為以下四類:無條件轉移指令和條件轉移指令循環指令過程調用和過程返回指令軟中斷指令和中斷返回指令第六章指令系統講解06:轉移指令

由于程度代碼可分為多個段,所以根據轉移時是否重置代碼段寄存器CS的內容,指令又可以分為段內轉移和段間轉移。第六章指令系統講解06:轉移指令格式:JMP標號

無條件段內直接轉移指令使控制無條件地轉移到標號處。示例:

使用JMP跳轉指令使程序轉至NEXT處。第六章指令系統講解06:轉移指令格式:JMPOPRD

無條件段內間接轉移指令使控制無條件地轉移到由操作數OPRD的內容給定的目標地址處。示例:

使用JMP跳轉指令使程序轉至字存儲單元[1234H]=5678H處。第六章指令系統講解06:轉移指令格式:JMPFARPTR標號

無條件段間直接轉移指令使控制無條件地轉移到標號所對應的地址處。對比無條件段內直接轉移指令的機器指令格式:第六章指令系統講解06:轉移指令格式:JMPOPRD

無條件段間間接轉移指令使控制無條件地轉移到由操作數OPRD的內容給定的目標地址處。操作數OPRD必須是雙字存儲單元。示例:

使用JMP跳轉指令使程序轉至字存儲單元[1234H]所存儲的地址處。第六章指令系統講解06:轉移指令

條件轉移指令根據某標志位或某些標志位的邏輯運算來判別條件是否成立。如果條件成立則轉移,否則繼續順序執行。通常在條件轉移指令前,總有用于條件判別的有關指令,例如CMP和TEST。示例:

測試AX的低四位是否全是0,如果均是0,使CX=0;否則使CX=1。第六章指令系統講解06:轉移指令有符號數間的次序關系稱為大于(G)、等于(E)和小于(L),無符號數間的次序關系稱為高于(A)、等于(E)和低于(B)。有符號數和無符號數的相等均可以使用ZF標志來反映。無符號數大小看CF,有符號數大小看SF和OF。指令格式轉移條件轉移說明其他說明JZ標號JE標號ZF=1ZF=1等于0轉移或者,相等轉移單個標志JNZ標號JNE標號ZF=0ZF=0不等于0轉移或者,不相等轉移單個標志JL標號JNGE標號(SF異或OF)=1(SF異或OF)=1小于轉移或者,不大于等于轉移兩個標志有符號數JBE標號JNA標號(CF或ZF)=1(CF或ZF)=1低于等于轉移或者,不高于轉移兩個標志無符號數第六章指令系統講解06:轉移指令利用條件轉移指令和無條件轉移指令可以實現循環,但為了方便實現,8086還提供了四條指令用于實現循環。LOOP標號LOOPE/LOOPZ標號LOOPNE/LOOPNZ標號JCXZ標號循環指令和條件轉移指令類似,屬于段內轉移且采用相對轉移的方式,及使用地址差的方式實現轉移。循環指令不影響標志位。第六章指令系統講解06:轉移指令格式:LOOP標號

計數循環指令使寄存器CX的值減1,如果結果不等于0,則轉移到標號,否則順序執行LOOP后的指令。示例:

從偏移1000H開始的512個字節的數據復制到從偏移3000H開始的緩沖區中。第六章指令系統講解06:轉移指令格式:LOOPE/LOOPZ標號等于/全零循環指令使寄存器CX的值減1,如果結果不等于0并且ZF等于1,則轉移到標號,否則順序執行LOOP后的指令。示例:

在字符串中查找第一個非’A’字符。DS:DI指向字符串,如果找到,BX指向該字符,否則BX=0FFFFH。第六章指令系統講解06:轉移指令格式:LOOPNE/LOOPNZ標號不等于/非零循環指令使寄存器CX的值減1,如果結果不等于0并且ZF等于0,則轉移到標號,否則順序執行LOOP后的指令。示例:

在字符串中查找第一個’A’字符。DS:DI指向字符串,如果找到,BX指向該字符,否則BX=0FFFFH。第六章指令系統講解06:轉移指令格式:JCXZ標號跳轉指令實現當寄存器CX的值等于0時跳轉到標號,否則順序執行。示例:

在循環開始之前可以使用JCXZ指令,以便在循環次數為0時,跳過循環體。第七章子程序設計

如果某個程序片段將反復在程序中出現,就把它設計成子程序。第七章子程序設計01:子程序設計概要優點:縮短程序長度,節約存儲空間實現共享,便于實現模塊化重復使用,減輕工作量

Call和ret都是轉移指令,它們都修改IP,或同時修改CS和IP,經常被用來實現子程序的設計。第七章子程序設計02:子程序設計方法

CPU執行Call指令主要進行兩步操作。將當前的IP或CS和IP壓入棧中轉移至子程序

CPU執行ret指令主要進行兩步操作。使用棧數據修改IP或CS和IP的內容恢復棧結構依據轉移目的地址的不同和獲取轉移目的地址的不同,Call指令存在四種調用模式。

02:子程序設計方法第七章子程序設計依據轉移目的地址的不同及是否帶立即數返回,ret指令存在四種執行模式。02:子程序設計方法第七章子程序設計

Call和ret指令共同支持了匯編語言編程中的模塊化設計,模塊化設計可以實現多個相互聯系、功能獨立的子程序來解決復雜問題。使用CALL和RET進行子程序設計面臨以下幾個問題:第七章子程序設計03:模塊化程序設計需要解決的幾個問題參數和結果傳遞問題批量數據傳遞問題寄存器沖突問題第七章子程序設計Q1:參數和結果傳遞問題示例:

根據提供的N值計算N的3次方。第七章子程序設計Q2:批量數據傳遞問題示例:

將一個全是字母的字符串轉化為大寫。第七章子程序設計Q3:寄存器沖突問題示例:

將多個字符串中所有字母轉化成大寫。8086CPU在執行完當前正在執行的指令之后,檢測到從CPU外部發送過來的或內部產生的一種特殊信息,并且可以立即對所接收到的信息進行處理。這種特殊信息我們稱其為中斷信息。中斷的意思是指CPU不再

溫馨提示

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

評論

0/150

提交評論