关于内联汇编的问题

C、C++和Java语言
回复
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08
送出感谢: 0
接收感谢: 0

关于内联汇编的问题

#1

帖子 tiankunmin » 2007-09-07 23:35

我刚上手Linux 请问 在 gcc或 g++中怎么用intel汇编而不是AT&T
我还是比较喜欢intel汇编,AT&T看起来就麻烦,请问gcc或g++能用
intel汇编吗?
GaRY
帖子: 101
注册时间: 2007-03-25 1:18
送出感谢: 0
接收感谢: 0

#2

帖子 GaRY » 2007-09-07 23:47

貌似不可以吧,__asm__内嵌的最后是由gcc传给gas处理。而gas功能不是很强,只能接受at&t语法。
不过你可以尝试用用nasm,和intel汇编格式很像

ps:linux下还是熟悉at&t语法的比较好,毕竟gdb之类的调试器也是at&t语法
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08
送出感谢: 0
接收感谢: 0

#3

帖子 tiankunmin » 2007-09-08 0:21

可以 我刚才搜到了些资料.
写了个入门的程序.

代码: 全选

#include <iostream>
#include <string>

const char *hllx = "hello linux!\n";

char *	inttostr(int , char*);
void	add(int *a, const int b);

int	main()
{
	printf(hllx);
	char s[128];
	std::cin>>s;
	strcat(s, "\r\n");
	printf(s, "\r\n");
	int i = 5;
	add(&i, 3);
	strcpy(s, "5 + 3 = ");
	inttostr(i, &s[strlen(s)]);
	//sprintf(s, "5 + 3 = %d\r\n", i);
	strcat(s, "\r\n");
	printf(s);
	return 0;
}

char *	inttostr(int , char*)
{
	asm
	(
		".intel_syntax noprefix\n" //此句说明使用intel汇编
		"push	ebx\n"
		"push	edi\n"
		"mov	eax, dword ptr [ebp + 0x08]\n"
		"mov	ebx, 0x0A\n"
		"xor	edi, edi\n"
		"cmp	eax, 0\n"
		"jge	pushup\n"
		"neg	eax\n"
	"pushup:\n"
		"cdq\n"
		"idiv	ebx\n"
		"add	edx, 0x30\n"
		"push	edx\n"
		"inc	edi\n"
		"test	eax, eax\n"
		"jnz	pushup\n"
		"mov	eax, dword ptr [ebp + 0x08]\n"
		"mov	ebx, dword ptr [ebp + 0x0C]\n"
		"cmp	eax, 0\n"
		"jge	popback\n"
		"mov	byte ptr [ebx], '-'\n"
		"inc	ebx\n"
	"popback:\n"
		"pop	eax\n"
		"mov	byte ptr [ebx], al\n"
		"inc	ebx\n"
		"dec	edi\n"
		"jnz	popback\n"
		"mov	byte ptr [ebx], 0\n"
		"pop	edi\n"
		"pop	ebx\n"
		"mov	eax, dword ptr [ebp + 0x0C]\n"
	);
	asm (".att_syntax noprefix");//最后还要把汇编方式调会去 要不以后的代码就全按照intel汇编来了,编译不过去
}

void	add(int *a, const int b)
{
	*a += b;
}
回复

回到 “C/C++/Java”