一段大家熟悉的汇编代码分析

 

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

    这段程序出自《自己动手写操作系统》。一段简陋的汇编,却引领我进入pc汇编的大门。

    PC上电后系统从0XFFFF:0000开始启动,而此处的内容是个jump指令,执行后进入ROMBIOS的某个位置开始检查一系列配置,包括ram、显示器、磁盘等,之后将控制权交给ROM启动程序,这个程序将磁盘0磁道0扇区的内容读到内存绝对位置07c00处,以上的代码就开始执行了。

    3个mov语句将ds,es,cs指向同一位置,然后调用字符串显示函数,之后程序原地打转。

    这个字符串显示函数确实有点让人激动,利用bios提供的int 10h中断服务程序对屏幕进行绘制。在调用之前需要设置一系列参数,字符串资源地址放在es:bp处,cx指令字符串长度为16,AH设定显示服务模式,值为13h说明显示字符串,AL设定光标位置,01h表示跟随字符串,BH设置显示页号为0页,BL八位指定显示背景和文字颜色,0~3位依次表示蓝、绿、红、灰色,4~6位表示背景色。DX表示显示位置的行列号,dl为0表示显示在0列。参数设定好后,最后调用int 10h。这个过程有点类似C中的函数参数的传递。

    最后两句是为了初始化磁盘空间,设置扇区结束标志,因为前面说过,启动程序会将加载这个扇区。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值