标签:
来个汇编版的hello world
.section .data hello: .ascii "hello world\n" hello_len = . - hello .section .text .global _start _start: movl $4, %eax #write movl $1, %ebx #write(1, ) movl $hello, %ecx #write(1, hello, ) movl $hello_len, %edx #write(1, hello, hello_len) int $0x80 movl $1, %eax movl $0, %ebx int $0x80
如何编译
gcc -c my_write.s && ld my_write.o && ./a.out
在汇编语言中,任何一小数点(.)开始的指令都不会被直接翻译成机器指令,这些针对汇编程序本身的指令,实际上并不会由计算机运行。
.section .data命令是数据段的开始,数据段中要列出程序数据所需的所有内存空间。
.section .text命令是文本段的开始,文本段是存放程序指令的部分。
_start 是一个符号,这说明它将在汇编或链接过程中被其他内容替换。符号一般用来标记程序或数据的位置。 .global表示汇编程序不应该在汇编之后废弃此符号,因为链接器需要它。_start 是个特殊符号,总是用.global来标记,因为它标记了该程序的开始位置。
_start:
定义_start的值。
movl $4, %eax
4是write 的系统编号
同等的c语言实现:
#include <unistd.h> #include <stdlib.h> #define HELLO "hello world\n" int main() { write(1, HELLO, sizeof(HELLO) - 1); exit(0); }
标签:
原文地址:http://my.oschina.net/guonaihong/blog/472687