书接上回
继续开发:
上次,那个引导扇区代码看的大家一头雾水,今天咱们就一步步开发
(上一次是作者偷懒了,直接复制的)
org 0x7c00
jmp entry
db 0x90
db "HELLOIPL"
dw 512
db 1
dw 1
db 2
dw 224
dw 2880
db 0xf0
dw 9
dw 18
dw 2
dd 0
dd 2880
db 0,0,0x29
dd 0xffffffff
db "HELLO-OS"
db "FAT12"
resb 18
entry:
mov ax,0
mov ss,ax
mov sp,0x7c00
mov ds,ax
mov es,ax
mov si,msg
print:
mov al,[si]
add si
cmp al,0
je fin
mov ah,0x0e
mov bx,15
int 0x10
jmp print
fin:
hlt
jmp fin
msg:
db 0x0a,0x0A
db "hello,world!"
db 0x0a
db 0
times 510-($-$$) db 0
db 0xaa55
(作者又偷懒了,一个注释没写)
汇编入门:
咱们先看第一行,有个org指令,是指把程序放在指定的内存地址。《30天自制操作系统》这本书上说没有org不能正确的执行,其实是错误的。关于这个,我们以后再讲。看看org后面是0x7c00,这个地址有什么特别的?改成1234不行吗?还真不行。
在电脑启动的时候,BIOS负责加载启动失败的第一个扇区进内存,这个内存地址就是0x7c00。也就是说,我们的操作系统是在0x7c00开始运行的。
然后是jmp指令,它是跳转到特定内存地址的,但是entry是什么?显然不是一个内存地址。entry这样的,在汇编语言中叫做标号。它就是一个内存地址,意思是从程序开始到entry代码的内存地址+程序的装载地址。我们的汇编器会自动计算出来。这就要用到org指令了。
在下面是dd,db,dw和resb,与org一样,叫伪指令。伪指令不会编译出任何东西,只是协助汇编器编译。这些指令的作用是填充数据。dd是define double word,dw是define word,db是define byte,只是填充的位数不一样而已。resb是填充0
接下来是mov指令,mov是给寄存器赋值的意思。在这里说一下什么是寄存器:
寄存器
ax:累加寄存器
cx:计数寄存器
dx:数据寄存器
bx:基址寄存器
sp:栈指针寄存器
bp:基址指针寄存器
si:源变址寄存器
di:目的变址寄存器
寄存器是CPU中的存储电路,相当于变量。这几个是常用的
其他的不一一列举了,遇到的时候再讲
突然发现已经1024个字了,咱们下期再见┏(^0^)┛
148

被折叠的 条评论
为什么被折叠?



