书上有句话不懂

GGJJyangjinhan 2009-04-30 06:50:49
MOVSB复制由ESI寻址处的内存地址处的数据至EDI寻址的内存地址处
什么叫由ESI寻址处的内存地址。
谁能清楚的解释给我......
...全文
156 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
光宇广贞 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mengcheng8487 的回复:]
看样子LZ懂了,我也学习了。。。谢谢详细解说的大佬,下次我有问题你们多帮帮我。。。我多给分给你们,不过你说详细点。我才学习汇编语言,觉得很难学!
[/Quote]

看得懂就行了。会不会编另说。你不做硬件驱动开发的话,你用汇编编程的效率是干不过编译器的……
mengcheng8487 2009-05-02
  • 打赏
  • 举报
回复
看样子LZ懂了,我也学习了。。。谢谢详细解说的大佬,下次我有问题你们多帮帮我。。。我多给分给你们,不过你说详细点。我才学习汇编语言,觉得很难学!
光宇广贞 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 GGJJyangjinhan 的回复:]
这不只是指令问题,我不明白的是这句话

由ESI寻址处的内存地址。

不懂这个后面我都没法看,还有如“在保护模式程序中,ESI自动作为由DS寻址的段内的偏移”不明白,由DS寻址?怎么寻址??
[/Quote]

就是说es段和ds段对齐啦……
windows 汇编的基本常识……
GGJJyangjinhan 2009-05-01
  • 打赏
  • 举报
回复
明白!
nanlingcg 2009-05-01
  • 打赏
  • 举报
回复

我从楼主主帖里的话大致推测,那是段对MOVSB的解释.
MOVSB是串传送,就是把一段字符(说数据,信息都可以,都是二进制)从一个地方用一个指令传送结束。
如MOV 最多(在32位的情况下)一次只能传送两个字的信息。超过两个字的信息要想一个指令来完成,就用MOVSB或者MOVSW,MOVSD。那么他是怎么传的呢(只以MOVSB为例)?也就是说他从哪传到哪(也就是复制)?汇编中规定:以ESI为源变址寄存器,EDI为目的变址寄存器,(书上应该有说,ESI在串处理指令中作为隐含的源变址寄存器并和DS联用,同样,EDI作为隐含的目的变址寄存器并和ES联用).
比如:在1000:00000300开始存有12 34 56 78 90 AB CD EF ,要把他用串传送指令传送到2000:00000800开始处。那么这里的源是1000:00000300这里,目的地址是2000:00000800那里,
那么在汇编中怎么表示? 如下:
MOV AX,1000H
MOV DS ,AX ;DS里放入源数据的段地址,
MOV ESI,00000300H ;把源数据的偏移首地址放入ESI

MOV AX,2000H
MOV ES,AX ;ES里是操作数据目的的段地址
MOV EDI,00000800H ;EDI里是操作数据目的的偏移首地址

CLD ;设下方向标志
MOV CX,8 ;设下长度,因为是MOVSB(字节),所以是8
REP MOVSB ;这里是开始传送的指令了


CLD MOV CX,8 REP就不解释了。只针对楼主的不解说下了。

上面复制的是从那到那,我先楼主是明白的了,就是把1000:00000300开始的8个字节内容依此复制到2000:00000800那及后面字节存储空间。
现在我来用楼主的话详细比照这个例子。
MOVSB复制由ESI寻址处的内存地址处的数据至EDI寻址的内存地址处
由ESI寻址自然是说通过ESI来寻址,上面的例子ESI里是00000300H,通过ESI寻址自然寻到1000:00000300处(ESI在串处理中和DS联用),由ESI寻址处的内存地址处的数据自然也就是指从DS:00000300H开始的数据,究竟操作多长数据,由MOV CX,XX来定。 传送(复制)去的地方自然是EDI(EDI和ES联用)寻址到的那个2000:00000800那里.
这就是MOVSB 复制由ESI寻址处的内存地址处的数据至EDI寻址的内存地址处
可能你不解的是MOVSB这个指令只有操作码而没有操作数,其实操作数是隐含的,源操作数是DS:[ESI],目的操作数是ES:[EDI],自然在执行中他们还要递增或递减。那应该在解释指令时也有解释了,就不多说了。

回复的时候为了便于理解,有些就不严谨了。估计意思是说到了。。。
不对之处望大侠们及时指点。以免误导了别人。。。
GGJJyangjinhan 2009-04-30
  • 打赏
  • 举报
回复
谁能好好说说
GGJJyangjinhan 2009-04-30
  • 打赏
  • 举报
回复
这不只是指令问题,我不明白的是这句话

由ESI寻址处的内存地址。

不懂这个后面我都没法看,还有如“在保护模式程序中,ESI自动作为由DS寻址的段内的偏移”不明白,由DS寻址?怎么寻址??
goodider 2009-04-30
  • 打赏
  • 举报
回复
寄存器间接寻址。
nanlingcg 2009-04-30
  • 打赏
  • 举报
回复
寄存器间接寻址。。。
LZ的寻址知识还不很牢固。。。要努力。。。
array020 2009-04-30
  • 打赏
  • 举报
回复
汗,楼上说的要配合REP的

执行一次MOVSB 就是

mov byte ptr es:[di],byte ptr ds:[si] 当然这句编译不了,不过表达了该指令的意思

如果DF为0,则
inc si
inc di

如果DF为1,则
dec si
dec di
光宇广贞 2009-04-30
  • 打赏
  • 举报
回复
自己找一个指令字典,像这类的问题就不用上来问了。还有,自己要学会DEBUG看。
光宇广贞 2009-04-30
  • 打赏
  • 举报
回复
不仅仅是上面所说的,关键是ecx这个位,以ecx为计数,直到ecx减为零为止,将指定的edi和esi指定的数据段的内容进行复制。
lmxd70 2009-04-30
  • 打赏
  • 举报
回复
意思是字符串的首地址放在esi中,目的地址放在edi中,传输时[edi]<-[esi],然后esi,edi都加1,再重复上一过程
BAYNPU 2009-04-30
  • 打赏
  • 举报
回复
就把DS:[ESI]数据复制到ES:[EDI]的内存中,然后...。

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