nasm中org指令的作用

这是一段i386的引导代码,无org

 1     mov ax, cs
 2     mov ds, ax
 3     mov es, ax
 4     mov ax, 0b800h
 5     mov gs, ax
 6     mov al, 65
 7 
 8     call    DispStr         ; 调用显示字符串例程
 9     jmp $           ; 无限循环
10 DispStr:
11     mov ax, BootMessage
12     mov bp, ax          ; ES:BP = 串地址
13     mov cx, 16          ; CX = 串长度
14     mov ax, 01301h      ; AH = 13,  AL = 01h
15     mov bx, 000ch       ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
16     mov dl, 0
17     int 10h         ; 10h 号中断
18     ret 
19 BootMessage:        db  "Hello, OS world!"
20 times   510-($-$$)  db  0   ; 填充剩下的空间,使生成的二进制代码恰好为512字节
21 dw  0xaa55              ; 结束标志

bochs运行结果:

? ??? ??? ??? ?ߐn 2.40
Copyright (C) 1990-2000 Elpin Systems, Inc.
All rights reserved.

Licensed for use with bochs, courtesy of MandrakeSoft.

For information on this or other VGA development products, contact
Elpin Systems at: (800) 723-9038 or www.elpin.com

Bochs BIOS - build: 11/11/12
$Revision: 11545 $ $Date: 2012-11-11 09:11:17 +0100 (So, 11. Nov 2012) $
Options: apmbios pcibios pnpbios eltorito rombios32


Press F12 for boot menu.

Booting from Floppy...

bochs动态反汇编结果:

00007c00: (                    ): mov ax, cs                ; 8cc8
00007c02: (                    ): mov ds, ax                ; 8ed8
00007c04: (                    ): mov es, ax                ; 8ec0
00007c06: (                    ): mov ax, 0xb800            ; b800b8
00007c09: (                    ): mov gs, ax                ; 8ee8
00007c0b: (                    ): mov al, 0x41              ; b041
00007c0d: (                    ): call .+2                  ; e80200
00007c10: (                    ): jmp .-2                   ; ebfe
00007c12: (                    ): mov ax, 0x0025            ; b82500
00007c15: (                    ): mov bp, ax                ; 89c5
00007c17: (                    ): mov cx, 0x0010            ; b91000
00007c1a: (                    ): mov ax, 0x1301            ; b80113
00007c1d: (                    ): mov bx, 0x000c            ; bb0c00
00007c20: (                    ): mov dl, 0x00              ; b200
00007c22: (                    ): int 0x10                  ; cd10
00007c24: (                    ): ret                       ; c3

bios读取引导扇区的内容,并将其加载到0x7c00处(此时包括数据段和代码段整体已经在0x7c00处了),并且跳到此处开始执行(ip = 0x7c00),因为程序部分指令是位置无关的,所以可以执行,但是当寻址BootMessage时,由反汇编结果可知,其地址为0x0025, 但是此时程序在0x7c00处,所以0x0025不可能有BootMessage,所以程序并不能正确打印结果.

 

在0x7c00处设置断点:<bochs:1> b 0x7c00

打印cs:cs:0x0000



下面加上org:

 1     org 07c00h          ; 告诉编译器程序加载到7c00处
 2     mov ax, cs
 3     mov ds, ax
 4     mov es, ax
 5     mov ax, 0b800h
 6     mov gs, ax
 7     mov al, 65
 8 
 9     call    DispStr         ; 调用显示字符串例程
10     jmp $           ; 无限循环
11 DispStr:
12     mov ax, BootMessage
13     mov bp, ax          ; ES:BP = 串地址
14     mov cx, 16          ; CX = 串长度
15     mov ax, 01301h      ; AH = 13,  AL = 01h
16     mov bx, 000ch       ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
17     mov dl, 0
18     int 10h         ; 10h 号中断
19     ret 
20 BootMessage:        db  "Hello, OS world!"
21 times   510-($-$$)  db  0   ; 填充剩下的空间,使生成的二进制代码恰好为512字节
22 dw  0xaa55              ; 结束标志

bochs运行结果:

Hello, OS world!<90>n 2.40
Copyright (C) 1990-2000 Elpin Systems, Inc.
All rights reserved.

Licensed for use with bochs, courtesy of MandrakeSoft.

For information on this or other VGA development products, contact
Elpin Systems at: (800) 723-9038 or www.elpin.com

Bochs BIOS - build: 11/11/12
$Revision: 11545 $ $Date: 2012-11-11 09:11:17 +0100 (So, 11. Nov 2012) $
Options: apmbios pcibios pnpbios eltorito rombios32


Press F12 for boot menu.

Booting from Floppy...

 

bochs动态反汇编结果:

00007c00: (                    ): mov ax, cs                ; 8cc8
00007c02: (                    ): mov ds, ax                ; 8ed8
00007c04: (                    ): mov es, ax                ; 8ec0
00007c06: (                    ): mov ax, 0xb800            ; b800b8
00007c09: (                    ): mov gs, ax                ; 8ee8
00007c0b: (                    ): mov al, 0x41              ; b041
00007c0d: (                    ): call .+2                  ; e80200
00007c10: (                    ): jmp .-2                   ; ebfe
00007c12: (                    ): mov ax, 0x7c25            ; b8257c
00007c15: (                    ): mov bp, ax                ; 89c5
00007c17: (                    ): mov cx, 0x0010            ; b91000
00007c1a: (                    ): mov ax, 0x1301            ; b80113
00007c1d: (                    ): mov bx, 0x000c            ; bb0c00
00007c20: (                    ): mov dl, 0x00              ; b200
00007c22: (                    ): int 0x10                  ; cd10
00007c24: (                    ): ret                       ; c3
00007c25: (                    ): dec ax                    ; 48

加上org后,BootMessage的地址为0x7c25,所以程序可以正确寻址BootMessage

 

在0x7c00处设置断点:<bochs:1> b 0x7c00

打印cs:cs:0x0000

单步执行的话,cs 仍然是0x0000

 

综上:org指令并不改变cs的值,org在链接时期的重定位阶段起作用,改变符号引用的位置.

转载于:https://www.cnblogs.com/yangwindsor/p/3336681.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值