问题
《程序员的自我修养》4.6.2用一个包含汇编代码的“最小”程序TinyHelloworld.c演示链接,书中代码为
/*
*TinyHelloWorld.c
*/
char* str = "Hello World!\n";
void print(){
asm( "movl $13,%%edx \n\t"
"movl %0,%%ecx \n\t"
"movl $0,%%ebx \n\t"
"movl $4,%%eax \n\t"
"int $0x80 \n\t"
::"r"(str):"edx","ecx","ebx");
}
void exit() {
asm( "movl $42,%ebx \n\t"
"movl $1,%eax \n\t"
"int $0x80 \n\t");
}
void nomain() {
print();
exit();
}
用命令 gcc -c -fno-builtin TinyHelloWorld.c编译时报错TinyHelloWorld.c: Assembler messages: TinyHelloWorld.c:9: Error: unsupported instruction `mov’
原因
书中代码使用的是32位的汇编代码,我们现在用的机器基本都是64位,所以找不到对应的汇编命令,因此报错
解决方法1:开启32位支持
因为64位机器默认是按64位编译的,我们只要开启支持32位编译的flag -m32
gcc -c -fno-builtin -m32 TinyHelloWorld.c
使用-m32 flag强指定编译器生成适用于32位处理器架构的代码。
解决方法2: 将32位汇编代码换成64位汇编代码
char* str = "Hello World!\n";
void print() {
asm("mov $1, %%rax \n\t"
"mov $1, %%rdi \n\t"
"mov %0, %%rsi \n\t"
"mov $13, %%rdx \n\t"
"syscall \n\t"
::"r"(str)
: "rax", "rdi", "rsi", "rdx");
}
void exit() {
asm("mov $60, %%rax \n\t"
"mov $42, %%rdi \n\t"
"syscall \n\t"
:::"rax", "rdi");
}
void nomain() {
print();
exit();
}
也可以run成功