版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
匯編語言簡介董千里Email:Olin.Dung@軟件與微電子學(xué)院科協(xié)C\C++小組
講課之前History機器語言
機器指令集合
一系列0、1二進制組合,轉(zhuǎn)換為高低
電平,驅(qū)動計算機電子器件進行運算有什么優(yōu)點、有什么缺點?難于記憶、編寫、查錯為什么學(xué)習(xí)匯編?Typicaluse操作系統(tǒng)bootloader、driver逆向工程游戲、多媒體使用IntelMMX、SSEseries指令集、AMD3DNOWFFMpeg中內(nèi)聯(lián)匯編使用MMX指令將機器碼映射為助記符
將機器碼映射為助記符
Assembler計算機體系結(jié)構(gòu)RegisterALUCUBUSRAMADDBUSControlBUSDataBUS對寄存器操作內(nèi)存訪問算術(shù)、邏輯運算條件控制寄存器RegisterCPU內(nèi)可存放數(shù)據(jù)Intel8086RegisterIntel8086Register(cont.)14個太多!寄存器Register(cont.)我們先關(guān)注MainReg(通用寄存器)16bitMainRegister可分為兩個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)在我們可以寫一些簡單的計算程序Debug.exe在“開始->運行”中啟動debugDebug.exe(cont.)一些debug命令A(yù)以匯編形式將機器指令寫入內(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.)分段使用一個寄存器存儲基地址,一個寄存器存儲偏移地址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分號(;)使用默認名稱Hello,World!(cont.)改進版本將字符串復(fù)制
charmsg[]=“Hello,World”;inti=0;while(msg[i])//匯編語言如何實現(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指令
比較兩個操作數(shù)的值=>flags條件跳轉(zhuǎn)根據(jù)cmp比較結(jié)果進行跳轉(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)如何使用條件分支實現(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(),我們能否實現(xiàn)一個函數(shù)voidputs(intposx,intposy,constchar*)函數(shù)調(diào)用在程序運行中,CPU需要知道指令執(zhí)行的位置函數(shù)調(diào)用就是改變指令執(zhí)行位置,實現(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當call指令發(fā)生時,cpu保存當前執(zhí)行指令位置,跳轉(zhuǎn)到指定地點callfunc相當于 pushcs:ip jmpfunc函數(shù)調(diào)用(cont.)ret用于函數(shù)返回。CPU從stack取出cs:ip完成返回改進Hello,World函數(shù)調(diào)用(cont.)參數(shù)傳遞使用stack進行參數(shù)傳遞ref:USTC_1.pptHello,World!(cont.)ReverseusingstackandcallENDofthisSection我們完成了一個簡單的匯編HelloWorld請大家自行閱讀王爽《匯編語言》吐血推薦!號外: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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年營口職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試模擬試題含詳細答案解析
- 2026四川省監(jiān)獄管理局遴選公務(wù)員考試重點題庫及答案解析
- 2026年重慶工貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試備考題庫含詳細答案解析
- 2026年武夷山職業(yè)學(xué)院單招綜合素質(zhì)考試參考題庫含詳細答案解析
- 2026浙江溫州長安集團平陽誠眾汽車維修有限公司招聘編外人員(勞務(wù)派遣)補充8人(二)考試重點試題及答案解析
- 2026年中山職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試備考試題含詳細答案解析
- 2026中國石化江蘇徐州沛縣石油分公司汽服門店人員招聘1人考試重點試題及答案解析
- 2026年大連航運職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試模擬試題含詳細答案解析
- 2026年河北旅游職業(yè)學(xué)院單招職業(yè)技能考試備考題庫含詳細答案解析
- 2026年永州職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試參考題庫含詳細答案解析
- 《市場營銷(第四版)》中職完整全套教學(xué)課件
- 護士長崗位面試題目參考大全
- 機場旅客服務(wù)流程與技巧詳解
- 中國地質(zhì)大學(xué)武漢本科畢業(yè)論文格式
- 自流平地面施工安全方案
- 2025年湖北煙草專賣局考試真題
- 車載光通信專題學(xué)習(xí)
- 《海南省工程勘察設(shè)計收費導(dǎo)則(試行)》
- 第四方支付風(fēng)險管理方案
- 濟南版小學(xué)數(shù)學(xué)一年級上冊期中考試題及答案
- GJB297B-2020鈍化黑索今規(guī)范
評論
0/150
提交評論