我怕我不写下来,将来我都不记得我还在 c 中嵌套过汇编语言,用汇编代码调用一个c函数的过程。
折腾了一下午,在网上查看相关的资料,然后照葫芦画瓢地在c代码中嵌套汇编,希望解决我所遇到的问题,可最后发现全是徒劳。
根据我的初步了解,在c中嵌套汇编来调用一个c函数的时候, 当c函数的参数过多时, 汇编代码没办法写, 好像对参数的数量有相当大的限制。
下面的代码,如果我将c函数的参数增加到3个时, 汇编代码我就写不出来了, 并不能通过简单的在汇编代码中增加一个参数来实现。
多增加一个参数,编译代码时,就会抛出错误:'asm' operand has impossible constraints| ('asm'操作数有不可能的约束)
我是彻底的放弃了,到此为止吧。
int abc2(int a, int b)
{
printf("\n"); printf("参数a(%d): %d\n", &a, a);
printf("参数b(%d): %d\n", &b, b);
//printf("参数c(%d): %d\n", &c, c);
//printf("参数d(%d): %d\n", &d, d); return a > b ? a : b;
} int main(int argc, char *argv[])
{
void *saved_my_esp, *target_addr;
unsigned int return_eax, return_edx; void *func = abc2; int a = ;
int b = ;
int c = ;
int d = ; printf("&a:%d\n", &a);
printf("&b:%d\n", &b);
printf("&func:%d\n", func); //参考: https://bbs.csdn.net/topics/360148698 __asm__ __volatile__ ( "movl %%esp, %0;" "movl %3, %%eax;" //变量: d
"push %%eax;" "movl %4, %%eax;" //变量: c
"push %%eax;" "movl %5, %%eax;" //函数
"call *%%eax;" "mov %%eax, %1;"
"mov %%edx, %2;"
"movl %0, %%eax;" //"movl %%eax, %%esp;" /** 加这一句, 就出错 **/ : "+m" (saved_my_esp), "=m" (return_eax), "=m" (return_edx) : "r"(b), "r"(a), "r"(func) // 关于 m, r 说明: https://www.cnblogs.com/Jezze/archive/2011/12/23/2299838.html : "%eax", "%edx", "%esp"
); printf("saved_my_esp:%d\n", saved_my_esp);
printf("return_eax:%d\n", return_eax);
printf("return_edx:%d\n", return_edx); printf("\n"); //printf("return_value:'%s'\n", return_eax
//printf("return_value:%d\n", *(int *)return_eax);
//printf("return_value:%lf\n", *(float *)return_eax);
//printf("return_value:%d\n", *(BYTE *)return_eax); printf("return_value:%d\n", return_eax); printf("\n"); printf("------------------end-------------\n"); return ; }
gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过的更多相关文章
-
GCC在C语言中内嵌汇编 asm __volatile__ 【转】
转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...
-
GCC在C语言中内嵌汇编 asm __volatile__
2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报 分类: linux(59) 架构管理(24) C/C++(59) 目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...
-
Linux内核--C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
-
Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】
转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...
-
vs2010 c++中内嵌汇编代码
在研究汇编时,需要自己写点汇编代码测试,用Ollydbg写每次加载程序就没了,不是很方便. 可以考虑直接在程序中写入汇编代码,只需要加上关键字“_asm”宏(C++代码中). 如下示例 编写环境 :v ...
-
IAR EWAR 内联汇编 调用外部函数 Error[Og005], Error[Og006]
How do I call a C function in another module from inline assembler in IAR EWARM? I have a bit of ass ...
-
ARM GCC 内嵌汇编手册
转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...
-
gcc内嵌汇编详解
[作者:byeyear 首发:cnblogs Email:east3@163.com 转载请注明] 有时候我们希望在C/C++代码中使用嵌入式汇编,因为C中没有对应的函数或语法可用. ...
-
GCC嵌入式汇编(内嵌汇编)入门
GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...
随机推荐
-
C# HttpWebRequest获取COOKIES
C# HttpWebRequest获取COOKIES byte[] bytes = Encoding.Default.GetBytes(_post); CookieContainer myCookie ...
-
使用pip安装 cx_Oracle 模块
1. 系统环境,linux, python3.5, pip以下命令的执行均使用root用户. 2. 执行 pip install cx_Oracle出错,提示不能定位Oracle的安装.出现该问题的原 ...
-
android 开发 system/app目录下面有多个重复包名的apk,会不会冲突
环境:已经拥有了root权限的android系统,我们的apk是开机启动 测试:将2个相同的版本拷贝到系统system/app目录下面 adb root #获取root权限,前提是已经开放了root权 ...
-
java学习之IO装饰设计模式
装饰设计模式就是对已有的对象的功能进行增强 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装 ...
-
MySQL用户管理和权限设置
用户管理 mysql>use mysql; 查看 mysql> select host,user,password from user ; 创建 mysql> create user ...
-
C语言之for循环
#include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ int i; for(i=1;i< ...
-
DPI技术简介
匹配模式 根据规则的特点,可以分为两种 特征字符串模式:特征字符串模式实现方法简单,将流量的特征字符串提取出来即可进行流识别,不过此种方式描述性较差,需要将流量特征进行遍历,才可以将流量全部识别出来, ...
-
STL详解
STL概貌 ...
-
eclipse设置成保护眼的背景色
长时间的使用eclipse开发会很累吧 设置一个保护眼睛的豆沙绿色 不刺眼 是不是会更好一些呢 那么如何设置呢现在就教大家 工具/原料 eclipse jdk 方法/步骤 首先打开eclipse ...
-
collections模块(收藏)
collections是Python内建的一个集合模块,提供了许多有用的集合类. 1. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >> ...