C和汇编混合编程---栈平衡

最近在搞C和汇编混合编程,对栈平衡有点小理解,记录一下

  1. 当我们调用一个API或者子程序时时,API和子程序可以理解为函数,我们不必在返回的时候平衡栈里面的函数参数,但C语言库函数要我们自己平衡栈数据,
    比如下面的程序:
#include "stdio.h"
#include "windows.h"int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="user32.dll";libHandle=LoadLibrary(dll);__asm{xor ebx,ebxpush ebxpush 0x61626364push 0x65666768mov  eax,esppush ebxpush eaxpush eaxpush ebx	mov  eax,dword ptr[MessageBox]call eax//mov esp,0x450add esp,12}return 0;
}

这段程序的功能是弹出MessageBox,我们最后平衡栈数据用到add esp,12,为什么是12呢?一共push了7次,应该是28啊!因为在stacall标准中,我们是不用考虑MessageBox参数的,MessageBox一共4个参数,

	push ebxpush eaxpush eaxpush ebx	

这4个push是不用我们管得,所以是12。但有一个我们要注意就是wsprintf,这个需要我们自己去平衡栈里面的参数数据
下面是调试的结果:
在运行到push 0x65666768,esp的值是
在这里插入图片描述
当运行完call eax,esp的值
在这里插入图片描述
两个值是相同的

调用C语言库函数时:


#include "stdio.h"
int main(){char *str="hello\n";__asm{push strcall printf}return 0;
}

在这里插入图片描述

  1. 进入asm和出asm时,esp的值要相同。比如说,我们程序进入__asm后,esp的值是0,那么在出asm时,一定要让esp的值变成0。
    上面的程序,假设执行 xor ebx,ebx前,esp=0,当我们出asm时,esp的值一定要为0,不然会报错,上面的add esp,12就是这个目的,如果我们把这个去掉,在运行,就会报下面的错误
    在这里插入图片描述
    在举个例子:

int main(){__asm{push 0;}return 0;
}

这段程序也会报上面的错误

写在最后:
这些是和同学讨论出来的,如果有什么不对的地方希望指出来

自己很菜,在学了点汇编后,自己摸索C和汇编混合编程的,很多东西还不懂,会继续努力的。

以后会继续补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[导入]2006年10大变态站名网站排名

作者: 马国良 | 2006年11月14日13时31分 | 【内容提要】第一名:妈妈说…… 入选原因:单看了两个域名就让人觉得变态“妈妈说就算你注册的域名再长google都能搜索出来”(mamashuojiusuannizhucedeyumingzaichanggoogledounengsousuochulai.cn)…

如何创建Java程序

(1),点击 (2),点击OK (3),File->New->Project… (4),Java Project->Next> (5),Project name随便填(这里以qweqwe为例) 然后Finish (6),鼠标右击qweqwe(随便名称都可以)->New->Class (7),同理,…

改变地址栏图标

<link rel"icon" href"/favicon.ico" type"image/x-icon" />转载于:https://www.cnblogs.com/heshuiping/archive/2011/06/04/2072515.html

在JavaScript中以日期/月/年格式获取当前日期

在JavaScript中获取当前日期 (Getting current date in JavaScript) To get the current date in JavaScript, we need to use three library functions of Date class, 要在JavaScript中获取当前日期 &#xff0c;我们需要使用Date类的三个库函数&#xff0c; Date getDate()…

c语言数据转移,重温C语言(2)之数据

一 数据类型数据就是代表某些信息的数字和字符。按计算机的储存方式可分为两大基本类型&#xff1a;整数类型和浮点数类型。1 关键字初始C90C99intsigned_Boollongvoid_Complexshort_Imaginaryunsignedcharfloatdouble2 存储单元首先得记住&#xff0c;计算机内部都是以二进制进…

对esp和ebp分析来了解函数的调用过程

esp&#xff1a;扩展栈指针寄存器&#xff0c;是指针寄存器的一种&#xff0c;用于存放函数栈顶指针&#xff08;栈顶指针&#xff09; ebp&#xff1a;扩展基址指针寄存器&#xff0c;也被称为帧指针寄存器&#xff0c;用于存放函数栈底指针&#xff08;栈底指针&#xff09;。…

放大镜,缩小镜

今天看了 CSDN上的很多文章&#xff0c;有很经典的&#xff0c;也有比较一般的&#xff0c;加上昨天我们老大发给我看的一些CEO的讲话内容的文章&#xff0c;突然发现&#xff0c;不知道是这个行业内部的问题还是整个国内评论家门的问题&#xff0c;在讨论和研究一个问题的时候…

SEO你所不知道的!!SEO资源人脉才是王道

