C/C++知识点之C指针原理(7)-C内嵌汇编
小标 2019-02-19 来源 : 阅读 638 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C指针原理(7)-C内嵌汇编,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C指针原理(7)-C内嵌汇编,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

如何在内联汇编中访问C程序的局部变量呢,请看下面这段代码。


#include <stdio.h>
int main(void){
   //不使用全局变量,必须使用扩展GNU的asm
   //格式为:asm("汇编代码":输出位置:输入位置:改动的寄存器列表)
   //a为eax,ax,al;b为ebx等;c为ecx等;d为edx等;S为esi或si;D为edi或di
   //+读和写;=写;%如果必要,操作数可以和下一个操作数切换;&在内联函数完成之前,可以删除或重新使用操作数
    int xa=6;
    int xb=2;
    int result;
    //ansi c标准的asm有其它用,所以用__asm__,__volatile__表示内联汇编部分不用优化(可以用volatile,但是ansi c不行),以防优化破坏内联代码组织结构
    asm volatile(
    "add %%ebx,%%eax\n\t"
    "movl $2,%%ecx\n\t"
    "mul %%ecx\n\t"    
    "movl %%eax,%%edx"
     :"=d"(result):"a"(xa),"b"(xb):"%ecx");//注意扩展方式使用2个%表示    
    printf("%d\n",result);
    return 0;
}


这个例子完成这个计算:(xa+xb)2=(6+2)2=16


     不使用全局变量与汇编代码交互,我们必须使用扩展GNU的asm ,格式为:


      asm("汇编代码":输出位置:输入位置:改动的寄存器列表)   


       汇编代码中涉及寄存器部分的使用2个“%”,如:使用%%eax表示eax寄存器


       输出位置、输入位置的特殊命名规则为:


      a为eax,ax,al;b为ebx等;c为ecx等;d为edx等;S为esi或si;D为edi或di   


      +读和写


      =写


      %如果必要,操作数可以和下一个操作数切换


      &在内联函数完成之前,可以删除或重新使用操作数


    上述代码中,汇编代码部分为


    输出位置、输入位置、改动的寄存器列表部分为:
     :"=d"(result):"a"(xa),"b"(xb):"%ecx"


     先来看汇编代码部分,使用双%号表示寄存器,比如:


     "add %%ebx,%%eax\n\t"


      关于输出位置、输入位置部分,可以这么理解:将变量与寄存器绑定,绑定后,对寄存器的操作就是对变量的操作。


       :"=d"(result):"a"(xa),"b"(xb)


       将result与寄存器edx绑定,xa与寄存器eax绑定,xb与寄存器ebx绑定。
       %ecx属于需要改动的寄存器

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程