理解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正确的地址。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值