匯編語言簡介_第1頁
匯編語言簡介_第2頁
匯編語言簡介_第3頁
匯編語言簡介_第4頁
匯編語言簡介_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

匯編語言簡介董千里Email:Olin.Dung@軟件與微電子學(xué)院科協(xié)C\C++小組

講課之前History機(jī)器語言

機(jī)器指令集合

一系列0、1二進(jìn)制組合,轉(zhuǎn)換為高低

電平,驅(qū)動(dòng)計(jì)算機(jī)電子器件進(jìn)行運(yùn)算有什么優(yōu)點(diǎn)、有什么缺點(diǎn)?難于記憶、編寫、查錯(cuò)為什么學(xué)習(xí)匯編?Typicaluse操作系統(tǒng)bootloader、driver逆向工程游戲、多媒體使用IntelMMX、SSEseries指令集、AMD3DNOWFFMpeg中內(nèi)聯(lián)匯編使用MMX指令將機(jī)器碼映射為助記符

將機(jī)器碼映射為助記符

Assembler計(jì)算機(jī)體系結(jié)構(gòu)RegisterALUCUBUSRAMADDBUSControlBUSDataBUS對寄存器操作內(nèi)存訪問算術(shù)、邏輯運(yùn)算條件控制寄存器RegisterCPU內(nèi)可存放數(shù)據(jù)Intel8086RegisterIntel8086Register(cont.)14個(gè)太多!寄存器Register(cont.)我們先關(guān)注MainReg(通用寄存器)16bitMainRegister可分為兩個(gè)8bitRegX86中8bit=1byte(字節(jié))2bytes=1word(字)4bytes=1dword(雙字)

寄存器Register(cont.)寄存器賦值操作 movax,1 ax=1 movbx,ax bx=ax算術(shù)操作 addax,bx ax+=bx subax,bx ax-=bx現(xiàn)在我們可以寫一些簡單的計(jì)算程序Debug.exe在“開始->運(yùn)行”中啟動(dòng)debugDebug.exe(cont.)一些debug命令A(yù)以匯編形式將機(jī)器指令寫入內(nèi)存T單步執(zhí)行U反匯編內(nèi)存D查看內(nèi)存內(nèi)容R查改寄存器E改寫內(nèi)存Debug.exe(cont.)使用a輸入指令并執(zhí)行內(nèi)存訪問8086地址線20bit可編址范圍0-0xFFFFF寄存器16bit如何使用16bit寄存器表示20bit地址?內(nèi)存訪問(cont.)分段使用一個(gè)寄存器存儲(chǔ)基地址,一個(gè)寄存器存儲(chǔ)偏移地址8086約定的段寄存器表示的基地址Base=segreg*16段寄存器SegmentReg0000內(nèi)存訪問(cont.)SegmentRegistersDS、ES我們可以用來訪存CS、SS分別用作代碼段、堆棧段內(nèi)存訪問(cont.)使用DS訪問內(nèi)存ds:[add]Ds*16+addMovax,ds:[10]ds=B800h將位于B800h*16+10=0xB800A處16bit數(shù)據(jù)讀入ax改變ds值movax,0b800hmovds,axIBMPCVGAVideoMode Themostused VGAvideomode foratextUIistextmode,ormode0.Thisisthemostcommonlyused,asitallowsdirectmemoryaccesstoalinearaddresscontainingeachcharacterandit'sassociatedattributes.Textmode0providesatextinterface80characterswideand25characterslinesperscreen.IBMPCVGA(cont.)VideoMemory Intextmode0,thelineartextbufferislocatedinphysicalat0xB8000.Readingandwritingtoandfromthisaddresswillprovidedirectmanipulationofonscreentext.ToaccessaparticularcharacteronthescreenfromXandYcoordinatesissimpleusingthefollowingformula:

position=(y_position*characters_per_line)+x_position;

Eachcharactertakesuptwobytesofspaceinmemory.Thefirstbyteissplitintotwosegments,theforecolour,andthebackcolour.Thesecondbyteisan8-bitASCIIvalueofthecharactertoprint.IBMPCVGA(cont.)Colours現(xiàn)在我們往屏幕打印文字!Hello,World!assumecs:code,ds:datadatasegment;datagoesheredataendscodesegmentstart:

;codegoeshere