头脑在个人身上&#xff0c;思维在自己脑中&#xff0c;自己为什么要老是听从别人的话语呢?别人让你往西&#xff0c;你就直奔西处吗?这是我以前犯下的一个错误&#xff0c;总感觉自己好像就是再为 别人而用&#xff0c;自己的理想目标何在?因为刚入社会&#xff0c;遇到这样…

仿射变换 c语言,c语言数字图像处理(三):仿射变换

仿射变换及坐标变换公式几何变换改进图像中像素间的空间关系。这些变换通常称为橡皮模变换&#xff0c;因为它们可看成是在一块橡皮模上印刷一幅图像&#xff0c;然后根据预定的一组规则拉伸该薄膜。在数字图像处理中&#xff0c;几何变换由两个基本操作组成&#xff1a;(1)坐标…

C和汇编混合编程----实现浮点数的加减乘除

加法 C程序&#xff1a; #include "stdio.h"int main() {float a1.0;float b2.34;float c;cab;printf("c%f",c);return 0; }反汇编之后&#xff0c;实现加法的关键程序 5: float a1.0; 00401028 C7 45 FC 00 00 80 3F mov dword ptr [eb…

java删除指定索引元素_将对象/元素添加到列表中的Java指定索引处

java删除指定索引元素We have to create a List and add objects/elements to the List and given indexes in java. 我们必须创建一个List并将对象/元素添加到该List中&#xff0c;并在Java中添加给定的索引。 To add any object/element at given index to the List, we use…

使用ActiveX读取客户端mac地址

//保存为html文件<HTML><HEAD><TITLE>获取客户端MAC和用户名</TITLE><META http-equivContent-Type content"text/html; charsetgb2312"><SCRIPT languageJScript event"OnCompleted(hResult,pErrorObject, pAsyncContext)&qu…

【Wordpress】分享500多款国外WordPress经典主题 其之三

从国外网站上淘来的WordPress主题&#xff0c;以前都是放在本人博客xcodeland.mooo.com上的后来空间挂掉了就转到这里来与大家分享。 modernclean 下载地址 just-business 下载地址 redrum 下载地址 aneducation 下载地址 artsie 下载地址 eveningalone 下载地址 wasabi …

python 微秒_Python程序可显示当前时,分,秒和微秒

python 微秒In the below example – we are implementing a python program to print current hour, minute, second and microsecond. 在下面的示例中-我们正在实现一个python程序来打印当前时&#xff0c;分&#xff0c;秒和微秒 。 Steps: 脚步&#xff1a; Import the d…

终于知道RTM的含义了

从关注VS 2005开始&#xff0c;注意到RTM、RC这几个缩写&#xff0c;一直没找到是什么意思。今天终于知道了含义&#xff1a;RTM&#xff1a;Release To Manufacturing意味着开发工作已结束, RTM 版将提供给发行商、OEM 硬件厂商、驱动程序开发者、独立软件开发者等。RC&#x…

C和混编混合编程----strcpy缓存溢出原理

今天老师给了一到程序&#xff0c;让我们分析分析原理&#xff0c;关于strcpy缓存溢出原理的&#xff0c;反汇编一遍遍调试&#xff0c;终于看明白了&#xff0c;记录一下 C程序&#xff1a; #include "string.h" #include "stdio.h" char *shellcode&quo…

16进制的简单运算

描述 现在给你一个16进制的加减法的表达式&#xff0c;要求用8进制输出表达式的结果。 输入 第一行输入一个正整数T&#xff08;0< T<100000&#xff09; 接下来有T行&#xff0c;每行输入一个字符串s&#xff08;长度小于15)字符串中有两个数和一个加号或者一个减号&…

逝去的大学生活自己丢了什么

1.一个HP电脑包挂在外面的阳台 2.一个蚊帐 3.乱七八糟的垃圾 4.两双篮球鞋 5.一台电脑桌送给了阿姨&#xff0c;不到一会儿就消失不见了 6.一辆自信车给了好朋友 7.三个水果筐给了阿姨 这么大方的丢东西丢的最多的一次 祭奠我逝去的大学&#xff0c;祭奠我丢失的东西&#xff0…

android 中文api 在线测试,android webview测试方法

利用chromedriver操作webview1.创建chrome serverchromedriver --url-basewd/hub --port9515 --adb-port50372.创建sessionPOST http://127.0.0.1:9515/wd/hub/session参数&#xff1a;{"desiredCapabilities":{"chromeOptions":{"androidPackage&quo…

几篇介绍在页面中引用脚本文件的技术文档

在一个页面中包含一个脚本文档是多么简单的一件事&#xff0c;但今天看了几篇文章后&#xff0c;才发现在一个这么简单的功能也有这么多的技巧可谈&#xff0c;以下是这几篇文章挣脱浏览器的束缚&#xff08;1&#xff09; - 前言挣脱浏览器的束缚&#xff08;2&#xff09; - …