Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196597
  • 博文数量: 67
  • 博客积分: 2720
  • 博客等级: 少校
  • 技术积分: 625
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-05 13:53
文章分类
文章存档

2011年(1)

2010年(43)

2009年(23)

我的朋友

分类: LINUX

2009-12-17 18:38:39

取第一个磁盘参数:

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个字节。

这样,就实现了将第一个硬盘参数表中的信息搬运到指定位置的功能。

阅读(966) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~