guang@guang-laptop:~/temp/h$ ls
as -o hello.o hello.s
hello hello.o hello.s main.c main.o
!hello.s
.global hello
hello:
movl $4,%eax
movl $1,%ebx
movl $hello,%ecx
movl $30,%edx
int $0x80
.global buff
buff:.ascii "hello world"
as -o hello.o hello.s
extern hello(); int main() { hello(); return 0; }
gcc -c main.o main.c
gcc -o hello hello.o main.o
运行结果:
guang@guang-laptop:~/temp/h$ ./hello���ȃ�̀hello wo段错误
上面hello.s有两个bug
.global hello hello: push %ebp mov %esp,%ebp movl $4,%eax movl $1,%ebx movl $buff,%ecx movl $12,%edx int $0x80 mov %ebp,%esp pop %ebp ret .global buff buff:.asciz "hello world\n"
ebp,esp由被调用函数负责。这个不会遇到\0就停止,一定读取edx个字符。
buff反汇编后会变成可执行代码,因为在.text段里
这个例子是没有参数的。
hello,不是_hello,因为现在的gcc版本较高。若是1.2版的,汇编函数应该是_hello