CSDN=>FAQ=>FAQ 展示
  • 问题内容: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)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo