前段时间想写个简易操作系统模式。觉得用汉字汇编去写操作系统岂不是更有意思。于是借鉴NASM做一个简易中文汇编,用来解析过程中用到的一些基本指令,为了后续的方便,暂时叫做NAJC。下面通过一个案例展示下:
装载 0x7c00
跳 主体
字 0x90
字 "NAJC "
双字 512
字 1
双字 1
字 2
双字 224
双字 2880
字 0xf0
双字 9
双字 18
双字 2
四字 0
四字 2880
字 0,0,0x29
四字 0xffffffff
字 "JC-OS "
字 "FAT12 "
补字 18
主体:
移 寄加,0
移 段堆,寄加
移 栈指,0x7c00
移 段数,寄加
移 段附,寄加
移 变源,消息
循环输出:
移 寄加低,[变源]
加 变源,1
比 寄加低,0
等跳 最后
移 寄加高,0x0e
移 寄基,15
中断 0x10
跳 循环输出
最后:
休
跳 最后
消息:
字 0x0a, 0x0a
字 "HELLONAJC"
字 0x0a
字 0
补字 0x7dfe-0x7c00-($-$$)
字 0x55, 0xaa
字 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
补字 4600
字 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
补字 1469432
上面代码做些解释,“装载 0x7c00”是主引导的地址,主引导一共是512字节。“字 "FAT12 "”看可以看出用来只做FAT12的软盘,上面是相关格式。“字 "HELLONAJC"”是引导启动时输入的信息。这里还不能使用汉字,由于这时的系统还没有汉字的格式支持,中断指令int 0x10不支持中文。“补字 0x7dfe-0x7c00-($-$$)”,为了保证主引导是512字节,这里使用从0x7dfe地址-0x7c00地址,其实就是510,($-$$)是从0x7c00开始已经写的字节数。加上“字 0x55, 0xaa”正好是512。假设上面保存为test.jc。
通过指令NAJC -f test.jc -o test.img
生成的test.img文件可以通过VMWare虚拟机加载测试。
鉴于使用目前只完成部分汇编指令:
编号 | 中文指令 | 对照英文指令 |
1 | 装载 | ORG |
2 | 字 | DB |
3 | 双字 | DW |
4 | 四字 | DD |
5 | 补字 | RESB |
6 | 跳 | JMP |
7 | 比 | CMP |
8 | 溢跳 | JO |
9 | 不溢跳 | JNO |
10 | 低跳 | JB |
11 | 不低跳 | JNB |
12 | 等跳 | JE |
13 | 不等跳 | JNE |
14 | 高跳 | JA |
15 | 不高跳 | JNA |
16 | 低等跳 | JBE |
17 | 不低等跳 | JNBE |
18 | 负跳 | JS |
19 | 非负跳 | JNS |
20 | 奇偶跳 | JP |
21 | 非奇偶跳 | JNP |
22 | 小于跳 | JL |
23 | 不小于跳 | JNL |
24 | 大于跳 | JG |
25 | 不大于跳 | JNG |
26 | 移 | MOV |
27 | 加 | ADD |
28 | 寄加 | AX |
29 | 寄加高 | AH |
30 | 寄加低 | AL |
31 | 寄基 | BX |
32 | 寄基高 | BH |
33 | 寄基低 | BL |
34 | 寄计 | CX |
35 | 寄计高 | CXH |
36 | 寄计低 | CXL |
37 | 变源 | SI |
38 | 变目 | DI |
39 | 基指 | BP |
40 | 栈指 | SP |
41 | 高寄加 | EAX |
42 | 高寄基 | EBX |
43 | 高寄计 | ECX |
44 | 高寄数 | EDX |
45 | 高栈指 | ESP |
46 | 高基指 | EBP |
47 | 高变源 | ESI |
48 | 高变目 | EDI |
49 | 段代 | CS |
50 | 段数 | DS |
51 | 段堆 | SS |
52 | 段附 | ES |
53 | 段附1 | FS |
54 | 段附2 | GS |
55 | 入栈 | PUSH |
56 | 出栈 | POP |
57 | 中断 | INT |
58 | 休 | HLT |
CSDN下载地址:https://download.csdn.net/download/u011736517/12131430
github下载地址:https://github.com/ljc2266/NAJC