0针对问题
1)x86_64平台 gcc编译错误 Error: unsupported instruction `mov’ 及ld链接错误
2)《程序员的自我修养》中静态链接的ld错误
3)不用标准库生成可执行文件文件
1. 源代码
//Myhello.c
char* str = "Hello world\n";
void print()
{ asm("movl $13, %%edx \n\t"//传入字符串str的长度
"movl %0, %%ecx \n\t"//传入字符串str的地址
"movl $0, %%ebx \n\t"//指定字符串打印的输出位标准输出
"movl $4, %%eax \n\t"//传入系统调用号
"int $0x80"
:
:"r"(str)
:"edx","ecx","ebx","eax");
}
void exit()
{
asm("movl $42, %ebx \n\t"
"movl $1, %eax \n\t"
"int $0x80 \n\t");
}
void nomain()
{
print();
exit();
}
2执行代码
gcc -c -fno-builtin myhello.c
1)-fno-builtin禁止gcc的内建函数的优化
2)解决报错,在64位系统需要加-m32
ld -static -m elf_i386 -T Hello.lds -e nomain -o TinyHelloWorld TinyHelloWorld
1)-m elf_i386指定的对象文件.o的合并的方式,这个在/user/include下的某个文件中
2)-T 指定链接方式,自行编写。不写该命令也可以过
3)-e必须加,应该我们没有用标准库,所以需要指定可执行文件的起始地址