C语言extern引用AT&T汇编中的变量,任意转换类型

今天研究出了一个小问题,在C语言里引用汇编的变量,会是什么结果,汇编中的变量没有像C语言中int类型那样的类型约束,可以把数据当作任何类型处理,那么传到C语言中我们应该当作什么类型处理呢。 换句话说,在汇编里定义变量var,在C语言里引用,我们肯定要用extern声明var外部变量,那么extern后面接什么类型?是extern int var吗?还是 extern short var。 以下内容需要注意C语言和汇编语言混合编译的方法,gcc test.s main.c 这样直接调用gcc处理汇编和C语言文件就可以自动搞定了。 实例一 汇编程序:(是的,就这么短小) .global var #注意现在的汇编器不再要求被C语言引用的变量名前加下划线 .data var: .fill 10,4,9 #填充10个单元,每个单元4字节,每个单元的值为9 C语言: #include <stdio.h> extern int var;…

GCC 内联汇编约束字符 m 的用法

首先是这么一段代码(例一): #include<stdio.h> void main() { char c; //int tmp; char *s="abcdefg"; asm("movb %1,%0\n\t" :"=d"(c) :"m"(*s)); printf("out:%c\n",c); } 这段代码运行后会出现什么结果呢?很显然,是out:a ​但是"m"(*s)…

Linux下用C语言调用GAS汇编——综合实例

紧接上一篇博文,上篇写的是用GAS汇编调用C语言,这次讲用C语言调用GAS汇编。​还是同样的功能,实现两个数值的交换,把参数从C语言传递进汇编,再用C语言接收从汇编函数返回的返回值,返回值又分为普通整数返回值和字符串返回值。 ​首先建立三个文件,分别为main.c、retstr.s、swapint.s。其中main.c是C语言文件,也就是主函数所在,swapint.s是汇编函数,用于交换两个变量的数值并返回一个整数值给C语言函数,retstr.s也是汇编语言函数,用于演示汇编语言输出屏幕提示,采用了直接写入stdout和调用C库两种方式,之后返回一个字符串给C语言函数。 main.c的代码如下: #include<stdio.h> char *retstr(); #C程序默认函数返回值为整数值,这里要声明下,应该是字符串指针。 int main() { int a; int b; int c; char *str; a=10;…

Linux汇编GAS调用C语言函数实例

Blum的书上只讲了C语言调用汇编,没讲汇编调用C语言。我自己尝试了下。最终试验成功了,在此写出与大家分享。期间历经无数错误,无数异常,好在最后成功了。 程序实现一个换值功能,在main.s里定义a=10,b=20,然后调用C语言函数把a,b换值。 新建两个文件分别为main.s和pro.c。 main.s的代码如下: .section .data a: .int 10 b: .int 20 .section .text .globl main .type main,@function #别忘了这句,因为main汇编函数也是被crt0.s调用的,main本质上也是个函数 main: movl $a,%eax movl $b,%ebx pushl %ebx pushl…