




已阅读5页,还剩64页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4部分程序的逻辑流程控制 AssemblyLanguageProgramming 1基本的逻辑控制 无条件转移 AssemblyLanguageProgramming 程序的逻辑控制 顺序执行依照程序的指令顺序直线式执行大多程序是测试分支或者循环执行的前向执行 跳过一些指令执行前面的的指令后向执行 重新执行一些指令这需要通过改变IP 偏移量 实现程序执行的跳转 跳转的地址类型 依据程序执行跳转的距离长短 区分3种地址类型SHORT短相对地址是具有1字节的偏移量 即 128到127字节的长度NEAR近相对地址是具有2字节的偏移量FAR远任意相对地址长度 一般指的是跨段跳转时的偏移量 JMP指令 格式 label JMPshort near faraddress作用 无条件的改变IP使之指向目的地址举例 段内直接 JMPTARGET段内间接 JMPCXJMPWORDPTR BX 段间 JMPFARPTRTARGETJMPDWORDPTR BX SI ExecutingaJump IntrasegmentjumpsarecausedbychangingtheIPregistertoanewvalueShortjumpsaddasigned8 bitdisplacementtoIPNearjumpsaddasigned16 bitdisplacementtoIPIntersegmentjumpschangeboththeCSandIPregistersFarjumpssimplyassignnewvaluestotheseregisters page60 132TITLEA07JUMP COM IllustrationofJMPforlooping MODELTINY CODEORG100HA10MAINPROCNEARMOVAX 00 InitializeAXandMOVBX 00 BXtozero MOVCX 01 CXto01A20 ADDAX 01 Add01toAXADDBX AX AddAXtoBXSHLCX 1 DoubleCXJMPA20 JumptoA20labelA10MAINENDPENDA10MAIN 分析 利用Debug分析JMP和A20的距离 跟踪各个寄存器的数值 LOOP指令 格式 label LOOPshort address动作 CX减去1若CX 0则跳转到目的地址注意 只适用于短地址对标志寄存器没有影响举例 page60 132TITLEA07LOOP COM IllustrationofLOOP MODELSMALL CODEORG100HA10MAINPROCNEARMOVAX 0 InitializeAXandMOVBX 0 BXtozero MOVDX 1 DXto01MOVCX 8 CXfor8loopsA20 INCAX Add01toAXADDBX AX AddAXtoBXSHLDX 1 DoubleDXLOOPA20 DecrementCX loopifnonzeroMOVAX 4C00H EndprocessingINT21HA10MAINENDPENDA10MAIN 例1 LOOP的变种 Loopwhile ZF equal CX 0 LOOPZ LOOPELoopwhile NZ notequal CX 0 LOOPNZ LOOPNE依据ZF是否被设置 进行循环注意 对标志寄存器没有影响 举例 该程序最多从键盘接收9个字符当第9个字符按下 或者enter键按下时 程序结束 MOVAH 1MOVCX 9next char INT21HCMPAL 13LOOPNEnext char 2条件转移逻辑控制 AssemblyLanguageProgramming Recap 标志寄存器 算术 逻辑和比较指令影响各个位的设置保存了当前程序的执行状态 1514131211109876543210 OFDFIFTFSFZF AFPFCF 在转移控制中 经常使用的标志ZF ZeroFlag setiftheresultoftheoperationiszeroCF CarryFlag setifthereiscarryoutoftheadditionoftwounsignednumbersSF SignFlag setiftheresultisanegativenumber 条件转移指令 格式 Jnnnshort address通常条件转移指令列表 JZjumpifzeroZF 1JEjumpifequalZF 1JNZjumpifnotzeroZF 0JNEjumpifnotequalZF 0JCjumpifcarryCF 1JNCjumpifnocarryCF 0JCXZjumpifCX 0CX 0 无符号数 相等equal 高于above 低于below有符号数 相等equal 大于greater 小于less 无符号数转移指令 JAjumpifaboveop1 op2CF 0且ZF 0JNBEjumpifnotbeloworequal op1 op2CF 0JNBjumpifnotbelow op1 op2 CF 1JBEjumpifbeloworequalop1op2 CF 1或ZF 1 有符号数的条件转移 TITLEA07CASE COM Changeuppercasetolowercase MODELSMALL CODEORG100HBEGIN JMPA10MAIN CONAMEDB LASER 12SYSTEMS A10MAINPROCNEARLEABX CONAME 1 1stchartochangeMOVCX 15 No ofcharstochange 举例 字符串的大小写转换 A20 MOVAH BX CharacterfromCONAMECMPAH 41H IsitJBA30 upperCMPAH 5AH caseJAA30 letter XORAH 00100000B Yes convertMOV BX AH RestoreinCONAMEA30 INCBX SetfornextcharLOOPA20 Loop15times Done MOVAH 09H displayLEADX CONAME CONAMEINT21HMOVAX 4C00H EndprocessingINT21HA10MAINENDPENDBEGIN If结构 C C codeif op1 op2 AssemblyImplementation方案1CMPop1 op2JEtrueJMPendiftrue endif 方案2CMPop1 op2JNEendifendif If else结构 C C codeif op1 op2 else AssemblyImplementationCMPop1 op2JNEelseJMPendifelse endif 组合OR条件 C C codeif op1 op2 op3 op4 AssemblyImplementationCMPop1 op2JGL1CMPop3 op4JGEL1JMPL2L1 L2 组合AND条件 C C codeif op1 op2 AssemblyImplementationCMPop1 op2JLEL2CMPop3 op4JLL2L2 While循环结构 C C codewhile op1 AssemblyImplementationwhile CMPop1 op2JGEL1JMPwhileL1 unsignedintn if n 7 do it if n 7 movax ncmpax 7jnaskip it then partcalldo it endifskip it for x 9 x 0 x n x for x 9 x 0 x movcx 9top loop addn cx n n xlooptop loop charn k unsignedintw if nk w 10 whatever if nk w 10 movah ncmpah kjnethen cmpw 10jaend ifthen callwhateverend if charn intw x if n A if n A then partcallwhateverno go intn while n 0 n 2 while n 0 while cmpn 0jleend while loop bodysubn 2jmpwhile end while charn if n 7 do it elsedo that if n 7 cmpn 7 jneelse then partcalldo itjmpshortendifelse calldo thatendif TITLEA06MOVE EXE Repetitivemoveoperations MODELSMALL STACK64 DATAHEADNG1DB InterTech HEADNG2DB9DUP CODEA10MAINPROCFARMOVAX data InitializesegmentMOVDS AX registersMOVES AX MOVCX 09 Initializetomove9charsLEASI HEADNG1 InitializeoffsetaddressesLEADI HEADNG2 ofHEADNG1andHEADNG2A20 MOVAL SI GetcharacterfromHEADNG1 MOV DI AL moveittoHEADNG2INCSI IncrnextcharinHEADNG1INCDI Incrnextpos ninHEADNG2DECCX DecrementcountforloopJNZA20 Countnotzero Yes loop FinishedMOVAH 09H RequestdisplayLEADX HEADNG2 ofHEADNG2INT21HMOVAX 4C00H EndprocessingINT21HA10MAINENDPENDA10MAIN 3堆栈 AssemblyLanguageProgramming 堆栈Stack LIFO数据结构支持PUSH和POP操作作用发生中断处理和过程调用时 保护当前执行的现场 返回时 依据堆栈保存的地址继续执行 堆栈的构造 所有的可执行程序都有堆栈结构堆栈是通过堆栈段寄存器和偏移量访问的一段内存区域SS 指向了堆栈的开始地址SP 指向了堆栈的顶部 堆栈的初始化 堆栈定义的伪指令方法1 The StackDBStack Sizedup 方法2 STACKStack Size例如 stack12 分配预留的堆栈空间大小 SP 000C SS 0340 StackSize 000C 动作 PUSH 压栈操作 减少SPPOP 出栈操作 增加SP PUSH POP PUSH PUSHsourcesource指的是任何16 32位通用或者段寄存器 或者字 双字的地址PUSHForPUSHFD将标志寄存器的内容压栈动作 SP减去2 4在SS SP地址存放source数据 PUSH举例 PUSHAX 3C 09 A4 40 2C FF A2 23 2A 09 46 SP 0006 01 06 4C SS 0340 AX 0123 POP POPdestinationdestination指的是任何16 32位通用或者段寄存器 或者字 双字的地址POPForPOPFD将标志寄存器的内容出栈 存入标志寄存器动作 将SS SP地址的数据拷贝到destinationSP加2 4 POP举例 POPES 3C 09 A4 40 2C FF A2 23 2A 09 46 SP 0008 01 06 4C SS 0340 3C 09 A4 40 2C FF A2 23 2A 09 46 SP 0006 01 06 4C SS 0340 ES 0123 PUSH和POP程序举例 page60 132TITLEPUSHPOP EXE pushandpopanumberofdata 386 MODELSMALL STACK64 DATAfldadw2a45hfldbdw4567h CODEMAINPROCFARmovax datamovds ax movax fldapushax pushwordpushwordptrfldb pushwordfromfldbpopbx popwordtobxpopax popwordtoaxMOVAX 4C00H EndprocessingINT21HMAINENDPENDMAIN 跟踪调试 npushpop exe l RAX 0000BX 0000CX 0018DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B0BES 0B0BSS 0B1DCS 0B1BIP 0000NVUPEIPLNZNAPONC0B1B 0000B81C0BMOVAX 0B1C tAX 0B1CBX 0000CX 0018DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B0BES 0B0BSS 0B1DCS 0B1BIP 0003NVUPEIPLNZNAPONC0B1B 00038ED8MOVDS AX tAX 0B1CBX 0000CX 0018DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B1CES 0B0BSS 0B1DCS 0B1BIP 0005NVUPEIPLNZNAPONC0B1B 0005A10400MOVAX 0004 DS 0004 2A45 tAX 2A45BX 0000CX 0018DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B1CES 0B0BSS 0B1DCS 0B1BIP 0008NVUPEIPLNZNAPONC0B1B 000850PUSHAX DSS 00L400B1D 0000CA007603E9F800E8 C229A33437050300 v 47 0B1D 00102BD2010614381116 1638A15C3624FE2D 8 8 6 0B1D 00208000A80175573D4A 007752932EFFA731 uW J wR 10B1D 00305F875F87452A452A 000008001B0B2D05 E E t 堆栈的越界Over Underflow 处理器没有对堆栈进行非法操作检查程序一般需要考虑堆栈的错误检查OverflowoccurswhenSPissmallerthantheaddressofthestartofthestackarrayUsuallythismeansSPisdecrementedpast0 UnderflowoccursifSPgetsbiggerthanitsstartingvalue OutOfBounds StackOverflowStackUnderflow SP 000D SS 0340 StackSize 000C SP FFFE SS 0340 StackSize 000C 4过程Procedure AssemblyLanguageProgramming 模块化编程和过程 过程相当于C C 语言中的函数作用 模块化编程代码重用信息的包装和隐藏便于组织 调试和维护程序 过程的定义 proc namePROCtype 过程体RET 返回调用处proc nameENDPtype对应的值NEAR或FAR默认为NEAR过程的定义中可能含有一个或者多个RET 近过程调用和返回 调用过程 NEAR CALLproc name把当前IP的内容压栈SP SP 2movethecontentsofIPtolocationsSP SP 1将proc name地址拷贝到IP中过程返回 NEAR RET将栈顶数据出栈到IP中movethecontentsoflocationsSP SP 1intoIPSP SP 2 远过程 调用 FAR CALLproc name将当前CS和IP内容入栈将远地址拷贝到CS IP中返回 FAR RET将栈顶的数据依次出栈到IP和CS中注 远过程调用最后涉及 现在只是讲述近过程调用 近过程调用举例 page60 132TITLEA07CALLP EXE Callingprocedures MODELSMALL STACK64 DATA CODEA10MAINPROCFARCALLB10 CallB10 MOVAX 4C00H EndprocessingINT21HA10MAINENDP B10PROCNEARCALLC10 CallC10 RET ReturntoB10ENDP caller C10PROCNEAR RET ReturntoC10ENDP caller ENDA10MAIN 跟踪调试 na07callp exe l RAX 0000BX 0000CX 000DDX 0000SP 0040BP 0000SI 0000DI 0000DS 0B0BES 0B0BSS 0B1CCS 0B1BIP 0000NVUPEIPLNZNAPONC0B1B 0000E80500CALL0008 tAX 0000BX 0000CX 000DDX 0000SP 003EBP 0000SI 0000DI 0000DS 0B0BES 0B0BSS 0B1CCS 0B1BIP 0008NVUPEIPLNZNAPONC0B1B 0008E80100CALL000C tAX 0000BX 0000CX 000DDX 0000SP 003CBP 0000SI 0000DI 0000DS 0B0BES 0B0BSS 0B1CCS 0B1BIP 000CNVUPEIPLNZNAPONC0B1B 000CC3RET 过程调用数据上下文的保护 寄存器的内容是过程运行的上下文假如过程A调用过程B 过程B一开始应该保存过程中所有使用的寄存器过程B在返回之前 应该恢复所保存的数据这样过程A调用过程之后具有一致的上下文使用堆栈的操作进行数据上下文保护 数据上下文保护举例 page60 132TITLEREGSAVE EXE Savingregistersinprocedures MODELSMALL STACK64 DATA CODEA10MAINPROCFARMOVAX dataMOVDS AXMOVAX 3456HCALLB10 CallB10CMPAX 3456HMOVAX 4C00H EndprocessingINT21HA10MAINENDP B10PROCNEARPUSHAXMOVAX 0ABCDHCALLC10CMPAX 0ABCDHPOPAXRET ReturntoB10ENDP caller C10PROCNEARPUSHAXMOVAX 23ADDAX 45POPAXRET ReturntoC10ENDP caller ENDA10MAIN 跟踪调试 nregsave exe l RAX 0000BX 0000CX 0028DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B0BES 0B0BSS 0B1ECS 0B1BIP 0000NVUPEIPLNZNAPONC0B1B 0000B81D0BMOVAX 0B1D tAX 0B1DBX 0000CX 0028DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B0BES 0B0BSS 0B1ECS 0B1BIP 0003NVUPEIPLNZNAPONC0B1B 00038ED8MOVDS AX tAX 0B1DBX 0000CX 0028DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B1DES 0B0BSS 0B1ECS 0B1BIP 0005NVUPEIPLNZNAPONC0B1B 0005B85634MOVAX 3456 tAX 3456BX 0000CX 0028DX 0000SP 0040BP 0000SI 0000DI 0000DS 0B1DES 0B0BSS 0B1ECS 0B1BIP 0008NVUPEIPLNZNAPONC0B1B 0008E80800CALL0013 DSS 00L400B1E 00002BD2010614381116 1638A15C3624FE2D 8 8 6 0B1E 00108000A80175573D4A 007752932EFFA731 uW J wR 10B1E 00205F875F875F7D5F7D 5F8C5F915FAC5FB1 0B1E 00305FB65F7D5F7D5634 000008001B0B2D05 V4 t 过程间参数的传递 当调用过程时 两种主要的方法实现过程参数的传递 值传递 传递实际的数据值引用传递 传递数据的地址这两者可以利用寄存器或者堆栈实现C语言的形式值传递shortintabc10 shortint 引用传递shortintabc10 shortint 值传递参数 寄存器实现 movax multiplicandmovbx multipliercallm30mult m30multprocnearmulbx resultisaxretm30multendp 通过寄存器传递参数值 值传递参数 堆栈实现 pushmultiplicand putparamentersontothestackframepushmultipliercallm30mult m30multprocnearPUSHBP savebpofthecallingprocedureMOVBP SP freezespintobpMOVAX BP 6 usebptoaccessparametersMULWORDPTR BP 4 resultisinaxPOPBP restorebpofthecallingprocedureRET4 returnandincreaseSPby4 todiscardtheinputparametersm30multendp 解释 将SP拷贝到BP非常重要 因为SP一直随着push pop和ret等操作而发生变化 而BP作为调用过程的堆栈的基地址 一般保持不变 因此BP适合作为访问参数和局部变量使用 POPBP恢复调用时堆栈的基地址最后返回时 SP SP 4将传递的参数移除掉 同时恢复调用时IP的内容 引用参数传递 寄存器 LEABX multiplicandLEASI multipliercallm30mult m30multprocnearMOVAX BX getthevauleindirectlyMULWORDPTR SI resultisaxRETm30multendp 引用参数传递 堆栈 pushoffsetmultiplicand putparamenterreferencespushoffsetmultiplier ontothestackframecallm30mult m30multprocnearpushbp savebpofthecallingproceduremovbp sp freezespintobpmovbx bp 6 gettheaddressofthemultiplicandmovdi bp 4 gettheaddressofthemultipliermovax bx getthevalueofthemultiplicandmulworkptr di resultisinaxpopbp restorebpofthecallingprocedureret4 returna
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025北京市高校毕业生到农村从事支农工作招聘473人考前自测高频考点模拟试题完整答案详解
- 2025年甘肃省平凉市华亭市第二人民医院招聘编外人员模拟试卷及答案详解(夺冠系列)
- 2025年物业高空作业试题及答案
- 企业管道建设施工方案
- 2025年甘肃省平凉市泾川县丰台镇考聘大学生村文书考前自测高频考点模拟试题及答案详解(有一套)
- 互联网咨询笔试方案
- 从严治团演讲稿
- 仓储管理制度下载软件
- 书法绘画演讲稿
- 公交窗口笔试题目及答案
- 2024年河南郑州高新区招聘社区工作人员笔试真题
- 财务部门增值税发票管理操作手册
- 2025版静脉输液治疗实践指南
- 骨科术后并发肺栓塞护理
- 2025年融媒体中心招聘考试笔试试题(60题)含答案
- 社区工作者网格员考试题库及答案
- 快乐主义伦理学课件
- 医学高级职称晋升答辩
- 运筹学:原理、工具及应用肖勇波习题答案(可编辑)
- 35kv变电站培训课件
- 政务内网管理办法
评论
0/150
提交评论