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编译的还是能做的。