;exit0 movax,4c00h int21hcodeendsendstartassumecs:code,ds:datacodesegmentstart: movax,0b800h movds,ax moval,'H' movds:[160],al movax,4c00h int21hcodeendsendstart程序總體思路將文字ASCII寫入0xB8000h區(qū)域使用哪些寄存器,如何訪存?Hello,World!(cont.)MASM(MicrosoftAssembler)C:\>masmhello.asm; C:\>linkhello.obj; C:\>hello.exe分號(hào)(;)使用默認(rèn)名稱Hello,World!(cont.)改進(jìn)版本將字符串復(fù)制

charmsg[]=“Hello,World”;inti=0;while(msg[i])//匯編語言如何實(shí)現(xiàn)循環(huán)?{ //movmsg[i]tovideobuffer

i++;}Hello,World!(cont.)C語言的幾種條件、分支if(exp)action;while(exp)action;for(exp1;exp2;exp3)action;Hello,World!(cont.)cmp指令

比較兩個(gè)操作數(shù)的值=>flags條件跳轉(zhuǎn)根據(jù)cmp比較結(jié)果進(jìn)行跳轉(zhuǎn)je(jmpequal)ja(jmpabove)jna(jmpnotabove)…

moval,‘H’movbl,0cmpal,bljneL1;;;;;L1:;;;;;Hello,World!(cont.)無條件跳轉(zhuǎn)jmp

moval,‘H’jmpL1movbl,0;;斜體部分不執(zhí)行cmpal,bljneL1

;;;;;L1:;;;;;Hello,World!(cont.)循環(huán)如何使用條件分支實(shí)現(xiàn)循環(huán)???看看編譯器是怎么翻譯的。。。loopmovcx,5L1:subcx,1;;actioncmpcx,0jneL1;;;;;;;;endloopHello,World!(cont.)Reversedversionassumecs:code,ds:datadatasegmentmsg“Hello,World!”,0dataendscodesegmentstart:

;codegoeshere

;exit0 movax,4c00h int21hcodeendsendstart13DF:0Hello…B800:0‘H’‘e’‘l’000B800:0B800:1B800:2B800:3B800:4B800:5Hello,World!(cont.)每次打印字符串都需要自己寫顯存,過于繁瑣像Cruntime提供puts(),我們能否實(shí)現(xiàn)一個(gè)函數(shù)voidputs(intposx,intposy,constchar*)函數(shù)調(diào)用在程序運(yùn)行中,CPU需要知道指令執(zhí)行的位置函數(shù)調(diào)用就是改變指令執(zhí)行位置,實(shí)現(xiàn)跳轉(zhuǎn)函數(shù)調(diào)用(cont.)如何跳轉(zhuǎn)?我們有jmp可以使用寄存器傳遞我們的參數(shù)

;puts(x,y,str) ;action1 jmpputsputs: ;;action函數(shù)調(diào)用(cont.);ax-pos,ds:si-strputs: movdi,ax movax,0B800h moves,axL1: movbyteptrbl,ds:[si] cmpbl,0 jeL2 movbyteptres:[di],bl incsi adddi,2 jmpL1L2: jmpbef

datasegmentmsgdb‘Hello,World’,0dataendscodesegmentstart: movax,data movds,ax movax,160 movsi,0 jmpputsbef:

;exit0 movax,4c00h int21hcodeendsendstart

ANYBugs?函數(shù)調(diào)用(cont.)stackX86體系使用stack提供對函數(shù)調(diào)用支持ss:sp將內(nèi)存用作stack,用來保存參數(shù)、函數(shù)地址等信息ref:USTC_1.pptpushpop函數(shù)調(diào)用(cont.)call當(dāng)call指令發(fā)生時(shí),cpu保存當(dāng)前執(zhí)行指令位置,跳轉(zhuǎn)到指定地點(diǎn)callfunc相當(dāng)于 pushcs:ip jmpfunc函數(shù)調(diào)用(cont.)ret用于函數(shù)返回。CPU從stack取出cs:ip完成返回改進(jìn)Hello,World函數(shù)調(diào)用(cont.)參數(shù)傳遞使用stack進(jìn)行參數(shù)傳遞ref:USTC_1.pptHello,World!(cont.)ReverseusingstackandcallENDofthisSection我們完成了一個(gè)簡單的匯編HelloWorld請大家自行閱讀王爽《匯編語言》吐血推薦!號(hào)外:AT&T匯編AT&T匯編語言和Intel匯編語言AT&T匯編語言中指令的操作數(shù)順序與Intel相反AT&Topcode

溫馨提示

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

最新文檔

評論

0/150

提交評論