理解org伪指令

深碍√TFBOYSˉ_ 2022-08-27 11:41 79阅读 0赞

在《自己动手写操作系统》开始出有一段这样的汇编程序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 条评论,79人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [汇编]伪指令(二)

    \[汇编\]伪指令(二) 数据定义及存储器分配伪指令   80x86提供了各种数据及存储器分配伪指令,这些伪指令在汇编程序对源程序进行汇编期间,由汇编程序完成数据类

    相关 [汇编]伪指令(一)

    \[汇编\]伪指令(一)  段定义伪指令     段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪

    相关 ORG 伪指令

    汇编地址计数器 汇编地址计数器用符号$表示,它用来记录正在被汇编程序翻译的语句的地址,即它的内容标示了汇编程序当前的工作位置。 在一个源程序中往往包含多个段。汇编程序在

    相关 arm开发-伪指令

    伪指令 与指令系统的助记符不同,它没有对应的操作码。 伪指令在源程序中的作用是为完成汇编程序作各种准备工作,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了

    相关 pragma伪指令

    pragma伪指令 通过pragma伪指令告诉编译器如何对待特定的函数、对象或代码段。TMS320C28x C/C++编译器支持如下形式的pragma伪指令:   CODE

    相关 Arm伪指令

    伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。 伪指令的意义在于指导编译过程。 伪指令是和具体的编译器相关的,我们使用gun工具链,因此学习gun环境