-
问题内容:ORG指令
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5177184
- 所属论坛:汇编语言
审核组:其他开发语言
- 提问者:wangkunc
解决者:qtext
- 感谢:qtext
- 关键字:其他开发语言 汇编语言 字符 串 指向 指令 代码 软盘 装入 mov org 7c
- 答案:
今天在看于渊写的《自己动手写操作系统》,在开篇处作者例出了一个软盘引导扇区的程序如下:
-------------------------------------------------------------------------
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
--------------------------------------------------------------------------
我对第一条:ORG 7C00H的原理不太理解,具体是这样的:
ORG是一条伪指令,没有机器码,将以上程序的目标代码写入软盘的0号扇区后,通过DEBUG查看得知0号扇区从第一个字节起就是MOV AX,CS指令。那么当我用软盘启动机器后,这条指令是否真的在内存7C00H处?
如果在的话,那又是靠什么机制实现的呢?BIOS在调引导扇区时,并没有其他指令呀!
还请各位能帮忙分析一下,谢谢!
---------------------------------------------------------------
1) bios将这段代码装入0:7c00处,不管有没有org 7c00h,这点与是否有org 7c00h无关。
2) 为什么如果没有org 7c00h这段代码运行就不正常(没显示出Hello,OS word!")
这是因为字符串在0:7cxx(这是因为bios强制将代码连含用字符串机器码装入0:7c00处)
如果没有org 7c00h,假设是org 100h,显然
mov ax, offset BootMessage
mov bp, ax
bp 就没有真正指向字符串BootMessage(而是指向0:1xx)
这就是需要org 7c00h 的真正原因,它在这段代码的作用在编译时,可控制bp 指向真正的字符串。
- 评价:
给朵鲜花(11)
扔个鸡蛋(7)