Win32匯編語言-尋址方式.ppt
《Win32匯編語言-尋址方式.ppt》由會員分享,可在線閱讀,更多相關(guān)《Win32匯編語言-尋址方式.ppt(59頁珍藏版)》請在裝配圖網(wǎng)上搜索。
2020 2 29 1 宋軍計算機學(xué)院信息安全系songjun 尋址方式 2 2020 2 29 尋址方式 操作數(shù)的尋址方式立即數(shù)尋址寄存器尋址存儲器尋址直接尋址間接尋址相對尋址 3 2020 2 29 立即數(shù)尋址 操作數(shù)在指令中給出指令格式 MOVAL 5MOVAX 3064HMOVAL A 只能用于SRC字段MOV40H AL SRC和DST的字長一致MOVAH 3064H 4 2020 2 29 寄存器尋址 操作數(shù)存放在CPU的內(nèi)部寄存器reg中 8位寄存器r8 AH AL BH BL CH CL DH DL16位寄存器r16 AX BX CX DX SI DI BP SP32位寄存器r32 EAX EBX ECX EDX ESI EDI ESP EBP4個段寄存器seg中 CS DS SS ES指令格式 MOVAX BXMOVAL BHMOVAX 3064HSRC和DST的字長一致MOVAH BX 5 2020 2 29 存儲器尋址 直接尋址 尋址主存中存儲的操作數(shù)就稱為存儲器尋址方式 也稱為內(nèi)存尋址方式 指令中給出的是有關(guān)操作數(shù)的主存地址信息指令中主存操作數(shù)給出的地址只是偏移地址 稱有效地址EA 實模式下 段基地址在默認的段寄存器中或用段超越前綴指定的段寄存器中 6 2020 2 29 有效地址的組成 位移量 存放在指令中的8位 16位或32位的數(shù)值或常量基址 存放在基址寄存器中的內(nèi)容 它是有效地址中的基址部分 變址 是存放在變址寄存器中的內(nèi)容比例因子 可以是1 2 4 8比例因子只適用于保護模式 7 2020 2 29 16位存儲器尋址有效地址 16位有效地址 基址寄存器 變址寄存器 8 16位位移量 其中 基址寄存器只能是BX或BP變址寄存器只能是SI或DI位移量可以是8 16位數(shù)當(dāng)基址寄存器為BP的時候 默認的堆棧段寄存器SS 其他情況下 默認數(shù)據(jù)段寄存器DS 8 2020 2 29 32位存儲器尋址有效地址 其中 位移量是8 16 32數(shù)值或者常量任何32位通用寄存器都可以作為基址寄存器 默認ESP EBP使用SS 其他默認使用DS 任何除ESP之外的32位通用寄存器都可以作為變址寄存器 32位有效地址 基址寄存器 變址寄存器 8 16 32位位移量 9 2020 2 29 直接尋址方式 例 MOVAX 2000H EA 2000H 假設(shè) DS 3000H 那么PA 32000H 隱含的段為數(shù)據(jù)段DS 10 2020 2 29 直接尋址方式 可使用段跨越前綴MOVAX ES 2000H 操作數(shù)地址可由變量 符號地址 表示 但要注意VALUEDB10變量的屬性MOVAH VALUE 等價于MOVAH VALUE 可用符號地址代替數(shù)值地址MOVAX VALUE MOVAX WORDPTRVALUE 操作數(shù)尺寸要一致 11 2020 2 29 間接尋址 間接操作數(shù) 操作數(shù)的有效地址存放在寄存器中方括號括起來的寄存器 如 BX SS EBX 保護模式 32位通用寄存器實地址 16位 SI DI BX BP寄存器里存放著數(shù)據(jù)的偏移地址用作間接操作數(shù)的寄存器使用時應(yīng)先初始化 datavar1BYTE10h 20h 30h codeMOVesi offsetvar1MOVal esi 如在附加段中 MOVal ES esi 12 2020 2 29 尺寸問題 PTR 與間接操作數(shù)的聯(lián)合使用PTR操作符指明操作數(shù)的大小 datavar1BYTE10h 20h 30h codeMOVesi offsetvar1INC esi operandmusthavesize datavar1BYTE10h 20h 30h codeMOVesi offsetvar1INCBYTEPTR esi 13 2020 2 29 數(shù)組求和 386 modelflat stdcall dataW1WORD1234h 5678h 4321h 8765h codemovesi offsetW1movax esi 1234haddesi 2addax esi 1234h 5678haddesi 2addax esi 1234h 5678h 4321haddesi 2addax esi 1234h 5678h 4321h 8765h 14 2020 2 29 例 寄存器間接尋址方式 386 modelflat stdcall datad vardword12345678h codestart movesi offsetd varmoveax esi moveax esimoveax offsetc varmoveax cs eax ret 返回操作系統(tǒng)c vardword87654321hendstart 匯編結(jié)束 15 2020 2 29 例 運行結(jié)果 1 16 2020 2 29 例 運行結(jié)果 2 17 2020 2 29 寄存器相對尋址方式 采用寄存器間接尋址的操作數(shù)的有效地址是寄存器內(nèi)容與有符號8位 16位或32位位移量之和操作數(shù)的有效地址的計算公式是 位移量可以是正數(shù) 也可以是負數(shù) 有效地址 寄存器 8 16 32位位移量 18 2020 2 29 例 寄存器相對尋址方式 386 modelflat stdcall dataarraybyte1 2 3 4 5 6 7array endequ 1 codestart movesi offsetarraymoval esi moval esi 4 movesi array endmoval esi 4 ret 返回操作系統(tǒng)endstart 匯編結(jié)束 19 2020 2 29 19 2020 2 29 例 movesi offsetarray 直接尋址 array的地址 20 2020 2 29 20 2020 2 29 例 moval esi 寄存器間接尋址 esi 00404000 地址00404000的內(nèi)容 21 2020 2 29 21 2020 2 29 例 moval esi 4 寄存器相對尋址esi 4 00404004 esi 00404000 00404004 05h 22 2020 2 29 22 2020 2 29 例 movesi array end 直接尋址 array endequ 1 00404007 array end 00404007 1 00404006 23 2020 2 29 23 2020 2 29 例 moval esi 4 寄存器相對尋址esi 4 00404002 00404002 03h esi 00404006 24 2020 2 29 基址變址尋址方式 基址變址尋址方式的操作數(shù)的有效地址是基址寄存器的內(nèi)容加上變址寄存器內(nèi)容構(gòu)成操作數(shù)的有效地址的計算公式是 有效地址 基址寄存器 變址寄存器 25 2020 2 29 例 基址變址尋址方式 386 modelflat stdcall dataarray1byte1 2 3 4 5 6 7array2byte8 9 10 11 12 13 14array endequ 1 codestart movebx offsetarray1movesi 1moval ebx esi 也可以寫成moval ebx esi movebx offsetarray2moval ebx esi ret 返回操作系統(tǒng)endstart 匯編結(jié)束 26 2020 2 29 26 2020 2 29 例 movebx offsetarray1 直接尋址 array1的地址 27 2020 2 29 27 2020 2 29 例 movesi 1 28 2020 2 29 28 2020 2 29 例 moval ebx esi 基址變址尋址esi ebx 00404001 00404001 02h 29 2020 2 29 29 2020 2 29 例 movebx offsetarray2 直接尋址 array2的地址 30 2020 2 29 30 2020 2 29 例 moval ebx esi 基址變址尋址esi ebx 00404008 00404008 09h 31 2020 2 29 相對基址變址尋址方式 相對基址變址尋址方式的操作數(shù)有效地址是基址寄存器的內(nèi)容加上變址寄存器內(nèi)容再加上一個8位 16位或32位的位移量構(gòu)成操作數(shù)的有效地址的計算公式是 有效地址 基址寄存器 變址寄存器 8 16 32位位移量 32 2020 2 29 例 相對基址變址尋址 386 modelflat stdcall dataarraybyte1 2 3 4 5 6 7byte8 9 10 11 12 13 14byte15 16 17 18 19 20 21numcolsequ7nequ2 codestart movebx numcolsmovesi 1moval array ebx esi ret 返回操作系統(tǒng)endstart 匯編結(jié)束 33 2020 2 29 例 movebx numcols 34 2020 2 29 例 moval array ebx esi 基址變址尋址00404000 7 1 00404008 00404008 09h array的地址 35 2020 2 29 比例因子尋址方式 僅用于32位應(yīng)用程序操作數(shù)的有效地址是由變址寄存器的內(nèi)容乘以比例因子再加上位移量和基址寄存器的內(nèi)容構(gòu)成計算公式為 比例因子尋址方式中可以沒有基址寄存器和位移量 比例數(shù)只能是1 2 4 8這四種取值之一 有效地址 基址寄存器 變址寄存器 比例因子 位移量 36 2020 2 29 例 比例因子尋址方式 386 modelflat stdcall dataarrayword1 2 3 4 5 6 7word8 9 10 11 12 13 14word15 16 17 18 19 20 21rowequ7 2nequ2 codestart movebx rowmovesi 1movax array ebx esi 2 也可以寫成movax array ebx esi 2 ret 返回操作系統(tǒng)endstart 匯編結(jié)束 37 2020 2 29 例 movebx row 38 2020 2 29 例 movesi 1 39 2020 2 29 movax array ebx esi 2 比例因子尋址00404000 14 1 2 00404010 00404010 09h array的地址 40 2020 2 29 操作數(shù)尋址方式的組合 操作數(shù)尋址方式在指令中并不是任意組合的 是有一定規(guī)律的大多數(shù)指令 常用的數(shù)據(jù)傳送 加減運算 邏輯運算等指令 都支持如下組合 源操作數(shù)可以由立即數(shù) 寄存器或存儲器尋址 目的操作數(shù)只能是寄存器或存儲器尋址 兩個操作數(shù)不能同時為存儲器尋址方式 指令助記符reg imm reg mem指令助記符mem imm reg 41 2020 2 29 練習(xí) 假定實模式下 DS 2000H ES 2100H SS 1500H SI 00A0H BX 0100H BP 0010H 數(shù)據(jù)段中變量名VAL的偏移地址為0050H 試指出下列源操作數(shù)字段的尋址方式是什么 其物理地址值是多少 1 MOVAX 0ABH 2 MOVAX BX 3 MOVAX 100H 4 MOVAX VAL 5 MOVAX BX 6 MOVAX ES BX 7 MOVAX BP 8 MOVAX SI 9 MOVAX BX 10 10 MOVAX VAL BX 11 MOVAX BX SI 12 MOVAX VAL BX SI 42 2020 2 29 轉(zhuǎn)移地址尋址方式 匯編程序的執(zhí)行順序是由代碼段寄存器CS和指令指針EIP的內(nèi)容決定的 程序轉(zhuǎn)移指令通過改變EIP和CS的內(nèi)容 就可以改變程序的正常執(zhí)行順序 JMP 43 2020 2 29 JMP指令 JMP指令是無條件轉(zhuǎn)移指令 其格式為 JMP指令中的操作數(shù)label是要轉(zhuǎn)移到的目標地址 也稱為目的地址 轉(zhuǎn)移地址 JMPlabel 程序轉(zhuǎn)向label標號指定的地址 44 2020 2 29 轉(zhuǎn)移地址尋址 直接尋址轉(zhuǎn)移地址直接包含在指令的機器代碼中就是直接尋址方式 間接尋址轉(zhuǎn)移地址如果存放在寄存器或主存單元中 就是間接尋址方式 用寄存器或存儲器操作數(shù)表達 用標號表達 45 2020 2 29 轉(zhuǎn)移距離 段內(nèi)轉(zhuǎn)移指在當(dāng)前代碼段范圍內(nèi)轉(zhuǎn)移 因此不需要更改CS段地址 只要改變EIP偏移地址 段間轉(zhuǎn)移指從當(dāng)前代碼段跳轉(zhuǎn)到另一個代碼段 此時需要更改CS段地址和EIP偏移地址 46 2020 2 29 轉(zhuǎn)移地址的尋址方式 段內(nèi)直接尋址段內(nèi)間接尋址段間直接尋址段間間接尋址 47 2020 2 29 段內(nèi)直接尋址 指令中直接寫出目標地址的標號 而在對應(yīng)的機器碼中 包含位移量的補碼形式 位移量 緊接著JMP指令后的那條指令的偏移地址到目標指令的偏移地址的地址位移 當(dāng)向地址增大方向轉(zhuǎn)移時 位移量為正 向地址減小方向轉(zhuǎn)移時 位移量為負 48 2020 2 29 相對轉(zhuǎn)移 段內(nèi)直接尋址也叫作相對轉(zhuǎn)移相對轉(zhuǎn)移目的地址的計算公式為 目的地址 當(dāng)前EIP 位移量 8bit 16bit 32bit 近轉(zhuǎn)移 位移量為8位段轉(zhuǎn)移 位移量為32位 49 2020 2 29 例 段內(nèi)直接尋址 386 modelflat stdcall codestart moveax 0jmpstartquit ret 返回操作系統(tǒng)endstart 匯編結(jié)束 50 2020 2 29 50 2020 2 29 調(diào)試例 51 2020 2 29 51 2020 2 29 調(diào)試例 位移量F9 00401010 00401017 52 2020 2 29 52 2020 2 29 調(diào)試例 53 2020 2 29 短轉(zhuǎn)移和近轉(zhuǎn)移 匯編程序能夠根據(jù)位移量大小自動形成短轉(zhuǎn)移或近轉(zhuǎn)移指令 也可以用shortptr和nearptr操作符 強制產(chǎn)生相應(yīng)的指令格式 54 2020 2 29 54 2020 2 29 強制近轉(zhuǎn)移 nearptr強制產(chǎn)生近轉(zhuǎn)移 位移量FFFFFFF8 00401010 0040101A 55 2020 2 29 段內(nèi)間接尋址 將同一代碼段內(nèi)的目標地址存放在一個32位寄存器中或雙字存儲器單元中 用寄存器或存儲器來間接尋址轉(zhuǎn)移地址 轉(zhuǎn)移地址 寄存器或存儲器內(nèi)容 56 2020 2 29 例 段內(nèi)間接尋址 386 modelflat stdcall dataaddressdwordquit codestart jmpaddressquit ret 返回操作系統(tǒng)endstart 匯編結(jié)束 57 2020 2 29 調(diào)試例 58 2020 2 29 寄存器間接尋址內(nèi)存 轉(zhuǎn)移地址也可以存放在寄存器中 moveax offsetquitjmpeax 59 2020 2 29 本章小結(jié) 操作數(shù) 直接 直接偏移 間接 變址數(shù)據(jù)傳送指令MOV MOVZX MOVSX XCHG算術(shù)運算指令I(lǐng)NC DEC ADD DEC NEGMUL IMUL DIV IDIV狀態(tài)標志 CF OF ZF SF- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Win32 匯編語言 尋址 方式
鏈接地址:http://appdesigncorp.com/p-6567489.html