关闭

Orange’s学习笔记(一)

标签: 操作系统汇编org
236人阅读 评论(0) 收藏 举报
分类:

伪汇编指令ORG
学习操作系统两个多月以来,一直对org这个伪汇编指令似懂非懂,拿Orange’s的一个最简单的引导扇区代码来说

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 = 13h,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 07c00h指的是,这段程序将来要加载到偏移地址为07c00h的地方,所以在编译器编译时会将标号代表的相对地址(编译后的程序代码地址从0开始)+07c00h(org指明的地址值)作为编译后标号所在位置的实际数值,ep:看第16行标号BootMessage,不考虑org,编译后的二进制代码在文件中地址的偏移为0x1E,加上org指定的地址值,则第8行指令编译出来的BootMessage所占空间存储的数值应该是0x7C1E,用二进制文件查看器查看,如下图:这里写图片描述
其中的B8 1E 7C机器码对应的就是第8行的mov ax,BootMessage指令。
如果我们去掉org这条指令编译之后,得到的机器码,如下图:这里写图片描述
可以看出其中表示的地址偏移值为0x001E。
org伪指令其实仅仅是个开始,在学习Orange’s过程中问题很多,前前后后我看过很多遍的书,每次重看都有新的收获,但是还有很多搞不明白的,所以想写出来,既与大家分享了学习经验也想获得一些指点

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:523次
    • 积分:57
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档