#2
wmf20142016-07-01 20:53
|
在下面的代码中做了比较详细的注释。
以'#'开始的是注释。
以'.'开始的是伪指令,是告诉汇编器如何编译这段代码的。具体的伪指令不再做详述,只要照猫画虎即可,想详细了解的可以查阅官方技术文档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
.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
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编辑过]