HelloWorld.s
都说汇编不易学习和使用,的确不假。自己自大学以来也曾多次尝试学习汇编,甚至大学时还有相应课时,但是自己对汇编依旧是浅尝辄止。工作后也少有使用,对汇编的认识也就停留在基础层面。汇编的学习与对计算机系统的理解是密不可分的。工作这些年也算是一直浸淫于系统层面,经过多本底层相关书籍的教诲以及工作中的实践,对计算机系统的理解就自然而然加深了。昨天下载了一本名为:“Professional Assembly Language(中文名:汇编语言程序设计)” 的电子书,目的是想了解一下C内联汇编(Inline Assmebly)。花了半个小时读后,居然感觉轻松自如,和自己大脑中的知识融会贯通起来。发现这本书在卓越网还有“剩本”,也就抓紧买了下来,下周到货。
本书使用linux和AT&T汇编语法,正合我的胃口。以下是根据书中例子改出来的一段汇编版HelloWorld.s:
# HelloWorld.s
# as -o HelloWorld.o HelloWorld.s
# ld -o HelloWorld HelloWorld.o
.section .data
output:
.ascii "hello world\n"
.section .text
.globl _start
_start:
nop
movl $output, %ecx
movl $4, %eax # the index of sys call 'write'
movl $1, %ebx # file descriptor
movl $12, %edx # length of the string
int $0×80
movl $1, %eax # the index of sys call 'exit'
movl $0, %ebx
int $0×80
在调试上面代码时有两个注意事项要考虑:
1、调用write时,%edx务必赋值,否则将无法正确输出;
2、在Ubuntu 9.04下,如果结尾不调用exit,执行程序后会有'段错误',目前依然不得其解,通过GDB调测后猜测是未作收尾处理,处理器继续取EIP所指地址的指令内容,执行出错。
将这段代码拿到Solaris10 for x86上执行,无法输出“hello world”,并伴有'段错误',目前尚不得其解。
让HelloWorld.s作为再次尝试熟悉汇编的一个起点吧^_^。
评论