[AT&T汇编语言]第二讲 helloworld程序
这一讲主要为了验证开发环境是否搭建成功。在下面的代码中做了比较详细的注释。
以'#'开始的是注释。
以'.'开始的是伪指令,是告诉汇编器如何编译这段代码的。具体的伪指令不再做详述,只要照猫画虎即可,想详细了解的可以查阅官方技术文档https://。
以'%'开始的是寄存器名,Intel格式中表示寄存器是没有这个符号的。
以'$'开始的是立即数,Intel格式中表示立即数是没有这个符号的。在AT&T中表示16位立即数用“0x”的的形式。
对于用到的两个BIOS调用暂不做解释。最下面的启动扇区标志也先不解释,但以后的代码中会一直有这东西,具体原因以后再说。
以后的代码不会做这样的注释,只会对重点部分进行注释。
hello.s文件如下:
程序代码:
BOOT_SECT = 0x07c0 # 宏定义 .code16 # 将这个汇编代码编译成16位程序 .section .text # 这是代码段的内容 .global _start # 在目标文件中导出_start符号 _start: jmp $BOOT_SECT, $go # 跳转到0x07c0段 go: mov %cs, %ax # 初始化ds/es段寄存器 mov %ax, %ds mov %ax, %es mov $0x0003, %ax # 调用BIOS 10H功能号设定显卡模式 int $0x10 mov $0x1301, %ax # 调用BIOS 10H功能号显式字符串。 mov $0x0007, %bx mov msg_len, %cx mov $0x0000, %dx mov $msg, %bp int $0x10 cpu_hlt: # 停止CPU hlt jmp cpu_hlt msg: # 字符串内容 .ascii "Hello, world!" msg_len: # 字符串长度 .word .-msg .org 510 # 启动扇区标志 .word 0xAA55
Makefile文件如下:
程序代码:
all: hello hello: hello.o ld hello.o --oformat binary -m elf_i386 -Ttext=0x0 -o hello hello.o: hello.s as hello.s --32 -c -o hello.o clean: rm -f hello.o hello
make工具的使用是直接执行make命令。
如果不使用make工具,可以直接执行编译链接命令:
程序代码:
as hello.s --32 -c -o hello.o ld hello.o --oformat binary -m elf_i386 -Ttext=0x0 -o hello
启动效果如图所示,上图是屏幕显式,下图是Bochs控制台。
[此贴子已经被作者于2016-7-1 21:19编辑过]