Linux(ubuntu)下30天自制os学习引导,第2天(gas汇编语言)

来源:互联网 发布:linux sftp 指定端口 编辑:程序博客网 时间:2024/05/13 17:56

考虑到书本的后面又使用了gas的汇编语言,所以我们把第二天的汇编语言程序用gnu的汇编语法进行实现,下面是hello.S的代码:

.global start.code16start:    jmp entry    /*定义fat12文件格式*/    .byte 0x00    .ascii "helloOSX"    .word  512    .byte  1    .word  1    .byte  2    .word  224    .word  2880    .byte  0xf0    .word  9    .word  18    .word  2    .long  0    .long  2880    .byte  0,0,0x29    .long  0xffffffff    .ascii  "myosudisk  "    .ascii  "fat12   "    .fill 18entry:    mov $0,%ax    mov %ax,%ds    mov %ax,%es    mov %ax,%ss    mov $0x7c00,%sp    mov $msg,%si    call puts    mov $my,%si    call puts/*this is a subfunction to display stringusage: mov $address,%si       call putsor     mov $label,%si       call puts*/puts:  movb (%si),%al  add $1,%si  cmp $0,%al  je finish  movb $0x0e,%ah  movw $15,%bx  int $0x10  jmp putsfinish:  ;hlt  retmsg:    .asciz "\r\nmy bootloader is running"my: .asciz "\r\nwelcome to our course ".org 510.word 0xaa55

运行代码会显示如下图所示的内容:my bootloader is runing ,welcome to our course


可以看到博主把显示字符串的程序封装成了一个子函数,使用时只需如下调用即可。

mov $label ,%sicall puts
上面的程序也比较简单没有太内容需要讲解,下面主要看看我们的makefile文件,主要内容如下:

src=hello.Sobj=hello.oelf=boot.elfboot=boot.outasm=boot.asm$(boot):$(hello.S)gcc -c $(src) -m32 -o $(obj)ld -m elf_i386 $(obj) -e start -Ttext 0x7c00 -o $(elf)objcopy -S -O binary -j .text $(elf)  $(boot)objdump -S $(elf) > $(asm)
有了上节课makefile的基础,看懂上面的内容也不是什么难事了。大概每条命令讲下:

1:首先將hello.S作为输入,使用gcc將汇编程序编译为hello.o的object程序。

(注意:上面的-m32是不能少的,告诉编译器产生machine 32bit的代码,但是在我们汇编程序hello.S中有.code16的字样,就是告诉编译器产生16位的汇编。因为 gnu的汇编器太强大了,可以很方便的产生16位和32位的汇编,而日本人书里面用了两种汇编器就是因为nasm汇编器无法产生32位的汇编程序。所以问题在他那里就搞复杂了,用到了两种工具)

2:然后ld这个链接器(linker)將hello.o这个obj文件链接成为boot.elf的elf文件,-e 是指定汇编程序的入口,-Ttext 0x7c00是指定程序运行时的地址。

3:objcopy是將生成了boot.elf文件中的有用程序代码段.text提取出来,生成真正的512字节的启动扇区程序boot.out。

4:objdump是为了以后写大的程序时,观察程序反汇编后是什么情况,生成了有帮助意义的boot.asm汇编程序。


大概就是这么多了,关于如何使用qemu,如何写u盘,如何有qemu启动u盘,请看上一节的内容 。

下回见:有问题记得加群交流哦!be relax!

博主邮箱cherishsir@gmail.com

qq群:159336168

程序文件照例上传到百度云


帐号:cherishsir@gmail.com
密码:cherish 


0 0