C指针原理(7)-C内嵌汇编
来源:互联网 发布:陈一发知乎 编辑:程序博客网 时间:2024/06/05 10:56
如何在内联汇编中访问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属于需要改动的寄存器
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
- C指针原理(7)-C内嵌汇编
- C指针原理(6)-C内嵌汇编
- C指针原理(8)-C内嵌汇编
- C指针原理(9)-C内嵌汇编
- c内嵌汇编
- C指针原理(1)-AT&T汇编
- C指针原理(2)-AT&T汇编
- C指针原理(3)-AT&T汇编
- C指针原理(4)-AT&T汇编
- C指针原理(5)-AT&T汇编
- C指针原理(28)-AT&T汇编
- C指针原理(29)-AT&T汇编
- C指针原理(94)-汇编基础(1)
- C指针原理(95)-汇编基础(2)
- C指针原理(27)-汇编分析C指针机制
- /*************** C内嵌汇编示例 ***************/
- C内嵌汇编简介
- C内嵌汇编简介
- 在windbg中测试shadow ssdt , win32k!NtUserGetForegroundWindow , hook shadow ssdt
- java char类型 研究
- Java中获取键盘输入值的三种方法
- Arm Linux交叉编译和连接过程分析(1)
- 为动态创建的LinkButton加Onclick事件
- C指针原理(7)-C内嵌汇编
- 简单的RPC java实现
- java学习脚印:集合(Collection)之算法
- OpenCV问题集结版
- ADO和ADO.NET的区别
- Arm Linux交叉编译和连接过程分析(2)
- vs08新建win32空白项目 属性设置
- 详解排序算法C语言代码实现之选择排序法
- JAVA线程状态