汇编语言简介_第1页
汇编语言简介_第2页
汇编语言简介_第3页
汇编语言简介_第4页
汇编语言简介_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言简介董千里Email:Olin.Dung@软件与微电子学院科协C\C++小组

讲课之前History机器语言

机器指令集合

一系列0、1二进制组合,转换为高低

电平,驱动计算机电子器件进行运算有什么优点、有什么缺点?难于记忆、编写、查错为什么学习汇编?Typicaluse操作系统bootloader、driver逆向工程游戏、多媒体使用IntelMMX、SSEseries指令集、AMD3DNOWFFMpeg中内联汇编使用MMX指令将机器码映射为助记符

将机器码映射为助记符

Assembler计算机体系结构RegisterALUCUBUSRAMADDBUSControlBUSDataBUS对寄存器操作内存访问算术、逻辑运算条件控制寄存器RegisterCPU内可存放数据Intel8086RegisterIntel8086Register(cont.)14个太多!寄存器Register(cont.)我们先关注MainReg(通用寄存器)16bitMainRegister可分为两个8bitRegX86中8bit=1byte(字节)2bytes=1word(字)4bytes=1dword(双字)

寄存器Register(cont.)寄存器赋值操作 movax,1 ax=1 movbx,ax bx=ax算术操作 addax,bx ax+=bx subax,bx ax-=bx现在我们可以写一些简单的计算程序Debug.exe在“开始->运行”中启动debugDebug.exe(cont.)一些debug命令A以汇编形式将机器指令写入内存T单步执行U反汇编内存D查看内存内容R查改寄存器E改写内存Debug.exe(cont.)使用a输入指令并执行内存访问8086地址线20bit可编址范围0-0xFFFFF寄存器16bit如何使用16bit寄存器表示20bit地址?内存访问(cont.)分段使用一个寄存器存储基地址,一个寄存器存储偏移地址8086约定的段寄存器表示的基地址Base=segreg*16段寄存器SegmentReg0000内存访问(cont.)SegmentRegistersDS、ES我们可以用来访存CS、SS分别用作代码段、堆栈段内存访问(cont.)使用DS访问内存ds:[add]Ds*16+addMovax,ds:[10]ds=B800h将位于B800h*16+10=0xB800A处16bit数据读入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现在我们往屏幕打印文字!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区域使用哪些寄存器,如何访存?Hello,World!(cont.)MASM(MicrosoftAssembler)C:\>masmhello.asm; C:\>linkhello.obj; C:\>hello.exe分号(;)使用默认名称Hello,World!(cont.)改进版本将字符串复制

charmsg[]=“Hello,World”;inti=0;while(msg[i])//汇编语言如何实现循环?{ //movmsg[i]tovideobuffer

i++;}Hello,World!(cont.)C语言的几种条件、分支if(exp)action;while(exp)action;for(exp1;exp2;exp3)action;Hello,World!(cont.)cmp指令

比较两个操作数的值=>flags条件跳转根据cmp比较结果进行跳转je(jmpequal)ja(jmpabove)jna(jmpnotabove)…

moval,‘H’movbl,0cmpal,bljneL1;;;;;L1:;;;;;Hello,World!(cont.)无条件跳转jmp

moval,‘H’jmpL1movbl,0;;斜体部分不执行cmpal,bljneL1

;;;;;L1:;;;;;Hello,World!(cont.)循环如何使用条件分支实现循环???看看编译器是怎么翻译的。。。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(),我们能否实现一个函数voidputs(intposx,intposy,constchar*)函数调用在程序运行中,CPU需要知道指令执行的位置函数调用就是改变指令执行位置,实现跳转函数调用(cont.)如何跳转?我们有jmp可以使用寄存器传递我们的参数

;puts(x,y,str) ;action1 jmpputsputs: ;;action函数调用(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?函数调用(cont.)stackX86体系使用stack提供对函数调用支持ss:sp将内存用作stack,用来保存参数、函数地址等信息ref:USTC_1.pptpushpop函数调用(cont.)call当call指令发生时,cpu保存当前执行指令位置,跳转到指定地点callfunc相当于 pushcs:ip jmpfunc函数调用(cont.)ret用于函数返回。CPU从stack取出cs:ip完成返回改进Hello,World函数调用(cont.)参数传递使用stack进行参数传递ref:USTC_1.pptHello,World!(cont.)ReverseusingstackandcallENDofthisSection我们完成了一个简单的汇编HelloWorld请大家自行阅读王爽《汇编语言》吐血推荐!号外:AT&T汇编AT&T汇编语言和Intel汇编语言AT&T汇编语言中指令的操作数顺序与Intel相反AT&Topcode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论