匯編語言程序設(shè)計(jì)06整數(shù)運(yùn)算指與高級(jí)過程課件_第1頁
匯編語言程序設(shè)計(jì)06整數(shù)運(yùn)算指與高級(jí)過程課件_第2頁
匯編語言程序設(shè)計(jì)06整數(shù)運(yùn)算指與高級(jí)過程課件_第3頁
匯編語言程序設(shè)計(jì)06整數(shù)運(yùn)算指與高級(jí)過程課件_第4頁
匯編語言程序設(shè)計(jì)06整數(shù)運(yùn)算指與高級(jí)過程課件_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、_06_整數(shù)運(yùn)算指令與高級(jí)過程_2009年5月31日_ V1.1提問與回顧 第五章內(nèi)容中我們介紹并練習(xí)了外部鏈接庫(kù)中的一些常用過程 調(diào)用這些過程使用什么指令? 在邏輯運(yùn)算部分內(nèi)容中 AND指令用于進(jìn)行邏輯與運(yùn)算,但他在改變標(biāo)志位的同時(shí)也改變了目的操作數(shù),什么指令能夠?qū)崿F(xiàn)邏輯與運(yùn)算功能但只改變標(biāo)志位而不改變操作數(shù)? 同樣,哪條指令與SUB類似但只改變標(biāo)志位? 該條指令比較后,如相等則跳轉(zhuǎn),應(yīng)使用什么指令? 嘗試將下面的為指令轉(zhuǎn)化成為匯編代碼和決策偽指令匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明2if (bx cx) X=1; SHL(Shift Left),邏輯左移操作 最低位以0填充,最高

2、位傳送到CF中 SHR(Shift Right),邏輯右移操作 最高位以0填充,最低位傳送到CF中 左移和右移的意義:乘法和除法邏輯移位匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明3B7B6B5B4B3B2B1B00SHL/SHRreg,imm8mem,imm8reg,CLmem,CLB7B6B4B3B2B1B0CFB5moval, 0D0hAL = 1101 0000bCF0shral, 1AL = 0110 1000bCF = 1邏輯移位 課堂練習(xí)題目位串分離 如果需要從一個(gè)字或者字節(jié)中的特定區(qū)域提取一系列位,這些位稱為位串 例如文件的時(shí)間戳(文件最后訪問時(shí)間)的分離匯編語言程序設(shè)計(jì)匯編

3、語言程序設(shè)計(jì) - 朱明朱明40 0 1 0 0 1 1 00 1 1 0 1 0 1 0DHDLyearmonthdaymoval, dlandal, 01Fhmovday, almovax, dxshrax, 5andal, 0Fhmovmonth, almoval, dhshral, 1andah, 0haddax, 1980movyear, ax SAL(Shift Arithmetic Left),算術(shù)左移操作 最低位以0填充,最高位傳送到CF中,同SHL SAR(Shift Arithmetic Right),算術(shù)右移操作 最高位以自身填充,最低位傳送到CF中 右移的算術(shù)意義:有符號(hào)

4、數(shù)除法算術(shù)移位匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明5B7B6B5B4B3B2B1B00SAL/SARreg,imm8mem,imm8reg,CLmem,CLB7B6B4B3B2B1B0CFB5moval, -128AL = 1000 0000bCFsaral, 4AL = 1111 1000b ROL(Rotate Left),循環(huán)左移操作 最低位以最高位填充,最高位傳送到CF中 ROR(Rotate Right),循環(huán)右移操作 最高位以最低位填充,最低位傳送到CF中 循環(huán)移位不丟棄數(shù)據(jù) 可用來將特定的位移入CF中循環(huán)移位匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明6B7B6B5B

5、4B3B2B1B0ROL/RORreg,imm8mem,imm8reg,CLmem,CLB7B6B4B3B2B1B0CFB5CF SHLD(Shift Left Double),雙精度左移操作 目的操作數(shù)向左移指定位數(shù) 空位用源操作數(shù)的高位填充 源操作數(shù)不會(huì)有任何改變 SHRD(Shift Right Double) 目的操作數(shù)向右移指定位數(shù) 空位用源操作數(shù)的低位填充 源操作數(shù)不會(huì)有任何改變雙精度移位匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明71001SHLD/SHLRreg16,reg16,CL/imm8mem16,reg16, CL/imm8reg32,reg32,CL/imm8mem

