现在的位置: 首页 > 综合 > 正文

理解org伪指令

2018年03月30日 ⁄ 综合 ⁄ 共 704字 ⁄ 字号 评论关闭

在《自己动手写操作系统》开始出有一段这样的汇编程序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正确的地址。

抱歉!评论已关闭.