MyOS 之 汇编化

NASM无论如何只做两次汇编,因此在第二遍的时候,就可以知道代码引用的所有符号地址,但一段代码的尺寸依赖于另一符号值,而这个符号又在这段代码的后面被声明,这个是不行的。

前面加点就是本地label,例如.loop,这就很实用了,你可以在函数里定义几个变量,然后直接jmp过去,这样就能保证原子化了。

其实后面连接也没关系,根本不用管。

现在的确是需要进行系统化命名了。现在实现再添加一个asm文件取代C语言文件。

新创建一个main.nas文件,文件里只是:

main:
		HLT						; 让CPU停止,等待指令
		JMP		main				; 无限循环

最简单的系统。编入makefile。

成功,然后与汇编函数文件联动。

不行,太乱了,引用的文件太多,根本不知道什么是什么。还是自己实现所有文件吧。

这里讲一下nasm,nasm你一般这么用:

nasm -f bin test.asm -o test.bin -l test.list

gas是作为gcc的中间汇编代码,纠错能力很弱而且语法相当可怕。

1. nasm大小写敏感。

2. nasm读内存示例:

var dw 2

mov ax, var ; 将地址存入ax

mov ax, [var] ; 将值存入ax

k equ 1

mov ax, 1 ; 将1存入ax,也就是说,要么是地址,要么是equ的常量。

不支持 mov ax, table[bx],可以写成mov ax, [table+bx],也不支持mov ax, es:[di],可以写成mov ax, [es:di]

3. nasm不记住任何变量类型,因此必须显式存数,例如 mov word [var], 2

4. nasm不需要far,near什么的。

5. nasm用\作为续航符。

好吧,段还是挺重要的。

nasm不允许在bss段定义可变长度的内容,但是我也只是对齐而已,因此这个对齐任务可以交予create_img来完成。

create_img需要两个文件,一个是ipl.bin,作为启动区纯二进制文件,另一个是myos.bin,是很多nasm文件联合汇编的纯二进制文件,crate_img的功能就是联合这两个文件最终弄成1.44MB的软盘格式。

现在一个版本里有两个文件夹,一个tools,装载所有工具,另一个是src,装载所有代码,make文件在最外面。中间出现的list全部都放在最外面,生成的二进制文件全部放到bin文件夹下。

因为路径问题,只好把所有的放到一块了。

好难受啊,根本对不上,什么破玩意儿。不仅nasm不友好,而且gcc也不友好。。。

之所以多三个字节是因为,必须用二进制的方式打开,不然的话,0d 0a 0d (换行,回车 换行)就会自动删除0d,这是很坑的。

解决办法就是"wb"和"rb"。

但nask和nasm编译出来的机器代码不太一样。

现在看看启动qemu呢?

qemu还关联着几个重要文件,因此,emmm,就不能那么做了,只能环境变量来引用,不是自己的全部环境变量引用,是自己的放到tools中。

其实nasm编译的还是能做的。

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值