6、32,reg32, CL/imm81011 1010 01101001 1011 1010 0110bxaxmovbx, 9BA6hmovax, 0AC36hshldbx, ax, 4乘法指令 MUL無符號(hào)數(shù)乘法指令 8位、16位或32位被乘數(shù)依次為AL、AX或EAX 對(duì)應(yīng)的乘數(shù)可以是尺寸相等的寄存器或內(nèi)存 對(duì)應(yīng)結(jié)果保存在AX、DX:AX、EDX:EAX中 CF標(biāo)值位的影響高半部分如果不為0則CF位置位匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明8MULreg/mem8reg/mem16reg/mem32moveax, 12345hmovebx, 10000hmulebxEDX:EAX =

7、0000 0001 2345 0000hCF = 1乘法指令 IMUL有符號(hào)數(shù)乘法指令I(lǐng)MUL有單操作數(shù)、雙操作數(shù)和三操作數(shù)三種格式 單操作數(shù)的情況與MUL相同 此時(shí)如果高半部分是結(jié)果的符號(hào)位擴(kuò)展則OF=0匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明9moval, 48movbl, 4imulblAX = 00C0hOF = 1IMULreg/mem8reg/mem16reg/mem32moval, -4movbl, 4imulblAX = FFF0hOF = 0movax, 48movbx, 4imulbxDX = 0000hAX = 00C0hOF = 0乘法指令 IMUL有符號(hào)數(shù)乘法指

8、令 IMUL有單操作數(shù)、雙操作數(shù)和三操作數(shù)三種格式 雙操作數(shù)的乘積存儲(chǔ)在第一個(gè)操作數(shù)中,但只能是寄存器,第二個(gè)操作數(shù)可以是寄存器、內(nèi)存操作數(shù)或者立即數(shù) 三操作數(shù)的乘積存儲(chǔ)在第一個(gè)操作數(shù)中,但只能是寄存器,第二操作數(shù)可以是寄存器或內(nèi)存,第三操作數(shù)是立即數(shù) 要特別注意運(yùn)算結(jié)果的尺寸問題:超出則CF和OF置位匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明10IMUL,雙操作數(shù)reg16, reg/mem16reg16, imm8/16reg32, reg/mem32reg32, imm8/32IMUL,三操作數(shù)reg16,reg/mem16,imm8reg16,reg/mem16,imm16reg3

9、2,reg/mem32,imm8reg32,reg/mem32,imm32乘法指令 關(guān)于MUL和IMUL乘法的問題 傳統(tǒng)意義上對(duì)于乘法運(yùn)算是能少用就盡量少用 乘法的執(zhí)行效率要低于移位操作的速度 理論上后一種方法的執(zhí)行效率要遠(yuǎn)高于前一種方法 但是對(duì)于某些處理器則可能有所不同 老式的體系結(jié)構(gòu)上,如Pentium4,比較會(huì)很明顯 在嵌入式系統(tǒng)上,比較同樣會(huì)很明顯 在Core以上的體系結(jié)構(gòu)上,比較結(jié)果不明顯匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明11movebx, eaxshleax, 5shlebx, 2addeax, ebxmovebx, 36mulebx除法指令 DIV無符號(hào)數(shù)除法指令匯編

10、語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明12DIVreg/mem8reg/mem16reg/mem32被除數(shù)除數(shù)商余數(shù)AXreg/mem8ALAHDX:AXreg/mem16AXDXEDX:EAXreg/mem32EAXEDXmovax, 83hmovbl, 2divblAL = 41hAH = 1movdx, 0movax, 8003movcx, 100divcxAX = 80DX = 3除法指令 IDIV有符號(hào)數(shù)除法指令 在進(jìn)行除法指令前,應(yīng)首先進(jìn)行符號(hào)位擴(kuò)展 符號(hào)位擴(kuò)展用于將AL、AX和EAX的符號(hào)分別擴(kuò)展至AH、DX和EDX中,以保證運(yùn)算結(jié)果的符號(hào)正確匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)

11、 - 朱明朱明13IDIVreg/mem8reg/mem16reg/mem32moval, -48cbwmovbl, 5idivblAL = -9AH = -3被除數(shù)除數(shù)商余數(shù)符號(hào)擴(kuò)展AXreg/mem8ALAHCWBDX:AXreg/mem16AXDXCWDEDX:EAXreg/mem32EAXEDXCDQ除法指令 除法的溢出問題(超出寄存器范圍) 除法的商過大導(dǎo)致目的操作數(shù)無法裝載 使用更大的寄存器可以減少溢出的問題匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明14DIV/IDIVreg/mem8reg/mem16reg/mem32movax, 1000hmovbl, 10hdivblAL

12、 = 100h?被除數(shù)除數(shù)商余數(shù)符號(hào)擴(kuò)展AXreg/mem8ALAHCWBDX:AXreg/mem16AXDXCWDEDX:EAXreg/mem32EAXEDXCDQ乘法和除法運(yùn)算 使用匯編語言完成以下算術(shù)運(yùn)算匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明15val4 = ( val1 + val2 ) *val3val4 = ( val1 *5 ) / ( val2 - 3 )val4 = ( val1 * (-5) / ( -val2 % 3 )moveax, val1addeax, val2mulval3jctooBigmovval4, eaxjmp;后面程序tooBig:;數(shù)據(jù)過大的處

13、理加法擴(kuò)展 如何實(shí)現(xiàn)兩個(gè)64位整數(shù)的加法運(yùn)算? 64位模式下的RAX 加法擴(kuò)展指令A(yù)DC ADC(Add with Carry)指令將源操作數(shù)、目的操作數(shù)以及進(jìn)位標(biāo)志位相加 0FFh + 0FFh = AL?可以保存? 0FFh + 0FFh = DL:AL匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明16ADCreg,regmem,regreg,memmem,immreg,immmoval, 0FFhaddal, 0FFhAL = FEh,CF = 1adcdl, 0DL = DL + 1加法擴(kuò)展 0FFFF FFFFh + 0FFFF FFFFh = EDX:EAX ADC指令在進(jìn)行加法運(yùn)

14、算時(shí),會(huì)將CF標(biāo)志位也作為一個(gè)加數(shù)參與加法運(yùn)算 通過加法擴(kuò)展指令實(shí)現(xiàn)64位的加法運(yùn)算? 結(jié)果保存在DWORD數(shù)組中匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明17movedx, 0moveax, 0FFFFFFFFhaddeax, 0FFFFFFFFhEAX = FFFF FFFEhCF = 1adcedx, 0EDX = 0000 0001hCF = 0加法擴(kuò)展 兩個(gè)64位數(shù)的定義 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)與階段運(yùn)算匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明18val1QWORD0A2B2 A406 7498 1234hval2QWORD08010 8700 0023 4502hsumDWO

15、RD3 DUP(?)34129874B2A20245230010+80val1ESIval2EDIL1:moveax, esiadceax, edipushfdmovebx, eaxaddesi, 4addedi, 4addebx, 4popfdloopL1adcebx, 0popadsumEBX+加法擴(kuò)展 兩個(gè)64位數(shù)的定義 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)與階段運(yùn)算匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明19val1QWORD0A2B2 A406 7498 1234hval2QWORD08010 8700 0023 4502hsumDWORD3 DUP(?)34129874B2A202452300

16、10+80val1ESIval2EDImainPROCmovesi, OFFSET val1movedi, OFFSET val2movebx, OFFSET summovecx, 2call;調(diào)用前面的過程movesi, OFFSET summovebx, 4movecx, 4callDumpMemssumEBX+減法擴(kuò)展 SBB指令從目的操作數(shù)中間去源操作數(shù)和進(jìn)位標(biāo)志位的值,其操作數(shù)與ADC相同 0000 0001 0000 0000h 1 = EAX:EDX 首先減去低32位,CF標(biāo)志位置位 然后高32位減去CF標(biāo)志位的值匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明20SBBreg,r

17、egmem,regreg,memmem,immreg,immmovedx, 0000 0001hmoveax, 0000 0000hsubeax, 0000 0001hsbbedx, 0EDX = 0000 0000hEAX = FFFF FFFFh局部變量 C語言中的局部變量匯編語言中的局部變量 局部變量在單個(gè)過程中創(chuàng)建、使用并銷毀 局部變量在堆棧上運(yùn)行,匯編時(shí)不確定初始值但是在運(yùn)行時(shí)進(jìn)行初始化 LOCAL偽指令 LOCAL偽指令定義的變量列表需要占用堆棧空間 要保證堆棧中有足夠的空間供局部變量使用匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明21LOCAL變量列表LOCAL標(biāo)號(hào):類型, 標(biāo)

18、號(hào):列表 , 標(biāo)號(hào):列表LOCALtemp:DWORD, Flags:BYTE局部變量 LOCAL偽指令定義的變量列表需要占用堆棧空間 需要為局部變量的保存準(zhǔn)備保留的堆??臻g 使用STACK偽指令定義4096字節(jié)的堆??臻g 過程的嵌套調(diào)用會(huì)造成局部變量數(shù)量的疊加 Sub1+Sub2的局部變量將占用800字節(jié)的堆棧空間匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明22.STACK4096Sub1 PROCLOCALarr150:DWORDSub2 PROCLOCALarr2150:DWORD局部變量與堆棧 堆棧與過程的調(diào)用(復(fù)習(xí)內(nèi)容) 堆棧在過程調(diào)用中用來保存返回地址和現(xiàn)場(chǎng)數(shù)據(jù)匯編語言程序設(shè)計(jì)匯

19、編語言程序設(shè)計(jì) - 朱明朱明23PA返回后地址PA返回后地址PB返回后地址PB返回后地址PA返回后地址PC返回后地址PB返回后地址PA返回后地址PB返回后地址PA返回后地址PA返回后地址PC返回后地址PB返回后地址PA返回后地址00000FF400000FF8000000A500000FFCESP 使用到了堆棧指針ESP ESP指向有效數(shù)據(jù),以恢復(fù)現(xiàn)場(chǎng)局部變量與堆棧* 但是有了一個(gè)問題局部變量也保存在堆棧上 這些變量也要占用堆??臻g,也需要一個(gè)指針 EBP(擴(kuò)展幀指針寄存器)與局部變量 子過程被調(diào)用,前一個(gè)過程的返回地址壓棧(ESP修改) 子過程開始,EBP也被壓棧(ESP修改) EBP的值設(shè)

20、定為ESP的值,EBP可以作為尋址子過程的基址指針而使用(EBP=ESP) 如果有局部變量,則ESP減去一個(gè)值,以便在堆棧上為局部變量保留空間(ESP修改) 如果任何寄存器需要保存,則壓入堆棧(ESP修改)匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明24局部變量與堆棧* 局部變量的空間開辟與EBP和ESP的關(guān)系部分內(nèi)容可以參考 ENTER指令 LEAVE指令 以上指令不作要求 *部分僅要求了解即可匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明25void MySub() int X = 10;int Y = 20;pushebpmovebp, espsubesp, 8movDWORD PTR

21、 ebp-4, 10movDWORD PTR ebp-8, 20movesp, ebppopebpret小地址Y,20X,10EBP返回地址大地址EBPEBP-4EBP-8ESP局部變量與存儲(chǔ)* 在了解局部變量與堆棧的關(guān)系后看LOCAL偽指令 ESP減掉4以便給雙字節(jié)的局部變量留出空間 BYTE依然占用4字節(jié)存儲(chǔ)空間匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明26Exam1PROCLOCALtemp:DWORDmoveax, tempretExam1ENDPpushebpmovebp, espsubesp, 4moveax, ebp-4movesp, ebppopebpret小地址tempE

22、BP返回地址大地址EBPEBP-4ESPExam2PROCLOCALtemp:BYTEmoval, tempretExam2ENDP小地址大地址NULLNULLNULLtempEBPEBPEBP-4ESPEBP-1遞歸 遞歸直接或者間接調(diào)用自身子過程 遞歸,必須要有一個(gè)終止條件 遞歸會(huì)涉及到過程的調(diào)用,至少要到用4字節(jié)的堆??臻g, 可能會(huì)占用處理器、占用內(nèi)存并導(dǎo)致堆棧溢出 思考一下下面問題的解決 采用遞歸的方法求從n的階乘 n! = n * (n-1) * (n-2) * * 3 * 2 * 1匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明27int factorial(int n) if (

23、n=0)return 1;elsereturn n*factorial(n-1);遞歸 要考慮的幾個(gè)問題(假設(shè)使用局部變量傳遞參數(shù)) 局部變量的傳遞(獲取前一次的n) if(n=0)的轉(zhuǎn)換(判斷遞歸結(jié)束) 遞歸的調(diào)用過程(L1標(biāo)號(hào))匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明28pushebpmovebp, espmoveax, (1)(1) ebp+8cmpeax, 0(2);eax0則遞歸moveax, 1jmpL2(2) ja L1(3);修改n值(4);堆棧傳遞參數(shù)callFactorial(3) dec eax(4) push eax遞歸 要考慮的幾個(gè)問題(假設(shè)使用局部變量傳遞參數(shù)

24、) 如何進(jìn)行乘法運(yùn)算(MUL指令)遞歸過程的返回(局部變量的刪除,L2) 增加過程的定義和結(jié)束的內(nèi)容匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明29movebx, ebp+8mulebx(5);恢復(fù)EBP的值ret4(5) pop ebpFactorial PROC.Factorial ENDP遞歸 n的階乘問題解決偽代碼 該問題的解決方法中,使用了堆棧傳遞參數(shù)的方法 注意程序執(zhí)行過程中堆棧的變化 使用上更簡(jiǎn)潔的參數(shù)傳遞方法?INVOKE匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明30mainPROCpush10;10的階乘call FactorialmainENDPENDmainFact

25、orial PROC;局部變量傳遞;對(duì)于n的值的判定;遞歸過程的調(diào)用;乘法運(yùn)算;遞歸過程的返回Factorial ENDPINVOKE與PROC INVOKE偽指令 調(diào)用一個(gè)名為AddTwo的過程,傳遞val1和val2參數(shù) PROC偽指令的改進(jìn)匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明31INVOKE過程名,參數(shù)列表立即數(shù)10h, 3000h, OFFSET arr1整數(shù)表達(dá)式(10*20)變量名arr1, val1地址表達(dá)式esi, arr1esi寄存器名eax, ebx, ecxADDR名ADDRarr1INVOKEAddTwo, val1, val2AddTwoPROC,val1:

26、 BYTE,val2: BYTEINVOKE與PROC 第一次作業(yè)的題目數(shù)組求和問題 將該程序結(jié)構(gòu)化為一個(gè)主過程和一個(gè)字過程 主過程負(fù)責(zé)調(diào)用子過程并保存運(yùn)算結(jié)果 子過程負(fù)責(zé)對(duì)數(shù)組各元素進(jìn)行加法運(yùn)算匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明32arr1 DWORD 111h, 222h, 333h, 444h, 555hESI保存有數(shù)組的首地址ECX保存數(shù)組的元素?cái)?shù)目調(diào)用數(shù)組加法運(yùn)算子過程EAX保存運(yùn)算結(jié)果獲取EAX中的運(yùn)算結(jié)果INVOKE與PROC第一次作業(yè)的題目數(shù)組求和問題匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) - 朱明朱明33moveax, 0L1:addeax, esiaddesi, 4loopL1核心數(shù)組加法運(yùn)算代碼ArraySumPROC,offArr: DWORDsizeArr: DWOR

溫馨提示

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