我怕我不写下来,将来我都不记得我还在 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函数: 只是证明曾经我来过的更多相关文章

  1. GCC在C语言中内嵌汇编 asm __volatile__ 【转】

    转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...

  2. GCC在C语言中内嵌汇编 asm __volatile__

    2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报  分类: linux(59)  架构管理(24)  C/C++(59)  目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...

  3. Linux内核--C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  4. Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】

    转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...

  5. vs2010 c++中内嵌汇编代码

    在研究汇编时,需要自己写点汇编代码测试,用Ollydbg写每次加载程序就没了,不是很方便. 可以考虑直接在程序中写入汇编代码,只需要加上关键字“_asm”宏(C++代码中). 如下示例 编写环境 :v ...

  6. 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 ...

  7. ARM GCC 内嵌汇编手册

    转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...

  8. gcc内嵌汇编详解

    [作者:byeyear    首发:cnblogs    Email:east3@163.com    转载请注明] 有时候我们希望在C/C++代码中使用嵌入式汇编,因为C中没有对应的函数或语法可用. ...

  9. GCC嵌入式汇编(内嵌汇编)入门

    GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...

随机推荐

  1. 去掉eslint代码校验

    找到.eslintrc文件,去掉extend下面的'@vue/standard'.

  2. Markdown温故知新(0):导航目录

    Markdown温故知新(0):导航目录 Markdown温故知新(1):Markdown面面观 Markdown温故知新(2):详解七大标准语法 Markdown温故知新(3):六个实用扩展语法 M ...

  3. ASP.NET CORE 2.2 因外键设置的双向导航对象序列化报 循环错误问题的解决

    报错如下: 设置的示例: 解决方案: 在Startup.cs文件中,增加如下代码: services.AddMvc().SetCompatibilityVersion(CompatibilityVer ...

  4. 架构师小跟班:如何高效又安全的清理Linux服务器上的缓存?

    操作服务器上的生产环境,一定要慎之又慎,安全第一,优化第二! 一些基本原理 说到清理内存,那么不得不提到/proc这一个虚拟文件系统,这里面的数据和文件都是内存中的实时数据,很多参数的获取都可以从下面 ...

  5. android studio学习----构建(gradle )依赖时使用动态依赖的问题

    今天在看Dan Lew大神的博客发现最新的文章就是 “Don't use dynamic versions for your dependencies” Everyone, please, to st ...

  6. 各主流摄像头的rtsp地址格式

    海康威视rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例 ...

  7. Global variable in ABAP function group

    Function group is loaded into runtime memory by the FIRST call of a function module inside this func ...

  8. elasticsearch查询篇索引映射文档数据准备

    elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...

  9. C++ OpenSSL 之二:生成RSA文件

    1.等同于生成private key: openssl genrsa -out "save_path" 2048 2.代码如下 bool MakeRsaKeySSL(const c ...

  10. Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )【转】

    函数原型 string.find(s, pattern [, init [, plain]] ) s: 源字符串 pattern: 待搜索模式串 init: 可选, 起始位置 plain: 我没用过 ...