中文汇编
近期写个操作系统解解乏困。前几天突然想到,用汉字汇编去写操作系统岂不是更有趣味。于是借鉴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 |
github地址:https://github.com/ljc2266/NAJC