Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5760937
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类:

2006-09-12 16:34:53

    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                ; 结束标志


代码的解释:

在NASM中,任何不被方括号[]括起来的标签和变量名都会被认为是地址,访问标签中的内容必须使用[]。
关于$和$$,$表示当前被汇编后的地址,
ndisasm -o 0x7c00 boot.bin >> disboot.asm

00007C09  EBFE              jmp short 0x7c09。

$$表示一个节的开始处被汇编后的地址,也就是0x7c00。
在程序中$-$$经常会被用到。
times 510-($-$$) db 0;表示将0重复510-($-$$)遍,也就是在剩下的空间里不停的填充0,直到程序有510B为止。这样加上结束0xAA55,正好512B。
阅读(2292) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~