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
- Linux(ubuntu)下30天自制os学习引导,第2天(gas汇编语言)
- Linux(ubuntu)下30天自制os学习引导,第1天(汇编语言,写入u盘,qemu启动u盘)
- Linux(ubuntu)下30天自制os学习引导,第3.0天(读取u盘第二扇区到内存)
- Linux(ubuntu)下30天自制os学习引导,第3.1天(如何得到 u盘的chs结构)
- Linux(ubuntu)下30天自制os学习引导,第3.2天(读取u盘上189kB的内容 )
- 30天自制操作系统(第02天)–汇编语言学习和MakeFile入门
- 既然选择了远方——30自制操作系统之第2天--汇编语言学习与Makefile入门
- 《30天自制操作系统》学习笔记--第2天
- Linux 汇编语言(GNU GAS汇编)区别
- 《30天自制操作系统》第2天
- [读书笔记]30 天自制操作系统 day2 汇编语言学习与Makefile入门
- 30天自制操作系统(第一天)
- 《30天自制操作系统》学习笔记--第0天
- 《30天自制操作系统》学习笔记--第1天
- 《30天自制操作系统》学习笔记--第3天
- 《30天自制操作系统》学习笔记--第4天
- 《30天自制操作系统》学习笔记--第5天
- 《30天自制操作系统》学习笔记--第6天
- 雾山的Robotium学习笔记---通过Id寻找控件
- wpf 模版
- 优秀的领导与差劲的领导
- EOF女神的相反数
- 关于R.java中的数组问题
- Linux(ubuntu)下30天自制os学习引导,第2天(gas汇编语言)
- C++11 现代C++风格的新元素
- 喜忧参半wxWidgets——求大神
- c语言中的 int (*p)[5] 类型分析
- 大型网站技术架构(二)--架构模式
- OOP面向对象的编程思想
- 假如记忆可以移植
- 分支-05. 用天平找小球(10)
- Attribute is missing the Android namespace prefix