免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1007 | 回复: 0
打印 上一主题 下一主题

linux内核学习笔记--setup.s之取磁盘参数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-17 18:38 |只看该作者 |倒序浏览
取第一个磁盘参数:
               
               
                   mov   ax,#0x0000
80 mov   ds,ax
81 lds   si,[4*0x46] ! 取中断向量 0x46 的值,也即 hd1 参数表的地址 ds:si
82 mov   ax,#INITSEG
83 mov   es,ax
84 mov   di,#0x0090  ! 传输的目的地址: 0x9000:0x0090 es:di
85 mov   cx,#0x10
86 rep
87 movsb
先将ds设为0x0000,然后lds取中断向量0x41的值,第1个硬盘的参数表地址=4*0x41=0x0000:0x0104.接下来设置目的地地址,es:di为0x9000:0x0090.
接下来三句为一个整体。
先说搬移字串。搬移字串指令有两种,分别是 MOVSB 和 MOVSW,说说 MOVSB。MOVSB 的英文是 move string byte,意思是搬移一个字节,它是把 DS:SI 所指地址的一个字节搬移到 ES:DI 所指的地址上,搬移后原来的内容不变,但是原来 ES:DI 所指的内容会被覆盖而且在搬移之后 SI 和 DI 会自动地址向下一个要搬移的地址。
一般而言,通常程序设计师一般并不会只搬一个字节,通常都会重复许多次,如果要重复的话,就得把重复次数 ( 也就是字串长度 ) 先记录在 CX 寄存器,并且在 MOVSB 之前加上 REP 指令,REP 是重复 (repeat) 的意思。这种写法很是奇怪,一般而言汇编语言源文件的每一行都只有一个指令,但 REP MOVSB 却可以在同一行写两个指令,当然分开写也是一样的。
因此,置cx为0x10(16),即要传输16个字节到0x9090后面,rep实现重复功能。因为硬盘参数表的长度为16字节,所以这里搬运的一共是16个字节。
这样,就实现了将第一个硬盘参数表中的信息搬运到指定位置的功能。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104521/showart_2124247.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP