滴水逆向培訓(xùn)基礎(chǔ)教程_第1頁(yè)
滴水逆向培訓(xùn)基礎(chǔ)教程_第2頁(yè)
滴水逆向培訓(xùn)基礎(chǔ)教程_第3頁(yè)
滴水逆向培訓(xùn)基礎(chǔ)教程_第4頁(yè)
滴水逆向培訓(xùn)基礎(chǔ)教程_第5頁(yè)
已閱讀5頁(yè),還剩240頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

前2008年滴水公司成立之日起,我們就著一個(gè)非常嚴(yán)峻的現(xiàn)實(shí),巨大的工作量無人1首先介紹一下滴水逆向培訓(xùn)的主講老師-唐老師。2000年畢業(yè)于西北一所不知名的大學(xué),貿(mào)易經(jīng)濟(jì)專業(yè)畢業(yè)—似乎資深的程序員大多非計(jì)算機(jī)專業(yè)出身。有著10年以上的編程經(jīng)VT調(diào)試器的開發(fā)者,成功逆向虛擬機(jī)VMWare、加殼軟件Themida和VMProtect,并即將完讓無法參加實(shí)地培訓(xùn)又渴望學(xué)習(xí)的人一起我們的經(jīng)驗(yàn)。貌,本采用+章節(jié)體的風(fēng)格編輯整理而成。先引述唐老師的講課內(nèi)容,然后再添加于編寫的時(shí)間過于倉(cāng)促,本身可能存在諸多錯(cuò)誤,希望讀者多多批評(píng)指正,在后下堅(jiān)實(shí)的基礎(chǔ)。培養(yǎng)獨(dú)立的能力。你初中數(shù)學(xué)優(yōu)異基本就可以證明具備一定的邏輯思維能力了。二是有;是最好的老肯用功;即使你的智商超過也不能確保你一定成績(jī)優(yōu)異,天才+勤奮才是成功的秘有有育已本識(shí)體的求本沒有以打《滴水逆向培訓(xùn)基礎(chǔ)》參考,更為詳盡前 第一章進(jìn) 引言 數(shù)據(jù)進(jìn) 本節(jié)主要內(nèi)容 老唐 課后疑問 課后總結(jié) 課后練習(xí) 進(jìn)制運(yùn) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 十六進(jìn)制與數(shù)據(jù)寬 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 邏輯運(yùn) 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 第二章寄存器與匯編指 引 通用寄存 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 內(nèi) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 匯編指 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) EFLAGS寄存 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 第3章C語(yǔ) 引 C的匯編表 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 函 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 內(nèi)存結(jié) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 條件執(zhí) 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 移位指 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 表達(dá) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) if語(yǔ) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 循環(huán)語(yǔ) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 變 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 數(shù) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 結(jié)構(gòu) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) switch語(yǔ) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) define與 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 指 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 結(jié)構(gòu)體指 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 第四章硬編 引 定長(zhǎng)編 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后練習(xí) 不確定長(zhǎng)度編 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 其他指令編 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 課后練習(xí) 第五章保護(hù)模 引 段寄存器結(jié)構(gòu) 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 段寄存器結(jié)構(gòu) 本節(jié)主要內(nèi)容 老唐 課后理解 課后疑問 課后總結(jié) 段寄存器結(jié)構(gòu) 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 段權(quán) 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 調(diào)用 本節(jié)主要內(nèi)容 老唐課后理解 課后總結(jié) 課后練習(xí) 其他門描述 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 關(guān)鍵 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 2-9-9-12分 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 控制寄存 本節(jié)主要內(nèi)容 老唐 課后理解 課后總結(jié) 課后練習(xí) 第六章PE(略 第七章C++(略 第八章操作系統(tǒng)(略 開始學(xué)習(xí)本之前,請(qǐng)您務(wù)必先仔細(xì)閱讀《前言》,將會(huì)對(duì)您接下來的學(xué)習(xí)有所幫助第一引言我們?yōu)槭裁匆獙W(xué)習(xí)進(jìn)了,只留下十進(jìn)制,這一章主要是帶我們了解各種進(jìn)制,找回應(yīng)有的。本章必須要掌握的知識(shí)本章常犯的錯(cuò)誤數(shù)據(jù)進(jìn)本節(jié)主要老唐現(xiàn)在請(qǐng)一個(gè)同學(xué)上來寫出10進(jìn)制的0-0235689say:101個(gè)數(shù)say十進(jìn)制從0100十進(jìn)制是由、、、、、、、、、十個(gè)符號(hào)組成,逢十進(jìn)一。0,最大是8,進(jìn)一。練習(xí)用九進(jìn)制寫出十進(jìn)制的101個(gè)元素0123456710101112131415161710110310410610711111311411611706,逢七進(jìn)一。用七進(jìn)制寫出十進(jìn)制的101個(gè)元素02356160160161162163164165200201XA也行,共十一個(gè)符號(hào)組成,最小是0X(A),逢十一進(jìn)一。練習(xí):用十一進(jìn)制寫出十進(jìn)制的101個(gè)元素0235689A練習(xí)用三進(jìn)制寫出十進(jìn)制的101個(gè)元素0110112021220220221比如:2+24各種進(jìn)制如表1-表1-1:1-11進(jìn)制表123456789進(jìn)制其實(shí)是N種符號(hào)組成的課后疑問課后總結(jié)進(jìn)制是由元素組成的,N進(jìn)制就是有N個(gè)元素組成,逢N課后練習(xí)在紙上用1到16進(jìn)制分別描述100寫一到十六進(jìn)制,0-0到16進(jìn)制,每個(gè)進(jìn)制寫100個(gè)數(shù)進(jìn)制運(yùn)本節(jié)主要老唐NN進(jìn)制都會(huì),唯獨(dú)不會(huì)練習(xí)那現(xiàn)在我們給N進(jìn)制下個(gè)定義:N進(jìn)制就是由0、1、2、3、4……N-1共N個(gè)符號(hào)組成,逢N進(jìn)一練習(xí)小劉say:“后面咋整?”say:“隨便?!眘ay:“是啊。”其實(shí)我們學(xué)到0,1,2,3,4,5,6,7,8,9是人的符號(hào)。零,一,二,三練習(xí)用二進(jìn)制從零寫到十進(jìn)制的100010100110練習(xí)765-練習(xí)練習(xí)1*1=1*1=2*1=12*1=23*1=33*2=122*1=23*1=33*2=114*1=44*2=134*3=222*1=23*1=33*2=104*1=44*2=124*3=205*1=55*2=145*3=235*4=321*2=21*3=32*3=61*4=42*4=113*4=151*5=52*5=133*5=214*5=261*6=62*6=153*6=244*6=335*6=422*1=23*1=33*2=64*1=44*2=84*3=135*1=55*2=115*3=165*4=226*1=66*2=136*3=206*4=266*5=337*1=77*2=157*3=237*4=317*5=387*6=468*1=88*2=178*3=268*4=358*5=448*6=538*7=622*1=23*1=33*2=64*1=44*2=84*3=105*1=55*2=a5*3=135*4=186*1=66*2=106*3=166*4=206*5=267*1=77*2=127*3=197*4=247*5=2b7*6=368*1=88*2=148*3=208*4=288*5=348*6=408*7=489*1=99*2=169*3=239*4=309*5=399*6=469*7=539*8=60a*1=aa*2=18a*3=26a*4=34a*5=42a*6=50a*7=5aa*8=68a*9=76b*1=bb*2=1ab*3=29b*4=38b*5=47b*6=56b*7=65b*8=74b*9=83b*a=92b*b=101課后理解say:我們可以通過十進(jìn)制的乘法,從中摸索出規(guī)律我們把七進(jìn)制的乘法表寫出來=1=2=1*2的基礎(chǔ)上加2=?在2*2的基礎(chǔ)上加這樣,乘法演變成加法。所以很快得出七進(jìn)制的乘法表=1=2=4=3=63*3==4=113*4===5=133*5==265*5=6=153*6==335*66*6=課后疑問111-111=有的人說等于0。那么,如果我使用0作為一進(jìn)制的符號(hào)00+000=000-00=000000其實(shí)我們不用糾結(jié)于算數(shù)的結(jié)果,111-111空,這個(gè)空可以用其他符號(hào)代替,只要不課后總結(jié)任何一種進(jìn)制,他自身就是一個(gè)完美的體系結(jié)構(gòu),可以直接加減乘課后練習(xí)對(duì)照9*9乘法表,建立6*6乘法表將16進(jìn)制的元素用2進(jìn)制的元素下把16進(jìn)制的元素和二進(jìn)制對(duì)比,發(fā)現(xiàn)其中的十六進(jìn)制與數(shù)據(jù)寬本節(jié)主要老唐長(zhǎng)。32位,已經(jīng)很大了,4個(gè)G。我們說人類特別喜歡用十進(jìn)制去寫。比如256,使用二進(jìn) B,B來表最多只有八種,那我們用A,B,C,D,E,F,G,H,去表示。010在這是C是吧。111是H是吧,010C,101F010C,CFCHC。那好了,我們也可以同理,我們照樣1000,1001,1010,1011,1100,1101,1111,I,J,K,L,M,N,O。不需要排順序是L,1010是K,0010是C,CKCK。導(dǎo)致多位多位的書寫。整體變得很短了。問題就是個(gè)符號(hào)。三位三位書寫八個(gè)符號(hào)。四位四位書寫16個(gè)符號(hào)。五位五位書寫32個(gè)符號(hào)。A00。這兩種書寫形式表示的含義是一樣的。上面是書寫形式,下面是本質(zhì)形式。當(dāng)然你也可以一位一位的書寫,我用A表示0,B表示1,就是BBABBAAA……這也是二進(jìn)制的書寫形式。你可以另外定義兩個(gè)符號(hào),未必要用用原來的01。另定義兩個(gè)符號(hào)用AB兩個(gè)符號(hào)。也可以兩位兩位的書寫,用ABCD來表示。或者是三位三位的書寫。其實(shí)很簡(jiǎn)單。就是因?yàn)樵谌澜鐢?shù)字的符號(hào)最簡(jiǎn)單,我們就不應(yīng)該用ABCD這個(gè)11位,22334455位書寫呢,了。所以要大于三位三位的書寫。因?yàn)槲覀儾灰速M(fèi)這個(gè)符號(hào)。就使用四位四位的書寫,才能保證把人的符號(hào)全部用上。那四位的書寫,少了幾個(gè)符號(hào),那用誰(shuí)的符號(hào)補(bǔ)上去。畢竟英國(guó)人沒有古人聰明,我們補(bǔ)太多的符號(hào),不便于,所以使用四位四二進(jìn)制從0000寫到1111然后改成16個(gè)符號(hào)如果按照這種新的書寫方式,那發(fā)現(xiàn)如果要進(jìn)位的話,要滿16才進(jìn)位。中國(guó)古代就015,下面加上150,15。這就是最早的計(jì)算機(jī)。有的銀行現(xiàn)在仍然使這里為了書寫方便我們只寫8個(gè)位-1=0--例:從0,寫到-50。說明:見圖1-1:圖1-1:計(jì)算機(jī)寬課后理解在數(shù)算中,數(shù)值的大?。磳挾龋┦菦]有限制的,比如進(jìn)行運(yùn)算.比如給定的一個(gè)數(shù)0xABC,如果規(guī)定它的寬度為32位(32通常是二進(jìn)制的32位,那么該數(shù)值的有效值為0x56789ABC.如果運(yùn)算結(jié)果超過其寬例:設(shè)給定的數(shù)值寬度為8(二進(jìn)制則可以表示的最大值為0xFF(B。此時(shí),0x81+0x8010000001B10000000B=100000001(B)00000001圖1-2:計(jì)算機(jī)數(shù)值寬如上圖所示,字節(jié)(Byte)占8位二進(jìn)制寬度;字(Word)占據(jù)16位二進(jìn)制寬度符號(hào)類型時(shí),最作為符號(hào)位,最為1,表示負(fù)數(shù),反之為正數(shù),見圖1-3:有符號(hào)數(shù)值大小,見表1-2:表1-2:有符號(hào)80x80(-0x7F(27-0x8000(-0x7FFF(215-課后疑問課后總結(jié)計(jì)算機(jī)是定寬的課后練習(xí)2,4,16進(jìn)制,每進(jìn)制最大32位,寫出8邏輯運(yùn)本節(jié)主要VC++6.0老唐比如111111111111邏輯運(yùn)算中只有錯(cuò)與對(duì),成與敗兩個(gè)結(jié)果(也就是0和1。1+1=1(1+1=2不等于0,就是0-1-0-1-電路如圖1-1-4:OR運(yùn)算與等效與運(yùn)算電路如圖1-5:1-5:AND運(yùn)算與等效異或運(yùn)算電路如圖1-6:1-6:XOR運(yùn)算與等效與運(yùn)算:比如一個(gè)家庭,只有丈夫和妻子都有能力,才能有孩子。File->new,彈出下面窗口,點(diǎn)擊Win32ConsoleApplication,然后在Projectname框中填入工程名,例如“ oWorld”,點(diǎn)擊OK,如圖1-7:圖1-7:新建工程在圖1-8中選擇第三項(xiàng):“A’ o,world’application”,然后點(diǎn)擊1-8:win32Comsole圖1-9:寄存器窗movecx,0x124}課后理解say:或運(yùn)算(|)只要有一個(gè)是1,就是1,其它為異或運(yùn)算(^)同的為0,不同的為1say:課后疑問課后總結(jié)二進(jìn)制實(shí)現(xiàn)了邏輯運(yùn)算和算術(shù)運(yùn)算的統(tǒng)課后練習(xí)1.2、4、6進(jìn)制,每個(gè)進(jìn)制寫32位。0-2.10個(gè)寄存器,背熟順第二章寄存器與匯編指引想要了解計(jì)算機(jī),首先要了解的便是cpu,cpu是計(jì)算機(jī)最的部件,因?yàn)橛?jì)算機(jī)的所有指令都是由cpu處理,而cpu的部件之一是寄存器。這一章我們就來認(rèn)識(shí)一下寄本章必須要掌握的知識(shí)8、16、32位通用寄存溢出標(biāo)志位(OF)的理pop與push指令的理通用寄存本節(jié)主要8/16/32位通用寄存老唐主要記住這8個(gè)寄存器:mov指令可以任意移動(dòng)這8個(gè)寄存比如:addeax,ecx還可以是一個(gè)數(shù),只要保證是32位即可。 個(gè)寄存器是分段的。比如算盤,我們可以只用一半,或者四eax可以分成四部分:eax0-31,其0-7位叫AL,8-15位叫做AH0-位又稱為AX。AL:low;AH:high。ecx,edx,ebx也是一樣的,如圖2-1ESP,EBP,ESI,EDI,這四個(gè)寄存器只分成兩段,比如ESP整體0-31位稱為ESP,0-15位稱為SP。通過以上,我們可以看出,32位的寄存器8個(gè):EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI,每個(gè)寄存器都有一個(gè)編號(hào):0號(hào),1號(hào),2號(hào),3號(hào)……還有16位的寄存器:表2-1:寄存器編編號(hào)(二進(jìn)制編號(hào)(十進(jìn)制321680123456732位寄存器有自己的編號(hào),16位寄存器也有屬于自己的獨(dú)立的編號(hào)。當(dāng)然,他們疊的,當(dāng)改變了32位的寄存器,相應(yīng)的16位寄存器也會(huì)跟同樣,也有8位的寄存器,第0號(hào)AL,第1號(hào),CL,DL,BL,AH,CH,DH,BH。順序不能亂。當(dāng)然還有兩個(gè)寄存器:EIPEFLAGS(又稱為EFL,89號(hào)寄存器,EIP16位,叫做IP。EFL16FL。這兩個(gè)寄存器使用相對(duì)較少。練習(xí)而不可以是XORAL,BX。后面的寄存器可以改成立即數(shù)。課后理解cpu常用的寄存器。In手冊(cè)給出了通用寄存器的功能:通用目的寄通用寄存器結(jié)構(gòu)見圖2-圖2-2:通用寄存器結(jié)早期的技術(shù)還沒有現(xiàn)在成熟時(shí),8個(gè)通用寄存器寬度是8位(這里指的是二進(jìn)制的8位:AL,AH,CL,CH,DL,DH,BL,BH。后來cpu技術(shù)逐漸發(fā)展,由8位發(fā)展成16位,于是寄存器由8位演變成16位:AX,CX,DX,BX,SP,BP,SI,DI。但是為了兼容前面的8位技術(shù),將之前的8個(gè)8位寄存器封裝到AX,CX,DX,BX寄存器中。技術(shù)發(fā)展的步不會(huì)停歇的,之后將16位寄存器都擴(kuò)充了一倍,于是32位寄存器出現(xiàn)了,當(dāng)然這里截至32位,64位和128位寄存器留給大家思考32位通用目的寄存器的指定用途如·EAX:累加器·ECX:計(jì)數(shù)·EDX:I/O·EBX:DS段的數(shù)據(jù)指·ESP:堆棧(Stack)指·EBP:SS段的數(shù)據(jù)指·ESI:字符串操作的源(Source)指針;SS段的數(shù)據(jù)指·EDI:字符串操作的目標(biāo)(Destination)指針 段的數(shù)據(jù)指課后疑問回答:cpu具有判斷指令長(zhǎng)度和預(yù)處理指令的功回答:其實(shí)我也想,可是In 課后總結(jié)匯編就是在“寄存器與寄存器”或者“寄存器與內(nèi)存”之間來回移動(dòng)數(shù)課后練習(xí)32,16,8movaddANDsuborxornot內(nèi)本節(jié)主要寄存器,老唐的只做了8個(gè):EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。內(nèi)存速度慢,很便宜,所以數(shù)量位的。這也是我們現(xiàn)在的計(jì)算機(jī)叫32位計(jì)算機(jī)的主要原因。如果按寄存器的寬度是位的話,是不對(duì)的,因?yàn)檫€有很多寄存器是大于32位的。我們通用的8個(gè)是32位的內(nèi)存地址是固定的32位。以前的計(jì)算機(jī)之所以稱為16位計(jì)算機(jī),就是因?yàn)樗膬?nèi)存單編號(hào)是16我們學(xué)過的指令MOV,能操作寄存器和內(nèi)存office等一些大型軟件。,SUB(,XOR(,OR(,AND(其 ADD……這些也是移動(dòng)指令:把源加上目標(biāo)然后移動(dòng)到目標(biāo)操作數(shù)里面去有byte是一個(gè)字節(jié),dword是節(jié)。其實(shí)[]里面不但可以寫具體的一個(gè)數(shù),還可以寫某一個(gè)寄存器的第一個(gè)寄存器叫做BASE寄存器(8個(gè)寄存器都可以第二個(gè)寄存器是INDEX也是82次方,23次方,后面再加一個(gè)數(shù)(DISP。 eax,ds:[0x401000+8*eax+eax];這個(gè)可以執(zhí)行嗎cpu實(shí)現(xiàn)了將地址賦給LEA指令把方括號(hào)里面內(nèi)存的編號(hào)給目標(biāo)寄存器:loadeffectiveaddress。當(dāng)一個(gè)值不好確定寬度時(shí),使用dwordptrwordptr,byteptr,源可以是表明干什么。復(fù)雜的指令也是由簡(jiǎn)單的指令組合而成。課后理解之一,寬度為8位。見圖2-3:圖2-3:內(nèi)存格如圖2-3,為了區(qū)別內(nèi)存和cpu內(nèi)部的寄存器,內(nèi)存中的寄存器打上“[]”,專業(yè)術(shù)語(yǔ)稱之為“地圖中的內(nèi)存大小從0到0xFFFFffff,也就是說有0xFFFFffff個(gè)內(nèi)存寄存器存在,內(nèi)存地址從0-0xFFFFffff。注:此處0xFFFFffff寫法為何不十六進(jìn)制不區(qū)分大小寫,這樣寫是為了便于識(shí)別,我們可以很清楚的看出有8個(gè)F。內(nèi)當(dāng)用戶運(yùn)行程序時(shí),cpu需要不停地去從區(qū)取代碼和數(shù)據(jù),這樣非常耗時(shí),于是將32位數(shù) 存入內(nèi)存中的0x12FFB8地址處說明:我們從圖2-4可以看出:數(shù)值的在內(nèi)存地址中的圖2-4:內(nèi)存方內(nèi)存地址的表示方法有哪些·位移 ·比例因子(ScaleFactor)1,2,4下列五種地址模式為常用組合(圖2-3··(·(索引×比例因子)圖2-5:偏移(有效地址)計(jì)算極有可能的原因是(猜測(cè)u的技術(shù)員們只好訂個(gè)規(guī)矩:只能使用五種表示方法,否則一律不識(shí)別。練習(xí)1.[0x234791]//vc6不支持注:reg表示通用寄存器課后疑問如果算出的內(nèi)存地址結(jié)果超過32位會(huì)怎樣回答:如果結(jié)果超過32位溢出,則計(jì)算機(jī)只取32課后總結(jié)內(nèi)存的通用格式:reg+reg*數(shù)+立即課后練習(xí)練習(xí)復(fù)雜地址表達(dá)形式的操作如lea[eax匯編指本節(jié)主要匯編語(yǔ)言的基礎(chǔ)指令(push、pop、老唐mov[esp],eax使用vc6調(diào)試觀察內(nèi)存的變化moveax,[esp]練習(xí)VC6gotodisassmbly,一步一步運(yùn)行,并觀察eip變化。其實(shí)eip一直在變化。在80x86CPU中,eip寄存器指向的是將要執(zhí)行代碼的位置, moveax,0xxchgeax,eax又稱為nop。盤的人在哪里,在內(nèi)存中的哪個(gè)位置)。eip是寄存器,所以他的值可以被改變。每個(gè)地方都可以取個(gè),如:lab:movmovecx,offset既然匯編指令就是在寄存器和內(nèi)存間移動(dòng)指令,那么我們可以使用mov來修改eip:moveip,寄存器/立即數(shù)簡(jiǎn)寫為(取別名jmp寄存器/立即數(shù)pushoffsetlabmoveip,eaxlab:...calllearetIW,比如ret0x4課后理解·PUSH:壓入堆棧,見圖2-圖2-6:PUSH指令圖subesp,4·POP:彈出堆圖2-7:POP指令圖然后堆棧加節(jié)。POPeax可以簡(jiǎn)化成:addesp,4;課后疑問POPESP是否也可以簡(jiǎn)化為指令方式?說明:如果按上述的則寫成addesp,4;可以看出,第一條匯編指令中得到的esp值被第二條指令修改,所以直接將esp帶入是錯(cuò)誤的。因?yàn)閜opeax又可以等價(jià)于:addadd課后總結(jié)操作和運(yùn)算本身也是代碼,并存在于內(nèi)存中課后練習(xí)以下代碼在紙上抄寫10遍(目的抄會(huì)PUSHDWORDDS:[ESP-PTR POPERX 做各種測(cè)試;單步執(zhí)行語(yǔ)句,查看寄存器和內(nèi)存的變化,且寫出規(guī)EFLAGS寄存本節(jié)主要熟知標(biāo)志寄存器的各種運(yùn)算對(duì)于CF,PF,AF,ZF,SF這些標(biāo)志位的影老唐下面我們開始講標(biāo)志寄存器EFLAGS,如圖2-圖2-8:標(biāo)志寄存兩個(gè)數(shù)相加,如果最向進(jìn)位,結(jié)果忽略這個(gè)位,那么這個(gè)位要放到CF里面減法運(yùn)算,如果最向借位,則CF位為1位暫時(shí)放在標(biāo)志寄存器里面的一個(gè)位CF,以后有待查證,減法同理。CFeflag里面第0位。運(yùn)算的寬度可以自定義:可以是8位,16位也可以是CF如果本身是零,運(yùn)算后無進(jìn)位,則CF還是零,其實(shí)CF被改了,只是結(jié)果沒有變第一位沒有使用,是1看結(jié)果(這里指二進(jìn)制,parityflag,EFLAG中的第二位。AF位:看低四位加減是否有進(jìn)/借位,AF置1。沒有進(jìn)/借位也會(huì)改AF(置SF位,最是多少,就置多少,是最的品,沒有其他含義,如果是8位運(yùn)7位,1615位,3231位(0位開始。 位:最相同,看次是否向最進(jìn)位,最不同,無溢出 :最的進(jìn)位與次的進(jìn)位異或movdwordptr[EDI],dwordptr[ESImovsdmovwordptr[EDI],wordptr[ESI]movswmovbyteptr[EDI],byteptr[ESI]movsb練習(xí)movedi,0x427c20movesi,0x427c48EFLAG里面有一個(gè)DF位,movsb/w/d每移動(dòng)一次數(shù)據(jù),都要對(duì)ESIEDI進(jìn)行加1/2/4,或減1/2/4,到底是加還是減,看DF位,當(dāng)DF1時(shí),是減,當(dāng)DF0的時(shí)所以我們使用std(setDF)DF1,cld(clearDF)DF0,觀察指令DF影響的其他指令有課后理解標(biāo)志寄存器(EFLAGS)又稱為程序狀態(tài)和控制寄存器(ProgramStatusandControlRegister,主要用于記錄當(dāng)前的程序狀態(tài)。(CF例:定義數(shù)值寬度為32位,則0xFFFFffff+2在運(yùn)算過程中出現(xiàn)進(jìn)位PF例:運(yùn)算結(jié)果0x4567中1的個(gè)數(shù)8個(gè)1,PF=1。(ZF(SF(IF(DF從高地址到低地址置1(STD和CLD指令設(shè)置和清除該標(biāo)志位。始還是從高地址開始,置1表示由高到低,置0則反之?!ひ绯鰳?biāo)志(OF):運(yùn)算結(jié)果溢出置1。區(qū)別于進(jìn)位標(biāo)志(在運(yùn)算過程中。在這里要用 匯編語(yǔ)言程序設(shè)計(jì)中的一段話:CPU是如何檢測(cè)溢出的:在加法和減法運(yùn)算完后 使用一種非常有趣的方法確定溢出標(biāo)志的值運(yùn)算結(jié)果最高有效位向的進(jìn)位(CF)與到最高有效位的進(jìn)位值異或,其結(jié)果放到溢出標(biāo)志位例如8位二進(jìn)制數(shù) 無進(jìn)位,但第7位向有進(jìn)位值(CF=1。如圖2-9:1XOR0=1of=1。課后疑問課后總結(jié)標(biāo)志寄存器主要是記錄當(dāng)前的程序課后練習(xí)3C引在了解了匯編語(yǔ)言后,我們開始學(xué)習(xí)C語(yǔ)言,雖然兩者看上去沒什么關(guān)系,但是所有編譯器都是先將高級(jí)語(yǔ)言(包括C)轉(zhuǎn)換成匯編,再由匯編轉(zhuǎn)換成二進(jìn)制。而且匯編語(yǔ)言語(yǔ)法簡(jiǎn)單,可以解釋所有C語(yǔ)言中的語(yǔ)法。有人可能疑惑:既然匯編語(yǔ)言語(yǔ)法簡(jiǎn)單,為什么可移植性差。以往我們學(xué)習(xí)C語(yǔ)言總是和匯編扯不上半毛錢關(guān)系,這樣理解的錯(cuò)特錯(cuò),接下來我們通過匯編來揭開C語(yǔ)言神秘的面紗。本章必須要掌握的知識(shí)匯編與C本章常犯的錯(cuò)誤C的匯編表本節(jié)主要匯編與C老唐declspec(naked)intabc(inta,int{popedipopesipopebx}intr;在r=abc(2,3);處下斷點(diǎn)然后按F5,再按F11單步觀察指令運(yùn)行比如3-表3-1:內(nèi)存地址書寫2>現(xiàn)在修改declspec(nakedintabc(inta,intb)里面的內(nèi)容如下:pushebxpushesipushmovmovecx,[esp+0x14]addeax,ecx然后單步調(diào)試并觀察變化。為什么最終打印的結(jié)果是5,并將修改的內(nèi)存畫在紙上。3>修改declspec(nakedintabc(inta,intb)大括號(hào)里面的內(nèi)容如下:pushebpsubesp,4pushebxpushesipushedimoveax,[ebp+8]mov[ebp-4],eaxpopedipopesipoppopebp修 abc(2,3)為其他整數(shù)比如,abc(10,2),觀察結(jié)果變化4>修改declspec(nakedintabc(inta,intb)大括號(hào)里面的內(nèi)容如下:pushebpmovebp,esppushebxpushesipushedimovecx,0x11leaedi,[esp+0xc]repstosdmoveax,[ebp+8]mov[ebp-4],eaxpopedipopesipopmovesp,ebppopebpintabc(inta,intb,intb,intc寫在一行和寫在三行是一回事。*/{return}a=2;變量(內(nèi)存單元所以說,給每一個(gè)算盤取一個(gè)名字,比如:inta,intb,intc,intr,無論你取什么名字,都會(huì)分配給你節(jié)的內(nèi)存,然后在這個(gè)算盤上賦值,賦值很簡(jiǎn)單。我們稱a=2;變量(內(nèi)存單元不需要看C,看匯編如何顯示課后理解其中數(shù)據(jù)類型即數(shù)據(jù)寬度 語(yǔ)言定義了以下幾種數(shù)據(jù)類型int:32位char:8位注 語(yǔ)言除了十六進(jìn)制數(shù)外,其他語(yǔ)句都區(qū)分大小寫,這一點(diǎn)區(qū)別于匯編我們現(xiàn)在用實(shí)例來說明一個(gè)完整的C程序使用VC6打開并創(chuàng)建一個(gè)控制臺(tái)的 #include<stdio.h>intmain(void)/*程序{num=1;/*賦值語(yǔ)句:num值為1*/ return0;/*返回*/}1〉首先我們要了解的是函數(shù),即我們的程序從哪里開始運(yùn)行:main函數(shù)。注意一個(gè)新名詞:函數(shù)。函數(shù)的英文名是function,它的原意是功能、作用,所以“main函數(shù)”2〉那我們第一條執(zhí)行的指令是:intnum;申明語(yǔ)句,該條語(yǔ)句給了我們?nèi)龡l信息:該變量名字是num;寬度是32位;C語(yǔ)言的每一條語(yǔ)句后都要以”;”結(jié)尾。3〉第二條語(yǔ)句:num=1;給該變量賦1。既然num是變量,那么它的值可以再次被4〉使用(專業(yè)術(shù)語(yǔ)是調(diào)用)一個(gè)printf函數(shù),printf譯為打印,所以我們可以說調(diào)課后疑問declspec(naked)代表什回答:代表函數(shù),不要編譯器幫我們構(gòu)造函數(shù)框架,用戶自己構(gòu)造課后總結(jié)申明變量(比inta)就是給內(nèi)存取名課后練習(xí)函本節(jié)主要C語(yǔ)言函數(shù)的定老唐intabc(inte,intf,intc,inta,int1個(gè)),取個(gè)名字,作為標(biāo)識(shí)符,可以取一排變量,用逗號(hào)隔開,最后沒有//然后大括{inty;returnx+y+a;}因?yàn)檫@個(gè)導(dǎo)致產(chǎn)生一個(gè)CALL。然后在調(diào)用的時(shí)候可以發(fā)現(xiàn),他會(huì)往內(nèi)存里面寫參數(shù)你在括號(hào)里寫一個(gè)3,他會(huì)push3。在括號(hào)中定義多少個(gè),他就會(huì)在往內(nèi)存單元寫多少個(gè)數(shù),和他對(duì)應(yīng)的是,從右邊往左邊開始,先給右邊的賦值,所以在高地址,因?yàn)閜ush指令會(huì)令會(huì)導(dǎo)致esp-4,所以最右邊的是地址是最高的內(nèi)存單元。比如:調(diào)用abc(1,2,3)的匯編程序如下321每一個(gè)名字(變量)都對(duì)應(yīng)一個(gè)4字節(jié)的內(nèi)存單元。比如:intabc(inte,intf,intc,inta,intb)匯編程序如下: edi,[ebp- 是圓括號(hào)的里面定義的名字,還是大括號(hào)里面定義的名字,我們都把他叫做變量a=3;(variaba=3; 語(yǔ)言中的回車符只是為了便于閱讀。將所有語(yǔ)句并做一行,代碼仍然可以運(yùn)行r=abc(1,2,3);修改為:{submovdwordptrds:[esp+0],1movdwordptrds:[esp+4],2movdwordptrds:[esp+8],3callabcaddesp,0xcmovr,eax}課后理解{}intAdd(inta,int{intc=a+b;}intresult=這樣就實(shí)現(xiàn)了34+56的和,并把這個(gè)結(jié)果傳給了result課后疑問課后總結(jié)函數(shù)格式:前面是 int,后面是個(gè)名稱、左圓括號(hào)和右圓括號(hào)課后練習(xí)內(nèi)存結(jié)本節(jié)主要老唐intabc(int{inta;intb;int}寫的多了,自然就清楚了,在匯編里寫一個(gè)call,或者在C語(yǔ)言里,main函數(shù)中寫一個(gè)函數(shù)名,左圓括號(hào),參數(shù),右圓括號(hào),然后call指令地址加上本指令的長(zhǎng)度就是下一條指令的首地址,放在內(nèi)存里面去,如圖3-1:圖3-1:調(diào)用函數(shù)內(nèi)存練習(xí)intabc19(inta,intb,intc,intd,int{return}intabc5(inta,intb,intc,intd,int{intr;intv=abc6(a+5,b+5,c+5,d+5,e+5);r=a+b+c+d+e+v;return}intabc4(inta,intb,intc,intd,int{intr;intv=abc5(a+5,b+5,c+5,d+5,e+5);r=a+b+c+d+e+v;return}intabc3(inta,intb,intc,intd,int{intr;intv=abc4(a+5,b+5,c+5,d+5,e+5);r=a+b+c+d+e+v;return}intabc2(inta,intb,intc,intd,int{intr;intv=abc3(a+5,b+5,c+5,d+5,e+5);r=a+b+c+d+e+v;return}intabc1(inta,intb,intc,intd,int{intintv=abc2(a+5,b+5,c+5,d+5,e+5);r=a+b+c+d+e+v;return}intabc(inta,intb,intc,intd,int{intr;intv=abc1(a+5,b+5,c+5,d+5,e+5);r=a+b+c+d+e+v;return}main函數(shù)中的調(diào)用語(yǔ)句intr=課后理解程序PUSH開始RETURN語(yǔ)句結(jié)束,再將返回值寫入EAX傳遞給下一函數(shù)使用。課后疑問課后總結(jié)函數(shù)調(diào)用都會(huì)CALL指令的執(zhí)行課后練習(xí)條件執(zhí)本節(jié)主要Jcc、SETcc、CMOVccif老唐eaxebx后面兩cc表示可以替換。比CMOVCeax,edx表示當(dāng)CF1時(shí),數(shù)據(jù)從edx到eax。如果CF為0時(shí),這條指令什么都不做,也就是說在移動(dòng)數(shù)據(jù)時(shí),首先要判斷標(biāo)志位;外還p、np,z、nzCMOVcceip,”等于“Jcc”,Jcc也有16種寫法。所有條件見3-2:表3-2:Jcc(CF+ZF)=高于/不低于等CF=高于或等于/不低CF=低于/不高于等(CF+ZF)=低于或等于/不高CF=ZF=等于/CF=ZF=不等于/PF=PF=CX=寄存器CXECX=寄存器ECX((SF^OF)+ZF)=大于/不小于等(SF^OF)=大于或等于/不小(SF^OF)=小于/不大((SF^OF)+ZF)=小于或等于/不大OF=SF=OF=SF=當(dāng)CF=0時(shí),AL=0。練習(xí)注:cc代表十六種條件,十六種寫練習(xí)intfun10(inta,intb,intc,intd,int{intsum;intstub;return0;stub=sum=stub+a+b+c+d+e+(a+5+b+5+c+5+d+5+e+5);returnsum;}調(diào)用語(yǔ)句:result課后理解cmovcedx,eaxcf=1等同于movedx,eax如果cf=0,不處理cmovncedx,eaxcf=0movedx,eaxcf=1,不處理setccoprd:oprd可以是8bit寄存器、內(nèi)存,不可為立即數(shù)setzal:zf=1,al1zf=0,不處理setnzal:zf=0,al1zf=1,不處理課后疑問課后總結(jié)條件執(zhí)行指令是根據(jù)EFLAG寄存器中相應(yīng)的標(biāo)志位為判斷條課后練習(xí)移位指本節(jié)主要老唐ADD、SUB、ADC、SBB、OR、XOR、AND之外,總會(huì)有其他指是不改變目標(biāo)操作數(shù)SUBeax,edxeax的值減去edx,結(jié)果放到eax里面去,影響標(biāo)志位,而cmp只影響標(biāo)志位,運(yùn)算結(jié)果忽略,不影響eax。SHRAL,2向右面移兩個(gè)位,如果AL值 ,則向右移動(dòng)兩位后變 如圖3-2:3-向左移:SHL,只要會(huì)移動(dòng)一位,移動(dòng)N位就明白了,移動(dòng)后的結(jié)果放在目標(biāo)寄存器里面,當(dāng)然該操作也會(huì)改變標(biāo)志寄存器中的CF,將移出來的位賦給CF;右移也是一樣,凡是移出來的那個(gè)位都賦給CF,如圖3-3-疑問:如果N位,哪一位賦給移動(dòng)N位,相當(dāng)于N次移動(dòng)一位,也就是說,每移動(dòng)一位,就將移出來的那一位CF,移動(dòng)了N位,就賦給CFN次。所以結(jié)果很明顯,就是最后移動(dòng)的那當(dāng)然移位指令照樣影響SF位:將移動(dòng)后剩下的最賦給SF。還要看結(jié)果是否全為零,如果全為零,ZF10PF位(1的奇偶性O(shè)F位。果最補(bǔ)0,是邏輯移位;最保持不變(符號(hào)是算術(shù)移位,如圖3-4:3-SAR:算術(shù)右移,A是算術(shù)arithmetic。RCL和RCR:帶進(jìn)位的循環(huán)移位(C代表CF位循環(huán)左移一位,將最給課后理解ROL/ROR如圖3-3-RCL/RCR如圖3-3-課后疑問C語(yǔ)言中移位指令的書寫格式左移<<,右移>>左移只會(huì)生成SHL指令,因?yàn)镾HL和SAL等無符號(hào)右移(>>前的數(shù))會(huì)生成SHR,有符號(hào)數(shù)右移會(huì)生成課后總結(jié)算術(shù)移位涉及符號(hào)位的運(yùn)算,而邏輯移位不涉課后練習(xí)畫出下列指令執(zhí)行時(shí)內(nèi)存數(shù)據(jù)的變化情況intCumulativeHundred1(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj);intCumulativeHundred7(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj){intsum;f+20,g+20,h+20,i+20,j+20);sum=stub+g+h+i+j+((a<<1)+10+(b<<1)+10+(c<<1)+10+(d<<1)+(e<<1)return}intCumulativeHundred6(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj){intsum;stub=(a>=90)?0:CumulativeHundred7(a+20,b+20,c+20,d+20,f+20,sum=stub+f+g+h+i+j+((a<<1)+10+(b<<1)+10+(c<<1)+10++10return}intCumulativeHundred5(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj){intsum;f+20,g+20,h+20,i+20,j+20);sum=stub+e+f+g+h+i+j+((a<<1)+10+(b<<1)+10+(c<<1)++10return}intCumulativeHundred4(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj){intsum;f+20,g+20,h+20,i+20,j+20);sum=stub+d+e+f+g+h+i+j+((a<<1)+10+(b<<1)+10+(c<<1)+10+d+10+e+10+f+10+g+10+h+10+i+10+j+10);return}intCumulativeHundred3(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj){intsum;f+20,g+20,h+20,i+20,j+20);sum=stub+c+d+e+f+g+h+i+j+((a<<1)+10+(b<<1)+10+c+10+d+10+freturn}intCumulativeHundred2(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj){intsum;stub=(a>=90)?0:CumulativeHundred3(a+20,b+20,c+20,d+20,e+20,f+20,g+20,h+20,i+20,j+20);sum=stub+b+c+d+e+f+g+h+i+j+((a<<1)+10+b+10+c+10+d+ereturn}intCumulativeHundred1(inta,intb,intc,intd,inte,intf,intg,inth,inti,intj){intsum;f+20,g+20,h+20,i+20,j+20);sum=stub+a+b+c+d+e+f+g+h+i+j+(a+10+b+10+c+10+d+f+10return}表達(dá)本節(jié)主要老唐cmp和SUB指令功能是一樣的,只是cmp不改變目標(biāo)操作數(shù)的值,同樣影響標(biāo)志位。AND的功能是按位與。TEST與AND的功能相同,只是不改變目標(biāo)操作數(shù)的值,也同樣影響以后我們不需要寫匯編,只需要看懂別人寫的匯編代碼即可。前面提到,定義一個(gè)C+……表達(dá)式的定義:凡是由變量、常量和算術(shù)符號(hào)起來的都可以稱為表達(dá)式有圓括號(hào),中括號(hào)和大括號(hào),在C語(yǔ)言中只有圓括號(hào)。int_abcd(intab,intcd,int{intdc;baab+cd;//}練習(xí)注:int是有符號(hào)整型,unsignedint是無符號(hào)整型。intabc(inta,intb,int{inth;intj;var=0;var=(var,0x5,var+0x5);//var=var+0x5;return0;}單目/雙目/三目運(yùn)算符:b=b+c等價(jià)于b+=c計(jì)算機(jī)做有符號(hào)乘法(IMUL)時(shí),首先判斷最是否為1,為1(負(fù)數(shù))時(shí),將101后的數(shù)(此時(shí)為正數(shù)0減去結(jié)果。當(dāng)做乘法時(shí),目標(biāo)操作數(shù)默認(rèn)為EAX或EDX:通常乘使寬度擴(kuò)大一倍,8位的乘法需要兩個(gè)字節(jié)保存,32位的乘法64位保存。1個(gè)字節(jié)相乘時(shí),結(jié)果放在AX里面,兩個(gè)字節(jié)相乘時(shí),結(jié)果放在EAX里面,4個(gè)字節(jié)乘法時(shí),結(jié)果放在EAXEDX里面,其中EAX為。比如MULecx;將ecx乘以eax并將結(jié)果放在EAX和EDX中。除法里面,結(jié)果放在EAX里面,余數(shù)EDX里面EAXIMULECX,EAX,則結(jié)果會(huì)溢出,沒有意義。比如:-5*-61*(0-(-5)*1*(0-(-6))練習(xí)寫出下列C程序?qū)?yīng)的匯編代intabc(inta,intb,int{intv;intv=a+b+c;r=a|b&c;}intab(inta,intb,intc,int{intv=abc(a+b,b+c,c+a)+3;returnv+d+5;} repstos dwordptr[edi][bp4][ebp-8[ebp+4] 練習(xí)寫一個(gè)函數(shù),實(shí)現(xiàn)只有表達(dá)式由編譯器生成匯編,其他部分由自己構(gòu)造(匯編實(shí)現(xiàn)說明:在寫函數(shù)前需要在函數(shù)前加declspec(naked):declspec(naked)abc(inta,intb,intc){intv;intr;{pushebp;subesp,LOCAL_SIZE(編譯器的宏)//}{moveax,rpopebp}}課后理解1.2.+、-、*、不等號(hào)符號(hào):==、>=、<=、!=課后疑問數(shù)字3是表達(dá)式嗎課后總結(jié)凡是由變量、常量和算術(shù)符號(hào)起來的都可以稱為表達(dá)式課后練習(xí)int#33;inta;int2a;inti;int{intv;inta;v+=i++++;v+=return}if本節(jié)主要if語(yǔ)句的書寫格ifelse老唐shppintabc(intab,intcd,intef)//ebp+0:ebp{intv;//ebp-4inth;//ebp-8intr;}{//可以寫任意多個(gè)表達(dá)}既然if語(yǔ)句中間可以放任意語(yǔ)句,if語(yǔ)句也屬于語(yǔ)句,那么if語(yǔ)句中間也可以if語(yǔ)句if{if{}}if語(yǔ)句的第二種格式if{}{//也可以是任意語(yǔ)}if語(yǔ)句的第三種格式if{//可以是任意語(yǔ)}else{//可以是任意語(yǔ)}else{//可以是任意語(yǔ)}else{//可以是任意語(yǔ)}else{//可以是任意語(yǔ)}說明:逗號(hào)表達(dá)式也屬于表達(dá)式,比如if(表達(dá)式1,表達(dá)式2,……)Jcclab10CMOVcceip,lab10//lab10是其實(shí)C語(yǔ)言中也含有功能等價(jià)于jmp的指令goto:gotolab10jmpoffset對(duì)于if語(yǔ)句,當(dāng)圓括號(hào)里面的表達(dá)式值為非0時(shí),執(zhí)行大括號(hào)里面的程序課后理解if(表達(dá)式{}elseif(表達(dá)式{{}課后疑問可以添加兩個(gè)else語(yǔ)句,比如{}{}課后總結(jié)if語(yǔ)句又稱選擇語(yǔ)句,用于在可選擇的幾個(gè)動(dòng)作之間進(jìn)行選課后練習(xí)寫出下列函數(shù)中FuncMove函數(shù)每次執(zhí)行完后變化內(nèi)存intFuncMove(intn,intnX,int{intnTemp1;intnTemp2;intnTemp3;nResult=n;nTemp1=0;nTemp2=nTemp3=0;nTemp1|=nY;nTemp2=nTemp2|=nX;returnnResult;}intFuncHanoi(intn,intOne,intTwo,int{intnResult;nResult=1;if(n==1){}{}return}循環(huán)語(yǔ)本節(jié)主要whilefor老唐5+i++//先進(jìn)行5+i,再運(yùn)算4+++i//先運(yùn)算i+1,再進(jìn)行;麻煩,所以C語(yǔ)言提供了新的語(yǔ)句while。while()/*圓括號(hào)里面可以是任意表達(dá)式,表達(dá)式的值成立,執(zhí)行大括號(hào)里面的語(yǔ)句{//可以是任意語(yǔ)}練習(xí)練習(xí)while語(yǔ)句,并調(diào)試觀察對(duì)應(yīng)的匯編語(yǔ)當(dāng)while語(yǔ)句中圓括號(hào)中值為1時(shí),會(huì)執(zhí)行,while語(yǔ)句里面也可以嵌套{}while();//圓括號(hào)里面不能為for語(yǔ)句也是循環(huán)語(yǔ)句的一種,for圓括號(hào)里面有三個(gè)表達(dá)不寫,則表示為1*/{//可以是任意語(yǔ)}表達(dá)式1只在開始時(shí)執(zhí)行一次,表達(dá)式2和表達(dá)式3每次都執(zhí)行。執(zhí)行次序是:1>表達(dá)式2>表達(dá)式2;//表達(dá)式值成3>大括號(hào)里面內(nèi)容4>表達(dá)式5>表達(dá)式2;//表達(dá)式值成6>大括號(hào)里面內(nèi)容7>表達(dá)式練習(xí)構(gòu)造for循環(huán)語(yǔ)句,觀察其生成的匯編代碼,并單步觀察執(zhí)行break也是一條語(yǔ)句,通常放在if,whilefor語(yǔ)句中間,作為中斷使用,該功能可以由goto語(yǔ)句代替(需要設(shè)定。如若break語(yǔ)句處于嵌套循環(huán)語(yǔ)句中,則只會(huì)跳課后理解For語(yǔ)句可以用if和goto語(yǔ)句實(shí)現(xiàn),實(shí)現(xiàn)步 for(;end- for(;end-i+1;{...}if(end-i+1{...{...goto}以上步驟可以說明,c語(yǔ)言中所有句型都可以用ifgotofor語(yǔ)句格式來源forcontinuecontinuefor(的第二個(gè)";"(從括號(hào)中的第三條語(yǔ)句開始執(zhí)行課后疑問{{}}回答:lab2,break語(yǔ)句只跳出當(dāng)前循環(huán)。課后總結(jié)c語(yǔ)言中所有句型都可以用if和goto實(shí)現(xiàn)課后練習(xí)intfun(inta,int{{}return}intmain(intargc,char*{intresultfun(1,100);//return0;}變本節(jié)主要老唐C語(yǔ)言除了賦值語(yǔ)句外,只有if,while和forintabc(inta,intb,int{int}char表示變量的寬度只有1個(gè)字節(jié)short表示變量的寬度只有2觀察匯編里面出現(xiàn)了movsx和movzx指令操作數(shù)0擴(kuò)展為目標(biāo)操作數(shù)的寬度并賦給目標(biāo)操作數(shù),如圖3-7。圖3-7:數(shù)值寬度擴(kuò)intabc(inta,intb,intc)//a,b,c{r=v|a|b|c;//也可以是if,while或for64位(8個(gè)字節(jié))時(shí),返回值賦給EDX,EAX*/}4個(gè)字節(jié),為什么在計(jì)算機(jī)里面有個(gè)本機(jī)尺寸的概念,我們使用的是32位計(jì)算機(jī),則計(jì)算機(jī)對(duì)32持比較好,主要類型是32位,cpu針對(duì)32位會(huì)更快一些。針對(duì)其他位數(shù),要進(jìn)行復(fù)雜電路的改變,比如當(dāng)使用8位時(shí),計(jì)算機(jī)會(huì)先取32位,再掉,只取低位,所以會(huì)更期的規(guī)則,以本機(jī)尺寸為主。所以編譯器在對(duì)一個(gè)字節(jié)寬度的變量分配4個(gè)字節(jié),使用8位,因?yàn)榫幾g器認(rèn)為本機(jī)尺寸會(huì)運(yùn)行更快。所以通常我們?cè)趯懗绦蚍潜赝ǔ6x成int,而不定義為char或short因此定義成char{inti=1;//[ebp-j=abc(i,r,j);submovdwordptr[esp],imovdwordptr[esp+4],rmovdwordptr傳遞參數(shù)只是把表達(dá)式的值一份,所以子函數(shù)abc中使用和修改的只是espesp+0xc位置的值,和ebp-4到ebp-0xc沒有任何關(guān)系}int{v=abc(a+0,b+0,c|0,d|0);//用匯編實(shí)現(xiàn)vabc(a+2,b+2,c|2,d|2);//用匯編實(shí)現(xiàn)returnv;}pushmovebp,esp是為了保證函數(shù)的穩(wěn)定voidabc(inta,intb){return;//也可以不寫此句,寫上更好,代表函數(shù)}問題為什么匯編函數(shù)頭要多減去0x40,要執(zhí)行subesp,0xXX并賦值intabc(inta,int{intab(...);//如果這個(gè)函數(shù)依賴ebx,esi,edi}及ebx,esi,edi值保持不變,可以隨便改變eax,ecx和edx,并且會(huì)在子函數(shù)的上方當(dāng)在函數(shù)前使用declspec(naked),自己定義函數(shù)結(jié)構(gòu)。declpec(naked)abc(inta,int{{moveax,dwordptr[ebp+0x8]movecx,dwordptr[ebp+0xc]movdwordptr[ebp+0xc],eaxmovdwordptr[ebp+0x8],ecx}}課后理解Movsxmovwithsign-extensionMovzxmovwithzero-extend‘0課后疑問課后總結(jié)變量是內(nèi)存中的一個(gè)位置,可以在該位置上值以供程序使用課后練習(xí)charsum;chari;sum+=i; al,byteptr[ebp-0x4] al,byteptr[ebp-0x10] byteptr[ebp-0x4],alsum=sum+i;Movsxecx,byteptr[ebp-0x4]Movsxedx,byteptr[ebp-0x10] byteptr[ebp-數(shù)本節(jié)主要老唐if{v=}{v=}練習(xí)找出8個(gè)數(shù)中的最大intabc(inta,intb,int{inta;//存放最大數(shù)}{}v[0]=5;//初始化v[1]=intv[8]char/short/longv[8],ESP減少了多少?intabc(inta,int{inti;score[0]=1;score[1]=score[]=3;//[]里面可以是任意表達(dá)式}并觀察函數(shù)頭部subesp,后面的常量變化。v[i]=1;匯編代碼表示subesp,0x94//0x40+20*4+4(一個(gè)變量movmovdwordptr[ebp+eax*4-subesp,0x58//0x40+20+4(一個(gè)變量i)movmovbyteptr[ebp+eax-=======for(i=0i<20i++)//i{v[i]=}當(dāng)定義一排變量時(shí),比如一個(gè)班有5個(gè)小組,每個(gè)小組有9人,則可以定義int比如一個(gè)縣有5個(gè)學(xué)校,每個(gè)學(xué)校有3個(gè)年級(jí),每個(gè)年級(jí)有

溫馨提示

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