LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1267|回复: 7

c语言行内汇编问题

[复制链接]
发表于 2006-1-23 19:57:16 | 显示全部楼层 |阅读模式
一个简单得c语言程序,在行内插入汇编,但是编译不过,希望大家指点一下。

程序:
/* asm.c */
#include<stdio.h>
#pragma inline

int main()
{
int a,b;
scanf("%d%d",&a,&b);
asm mov ax,a
asm mov bx,b
asm add bx
asm mov a,ax
printf("a+b=%d",a);
return 0;
}

gcc asm.c -o asm

错误提示:
asm.c 8:错误:syntax error before 'mov'
发表于 2006-1-23 21:13:37 | 显示全部楼层
好像是要用AT&T的汇编格式,而不是intel的,nasm好像可以编译intel格式的asm
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-23 22:38:18 | 显示全部楼层
AT&T各式的怎么写,很大不同吗?
回复 支持 反对

使用道具 举报

发表于 2006-1-23 22:46:35 | 显示全部楼层
Post by alvas
AT&T各式的怎么写,很大不同吗?
看看 gcc -S ${FILE} 的输出吧。
回复 支持 反对

使用道具 举报

发表于 2006-1-24 01:21:14 | 显示全部楼层
建议你先学学AT&T格式的汇编
看看Programming from ground up
回复 支持 反对

使用道具 举报

发表于 2006-1-24 11:30:54 | 显示全部楼层
摘录于Linux1.0核心游记之内嵌汇编示例
文件名swap.c

#include <stdio.h>
int
main()
{
int iValue = 100;
int jValue = 200;
printf("\nBefore Swap:a=%d,b=%d\n",iValue,jValue);
__asm__
("movl (%0),%%eax\n\t"
"movl (%1),%%edx\n\t"
"movl %%eax,(%1)\n\t"
"movl %%edx,(%0)\n\t"
::"b"(&iValue),"c"(&jValue)
);
printf("After Swap:a=%d,b=%d\n\n",iValue,jValue);
return 0;
}


文件名Makefile

GCC=gcc
OBJS=swap

.c.o:
        $(GCC) -c -Wall $<

all(OBJS)
       
$(OBJS):swap.o
        $(GCC) -o $(OBJS) swap.o

clean:
        rm -f *.o core
clobber:clean
        rm -f $(OBJS)
回复 支持 反对

使用道具 举报

发表于 2006-1-27 20:19:05 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2006-1-29 22:04:03 | 显示全部楼层
intel 和 at&t 的 mov 都不一样,真是很烦
上次不知道吃了大亏
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表