易语言汇编置入代码相关_第1页
易语言汇编置入代码相关_第2页
易语言汇编置入代码相关_第3页
易语言汇编置入代码相关_第4页
易语言汇编置入代码相关_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

2011年7入汇编及其注意要点。这是自己的学习体会,理解错误或bug请,谢!汇编中nop( PUSHEBPMOVEBP,ESPEBPESPEBPESP是堆栈指针,无法暂借使用(PUSH/POP指令会自动ESP值),所以一般使用EBP来存取堆栈。聪明的你在这时有没有想发言:“但我们置入有子程序初始都添加这么的两句,在“返回()”MOVESP,EBP/POPEBP来平栈,这messagebox之类。因为易语言不会再为我们置入的代码去修改数据段及导入表。能完善、界面友好、使用免费的工具“NASMv1.0”NASM指令简单明了,而且能将汇编代码片段直接编译成二进制文件,它不强求源码是一坛提供了该工具的源码。在此感谢大鸟为广大易友所做的贡献!相信使用汇编的人的是喜欢MASM,这从Aogo所写“MASMPLUS”被广泛使用可认为被,请,本人 。本人当即删除及正式致歉!MASM不支持直接编译成二进制文件,这当中要如何处理?答案是: 成COM文件。因为DOS中COM文件是没有文件头,系统载入后直接从第一个语句运行。这提供了一个迂回,这就是为什么在易语言置入代码MASM汇编工具当中存在.586、.model、option等这样的几行语句,而在NASM汇编工具中没有的原因了。这均使用MASM汇编置入工具,请 提供一个完整源码去编译,虽然多出了几行语句,但它却拥有NASM汇编工具所不能比我们一同来看看如何的在“置入代码MASM汇编工具”中定义参数供汇编代码。 汇编代码“movzxeax,_red”编译后成“MOVZXEAX,BYTEPTRSS:[EBP+8]”汇编代码“movzxeax,_green”编译后成“MOVZXEAX,BYTEPTRSS:[EBP+C]”汇编代码“movzxeax,_blue”编译后成“MOVZXEAX,BYTEPTR这样一我们可以完省去对如ebp+8这地址而使直观“_e”参数MSMep8“HEP/VEP,ESN"MSM“(”句即“LAV”当然如果大不喜这样重复代码不喜,汇编“LAV9(20(85139236201)即可,余下的就是我们真正需要执行的代码。大家要记住,这参数的引看看反汇编最后两句“LEAVERETN0C”,而汇编源码中只有“ret”,怎么会~~?这是因为一个小优势——不用自己计算ret后应当填写什么数值! .modelflat,stdcalloptioncasemap:nonemovebx,[ebp+8]movebx,[ebx]moveax,2573mov[ebx],axaddebx,2xorecx,ecxincecxxor.whileecx<=9pushecxxoredx,edxincedxpushedxmoveax,ecxaddeax,30hmov[ebx],almoveax,49569mov[ebx+1],axmoveax,edxaddeax,30hmov[ebx+3],almoveax,'='mov[ebx+4],almoveax,ecxmuldlmovdl,10divdladdeax,12336mov[ebx+5],axmoveax,32mov[ebx+7],aladdebx,8pop.break.ifedx>=ecxincedx.untiledx>9moveax,2573mov[ebx],axaddebx,2popecxincmoveax,0mov[ebx],alret4139,93,8,139,27,184,1310,0,0,102,137,3,131,195,2,51,201,65,51235,89,81,51,210,66,82,139,193,131,192,48,136,3,184,161,193,0,0,102,137,67,1,194,131,192,48,136,67,3,184,61,0,0,0,136,67,4,139,193,246,226,178,10,246,242,5,48,0,0,102,137,67,5,184,32,0,0,0,136,67,7,131,195,8,90,59,209,115,6,66,131,250,118,184,184,13,10,0,0,102,137,3,131,195,2,89,65,131,249,9,118,162,184,0,0,0,0,3,201,194,4,0“ovbx,ebp+8]/ovebx,ebx“(^_^)“moveax,2573/movebx],ax”两句先给“乘法表”加上一个#再通过“.while”及“.repeat”构造一个双循环。(MASM的高级语法,它们不是CPU指令。MASMCPU指令,应当相信微软已经为这优化得相当环记数器edx大于或等于第一个循环记数器ecx时跳出第二个循环,以生成阶梯式的乘法表。MASM高级语法,是不是让源码看起来更简单明了?!这也是本人喜欢MASM的亮“PUSH”指令,分别是“PUSH3”、“PUSH2”、“PUSH1”子程序调用最右边的参数先入栈,最后是一个“CALLXXX”。在这里,我们可以看到存取参数是通过堆栈来定义的,实际上局部变量EPB做指针来完成。我们假定调用“测试子程序()”前堆栈地址为XEBP、参数、局部变量EBP明XX-(PUSH参数三X-(PUSH参数二X-(PUSH参数一↓X-CALLXXX(CALLX-PUSHEBP/MOVEBPX-局部变量X-局部变量ret后把堆栈指针esp加上该操作数,以实现将参数丢掉。在源程序中,参数、局部变量和esp的关系是由编译器自动的,所以大家不必关心它MASM汇编工具定义函数实现参数及局部变量的直接提.版本.,整数型,,.,139,69,8,139,011,192,117,4,201,194,4,0,201,13972,4,131,193,6,43,139,220,81,86,87,139,251,141,112,8,131,233,6,252,243,164,184,89,3,225,194,171,184,4,0,102,171,95,94,255,227'mov'moveax,[eax]'.ifeax0如果数据地址为0则直接返回'ret'.endif否则运行下面代码'leave'ebp'movecx,[eax+4]'取字节集长度'addecx,6预留修正堆栈指令空间'movebx,esp'pushecx将在堆栈中申请的空间长度压入栈,用于后面修正堆栈时使用(popecxaddesp,ecx)'pushesi'pushedi'movedi,ebx'leaesi,[eax+8]'subecx,6'repmovsb'将动态代码入已经申请的堆栈空间';popecx/addesp,ecx/ret4/ 'moveax,0c2e10359h'movax,0004h'popedi'pop'jmpebx'跳转至动态代码处执地址 为什么要在动态代码后写入“popecx/addesp,ecx/ret4”?这是为了修正先前我们在堆栈有动态代码后再“popecx/addesp,ecx”就是修正了堆栈,这够简单吗!?再来一句“ret4”直接返ecxRetAddPopDLL。从这个角度来说,要实现易语言编写易语言者平衡堆栈,STDCALL要求被调用者来平衡堆栈。我们没法选择或设定易语言按哪种调用来编STDCALL编译也能正确返回。但易语言为了让用户使用方便,会在一个函数结束前加入检测变量DLL反汇编该通过反汇编看到易对DLL函数的调用都是间接的,易生成一些保护指针的代码,再将EXEDLL)DLL的编译都是间接调用。DLL反汇编图中“ ”处的“RETN0C”就是造成错误返回的关键代码。重构堆栈就 movesi,esp;指向最后一个局部变量movedi,espsubedi,12;重构堆栈所须的12字节空间movecx,

温馨提示

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

评论

0/150

提交评论