理解org伪指令
在《自己动手写操作系统》开始出有一段这样的汇编程序boot.bin
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db “Hello, OS world!”
times 510-($-$$) db 0
dw 0xaa55
1 那么org伪指令的作用是什么?
org伪指令告诉编译器(其实是连接器)这段程序将被加载到07c00h处,程序中要访问的数据的地址要被编译成07c00h+offset(数据的相对偏移量)而不是offset。不添加org xxx地址时,程序默认认为被加载到0x0000地址处,即告诉编译器程序中数据地址为0x0000+offset=offset(不变)。
2 如果不添加org伪指令会怎么样?
添加org 07c00h伪指令,mov ax, BootMessage 被编译器翻译成 mov ax,0x7c1f,bochs显示正常。
未添加org 07c00h伪指令,mov ax, BootMessage 被编译器翻译成 mov ax,0x1f,bochs显示乱码。
3 未添加org 07c00h伪指令时,为什么会bochs会显示乱码?
因为BootMessage被汇编器翻译的地址不正确,ox1f地址里没有启动信息。boot.bin被加载到0x7c00处内存,那么BootMessage地址应该是0x7c00+BootMessage的offset。这里很显然程序没有读到BootMessge正确的地址。
还没有评论,来说两句吧...