汇编invoke和call的关系
win32汇编里面,我们既可以用invoke也可以用call调用子程序/函数,不过invoke使用简单方便,所以绝大多数情况我们都用invoke。
但是很多人只是知道使用它,对它却不是很了解。我以前对这个问题也是一直没搞透彻,说实话,之前借的汇编书讲解的实在有些烂,NND连个上机调试的方法都没有。学东西,找一本好书还是蛮重要的。
invoke伪指令其实是MASM为了我们方便调用API,只是把我们的书写格式简单化了。当程序编译后,编译器还是会把它汇编成几条push语句和一条call语句,所以它和先push参数后call的结果是没有差别的。
以两个最简单的HelloWorld为例来比较。
;FILE:MSG-A.ASM
.386
.model flat,stdcall
option casemap:none
include
windows.inc
include
user32.inc
includelib user32.lib
include
kernel32.inc
includelib kernel32.lib
.data
sztitle db 'By Invoke!',0
szctent db 'Hello,zerosoul!',0
.code
start:
lea eax,sztitle
lea ebx,szctent
invoke MessageBox,NULL,ebx,eax,MB_OK
invoke ExitProcess,NULL
end start
;MSG-B.ASM
.386
.model flat,stdcall
option casemap:none
include
windows.inc
include
user32.inc
includelib user32.lib
include
kernel32.inc
includelib kernel32.lib
.data
sztitle db 'By Push!',0
szctent db 'Hello,zerosoul!',0
.code
start:
lea eax,sztitle
lea ebx,szctent
push MB_OK
push eax
push ebx
push NULL
call MessageBox
push NULL
call ExitProcess
end start
这两个HelloWorld的区别就是A程序直接用invoke调用API,B程序先push参数,然后用call函数。
为了保持程序的一致性,我都先把参数地址用lea eax,sztitle,lea ebx,szctent传入了eax,ebx。
然后用ml /c /coff MSG-1.ASM,link /subsystem:windows
MSG-A.obj,分别编译和连接这两个程序,双击运行正常
然后我们把这连个程序分别放到OllyDBG里面反汇编看看它们的机器码,结果证明他们编译以后的机器码几乎是完全一样的!
Tips:用call调用函数后,很多人会想到堆栈平衡的问题。由于我们这里用的是StdCall,堆栈平衡的工作由子程序来完成,所以我们调用的时候可以不用使用add ESP,8这样的语句手动恢复堆栈。
汇编invoke和call的关系的更多相关文章
- 汇编,寄存器,内存,mov指令
一.代码 和 汇编 和 二进制之间的关系 二.复习一下计算机组成原理的知识 1.寄存器 计算机中有三个存储 32位cpu提供的寄存器有三种类型8位 16位 32位 64位的只是32位的扩展 并且程序大 ...
- Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization
用于理解恶意软件的内部工作原理,并发现系统中的漏洞,逆向工程是一种耗费人工的却很重要的技术.汇编克隆搜索引擎是通过识别那些重复的或者已知的部件来帮助逆向工程师的工作,要想设计健壮的克隆搜索引擎是一项挑 ...
- Tomcat组成与工作原理
laosijikaichele 关注 0.2 2018.06.02 10:44 字数 5175 阅读 2798评论 0喜欢 8 原文:https://juejin.im/post/58eb5fdda ...
- 【原创】NES第一波:如何用通用型6502宏汇编器,制用NES/FC游戏。
在163的博客关了呀.在这边重新开张了. 以后若网友有什么要长篇解答的问题,也在这儿作答. 作为第一波原创文章,我打算做一次小白示范.那就是一步一步的展示某个汇编编译器的用法. 一.科普 很多人认为程 ...
- golang的select典型用法
golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作. 示例: ch1 := make (chan in ...
- 万字长文:从计算机本源深入探寻volatile和Java内存模型
万字长文:从计算机本源深入探寻volatile和Java内存模型 前言 在本篇文章当中,主要给大家深入介绍Volatile关键字和Java内存模型.在文章当中首先先介绍volatile的作用和Java ...
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系 动态库内存管理 动态链接库搜索顺序 符号解析和绑定 strlen函数的汇编实现分析
Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...
- [汇编与C语言关系]1.函数调用
对于以下程序: int bar(int c, int d) { int e = c + d; return e; } int foo(int a, int b) { return bar(a, b); ...
随机推荐
- JAVA开发:分享一些SpringMvc+Ibatis+spring的框架使用心得
近期不在做.net的项目,而是使用java作为开发语言,就想着要用springmvc开发了,由于前些年也用过struts1/2+hibernate/ibatis+spring开发过项目,因此是有些底子 ...
- 【转】Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline
相信大家对LinearLayout已经相当熟悉,但你们是否了解它的属性baselineAligned呢? Android官方文档是这么描述的:
- 把CheckedListBoxControl设置为单选框
private void chkControl_ItemChecking(object sender, DevExpress.XtraEditors.Controls.ItemCheckingEven ...
- using System.Reflection;
基础代码: public interface IDBHelper { void Query(); } public class DBHelper : IDBHelper { public int Id ...
- C#判断输入的是否是汉字
第一种方法:正则表达式 string text = "是不是汉字"; for (int i = 0; i < text.Length; i++) { if (Regex.Is ...
- 急缺【jQuery】人才,要求熟悉jQuery,熟悉Js,熟悉前端开发
是一份兼职 是与jQuery相关的写作任务,有写作兴趣的欢迎站短(有blog者优先). 要求就是熟悉js和jquery,项目经验丰富(项目经验一定要丰富). 钱不多,不到1W,如果月薪超过1W的,我想 ...
- java web 简单的分页显示
题外话:该分页显示是用 “表示层-控制层-DAO层-数据库”的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指 ...
- 一种好的持久层开发方法——建立BaseDao和BaseDaoImpl
使用hibernate开发持久层时,我们会发现:虽然entity类的含义和需求不同,其对应的Dao层类对应的方法也是不同的.但是有许多方法操作确实相同的.比如实体的增加,删除,修改更新,以及许多常用的 ...
- easyui知识累计.递增.
(001) 偶然发现 easyui 1.4.4 版本以下在使用easyloader时的一个bug(声明:只有在使用easyloader加载模块时有此问题) : (只测试过1.4.2, 1.4.3, 1 ...
- flex_播放视频_本地_与_FMS端
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...