我是靠谱客的博主 哭泣时光,最近开发中收集的这篇文章主要介绍使用汇编语言实现if else 循环 函数调用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

需要使用汇编来演示如下代码 需要下载ollydbg汇编调试器 点击File-Open随意打开一个exe文件 我这里随便找到c:/windows/explorer.exe文件


这里EIP的值表示下一次运行需要执行的代码位置


双击 EIP红色地址 左边代码会自动跳转到对应的代码行  有了以下环节 接下来添加代码


如果替换的代码 占用的字节数 小于原始的代码数 会自动补充 nop空指令

一。实现 if else 

MOV EAX,1 表示将1立即数 设置给EAX寄存器

CMP EAX,1 比较EAX的值和1是否相等 Z标志位(如果减法运算 结果为0 该标志被置为1 不为0 标志位被置为0) 这里EAX=1 Z标志=1

JE 0101A572 表示有条件跳转 当Z标志=1(也就是EAX=1) 自动跳转到后面指定的0101A572 地址 就会执行 move EBX,1 

JNE 0101A578 表示有条件跳转 当Z标志=0(也就是EAX!=1) 自动跳转到后面指定的0101A578 地址 就会执行 move ECX,1 


如果需要调试 参考如下图



二。实现 循环

MOV ECX,4 表示将4立即数 设置给ECX寄存器

DEC ECX 将ECX的值 减去1 

TEST ECX,ECX TEST指令是将ECX和ECX进去逻辑与 操作 1001&1001一定是自己1001 只有当ECX等于0时 0&0就是0 这个test指令 会修改Z标志

位  如果ECX等0  那么逻辑与 Z标志位就是1  ECX不等于0  Z标志位等于0 所以TEST ECX,ECX可以判断ECX是否为0

JNE 0101A564 表示有条件跳转 当ECX!=0时 z标志位=0 跳转到0101A564这个位置 继续递减 一直循环到 ECX=0时 此时z标志位=1 

不执行跳转循环结束 


也可以使用  LOOP 跳转的位置来进行循环 该指令会自动将ECX的值 递减1 不需要单独控制ECX递减 当ECX递减到0时自动退出循环

loop 


二。实现 函数调用

这里需要明白一下函数调用的实际过程 是先将 参数压入栈中 在c语言中 stdcall 先压入函数右边的参数  这里假设有两个参数10和20

栈的原理是 先入后出  压入两个参数后  call指令会自动压入 函数调用完成后 下一个执行指令的位置

PUSH 10 压入第一个参数

PUSH 20 压入第二个参数

CALL 0101A56D 调用函数 函数的入口地址是0101A56D 可以查看如下图片中右下角堆栈的部分 分别压入了 10,20 以及call后面的一句代码的地址

 0101A568 也就是call完成了执行0101A568 这里的代码

call 0101A56D  会自动跳转到0101A56D  代码的位置 这里取出栈中(ESP指向栈顶 栈顶是call完成后返回的地址) ESP栈顶+4(第二个参数) ESP栈顶+8(第一个参数)

retn 8 表示 函数返回 返回 就会自动跳转到栈顶指向的地址的代码位置0101A568 就会执行 (8这个数 表示自动将堆栈中两个参数的值出栈 抛弃)

jmp 0101A57A










最后

以上就是哭泣时光为你收集整理的使用汇编语言实现if else 循环 函数调用的全部内容,希望文章能够帮你解决使用汇编语言实现if else 循环 函数调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部