代码调试
BIOS运行
编写代码
编译工具
定义将要输出的字符串数据
es:di指向显存
ds:si指向将要输出的数据
用cx做计数器,计算字符串长度
al做中转站,将数据填入al,si加1
因为内存之间不能直接传输数据
将al中的数据填入显存,di加1
填入的数据需要设置属性,属性0x07,就填在数据后面,di加1
执行到loop s,cx自动减1,若cx不等于0,则cs:ip跳转至s,否则按照顺序执行
循环完毕,跳转至code,使得cpu一直在code代码段循环
因为后面就没有代码了,于是让它一直循环
是为了跳过数据段,执行代码
标号data与标号code表示偏移,它们之间只有字符串,所以相减能够得到字符串长度
因为BIOS程序会被加载到0x0000 : 0x7c00,所以该程序的起始段地址就是0x07c0
链接
loop与cx配合能够起到for循环的效果
当cx不为零,程序跳转至s执行
当cx为零时,则按照顺序执行
我写的是BIOS程序,计算机对BIOS程序的要求就是512字节,且以0x55,0xAA结尾
start:
jmp code
data:
;也可使用ASCII码
db 'Hello Taudre11, this is the operating system I wrote, by the way, do not forget to memorize words early'
code:
;es指向显存,di做指针
mov ax,0xB800
mov es,ax
mov di,0x0
;ds指向待写入数据,si做指针
mov ax,0x07c0
mov ds,ax
mov ax,data
mov si,ax
;循环计数器
mov cx,code-data
s:
;写显存
;al做中转站
mov al,[ds:si]
inc si
mov byte [es:di],al
inc di
mov byte [es:di],0x07
inc di
loop s
jmp code ;循环该代码段
current:
;字符填充
times 510-(current-start) db 0
db 0x55,0xAA ;BIOS要求:0x55,0xAA结尾
1 start:
2 00000000 EB67 jmp code
3
4 data:
5 ;也可使用ASCII码
6 00000002 48656C6C6F20546175- db 'Hello Taudre11, this is the operating system I wrote, by the way, do not forget to memorize words early'
6 0000000B 64726531312C207468-
6 00000014 697320697320746865-
6 0000001D 206F7065726174696E-
6 00000026 672073797374656D20-
6 0000002F 492077726F74652C20-
6 00000038 627920746865207761-
6 00000041 792C20646F206E6F74-
6 0000004A 20666F726765742074-
6 00000053 6F206D656D6F72697A-
6 0000005C 6520776F7264732065-
6 00000065 61726C79
7
8
9 code:
10 ;es指向显存,di做指针
11 00000069 B800B8 mov ax,0xB800
12 0000006C 8EC0 mov es,ax
13 0000006E BF0000 mov di,0x0
14
15 ;ds指向待写入数据,si做指针
16 00000071 B8C007 mov ax,0x07c0
17 00000074 8ED8 mov ds,ax
18 00000076 B8[0200] mov ax,data
19 00000079 89C6 mov si,ax
20
21 ;循环计数器
22 0000007B B96700 mov cx,code-data
23
24 s:
25 ;写显存
26 ;al做中转站
27 0000007E 3E8A04 mov al,[ds:si]
28 00000081 46 inc si
29
30 00000082 268805 mov byte [es:di],al
31 00000085 47 inc di
32 00000086 26C60507 mov byte [es:di],0x07
33 0000008A 47 inc di
34 0000008B E2F1 loop s
35
36 0000008D EBDA jmp code ;循环该代码段
37
38 current:
39 ;字符填充
40 0000008F 00 times 510-(current-start) db 0
41 000001FE 55AA db 0x55,0xAA ;BIOS要求:0x55,0xAA结尾