MOVSB﹑MOVSW 和 REP 指令
来源:互联网 发布:照片制作mv软件 编辑:程序博客网 时间:2024/05/17 05:14
MOVSB﹑MOVSW 和 REP 指令
先说搬移字串。搬移字串指令有两种,分別是 MOVSB 和 MOVSW,先说MOVSB。MOVSB 的英文是 movestring byte,意思是搬移一个字节,它是把 DS:SI所指位址的一个位元组搬移到 ES:DI所指的位址上,搬移后原來的內容不变,但是原来 ES:DI所指的內容会被覆蓋而且在搬移之后 SI 和 DI会自动地址向下一个要搬移的位址。
一般而言,通常程序设计师只搬一个字节,通常都会重复很多次,如果要重复的话,就得把重复次数先存储在CX 寄存器,并在 MOVSB 之前加上 REP 指令。
下面演示一下用 DEBUG
C:\WINDOWS>debug [Enter]-a [Enter]1C6C:0100 mov cx,10 [Enter]1C6C:0103 mov si,200 [Enter]1C6C:0106 mov di,300 [Enter]1C6C:0109 rep movsb [Enter]1C6C:010B [Enter]-a 200 [Enter]1C6C:0200 db "I learn assembly" [Enter]1C6C:0210 [Enter]
上面的程式片段是把位于 1C6C:0200 的『I learnassembly』字串移搬到 1C6C:0300 处,此字串共 16 个字元,所以 CX 存入10H。现在來追踪看看。
-t [Enter]AX=0000 BX=0000 CX=0010 DX=0000 SP=FFEE BP=0000 SI=0200 DI=0000DS=1C6C ES=1C6C SS=1C6C CS=1C6C IP=0106 NV UP EI PL NZ NA PO NC1C6C:0103 BE0002 MOV SI,0200-t [Enter]AX=0000 BX=0000 CX=0010 DX=0000 SP=FFEE BP=0000 SI=0200 DI=0000DS=1C6C ES=1C6C SS=1C6C CS=1C6C IP=0106 NV UP EI PL NZ NA PO NC1C6C:0106 BF0003 MOV DI,0300-t [Enter]AX=0000 BX=0000 CX=0010 DX=0000 SP=FFEE BP=0000 SI=0200 DI=0300DS=1C6C ES=1C6C SS=1C6C CS=1C6C IP=0109 NV UP EI PL NZ NA PO NC1C6C:0109 F3 REPZ1C6C:010A A4 MOVSB-d 300 L10 [Enter]
在还未搬移之前,先看看 1C6C:0300 处的內容,再追踪。
1C6C:0300 E8 A3 F6 74 08 49 46 FE-06 D7 DC EB EF E8 C3 F9 ...t.IF.........-t [Enter]AX=0000 BX=0000 CX=000F DX=0000 SP=FFEE BP=0000 SI=0201 DI=0301DS=1C6C ES=1C6C SS=1C6C CS=1C6C IP=0109 NV UP EI PL NZ NA PO NC1C6C:0109 F3 REPZ1C6C:010A A4 MOVSB-d 300 L10 [Enter]1C6C:0300 49 A3 F6 74 08 49 46 FE-06 D7 DC EB EF E8 C3 F9 I..t.IF.........
在搬移一次之后,再看看 1C6C:0300处的內容,发现上面已经和原來不一样了 (红色部份)。这是因为 movsb已经把第零个字节搬到 1C6C:0300 处,而覆蓋了原來的內容。而 CX也減少一,SI﹑DI 也各增加一而指向下一个位址。好!再追踪看看。
-t [Enter]AX=0000 BX=0000 CX=000E DX=0000 SP=FFEE BP=0000 SI=0202 DI=0302DS=1C6C ES=1C6C SS=1C6C CS=1C6C IP=0109 NV UP EI PL NZ NA PO NC1C6C:0109 F3 REPZ1C6C:010A A4 MOVSB
您有沒有发现,在搬移完之前,IP 都指向 REP MOVSB 指令 ( 即 REPMOVSB 所在位址)。要追踪这么多次,太麻烦了,干脆直接执行到搬移字串到结束。
-g 10b [Enter]AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0210 DI=0310DS=1C6C ES=1C6C SS=1C6C CS=1C6C IP=010B NV UP EI PL NZ NA PO NC1C6C:010B 06 PUSH ES-d 200 L10 [Enter]1C6C:0200 49 20 6C 65 61 72 6E 20-61 73 73 65 6D 62 6C 79 I learn assembly-d 300 L 10 [Enter]1C6C:0300 49 20 6C 65 61 72 6E 20-61 73 73 65 6D 62 6C 79 I learn assembly
搬移结束后,1C6C:0200 和 1C6C:0300 处的內容均相同,所以 MOVSB事实上是把原來字串复制到要搬移之处,而原字串是原封不动的。
MOVSW 的作用方式都和 MOVSB 相同,所不同的是 MOVSW每次搬移一个字,所以每次搬运完 SI﹑DI 會增加 2,而 CX仍然減少一。
- MOVSB﹑MOVSW 和 REP 指令
- 串传送指令MOVSB MOVSW
- 汇编指令 MOV、MOVSB、MOVSW、
- movsb movsw movsd 指令详解
- movsd,movsw,movsb汇编指令
- DF标志和串移动指令(movsb/movsw)
- rep movsb 和 cld
- X86 MOVSB MOVSW MOVSD MOVSQ 指令详解
- MOVSB、MOVSW
- rep movsb
- rep movsb
- 汇编指令: MOV、MOVSB、MOVSW、MOVSD、MOVSX、MOVZX
- 汇编语言:MOVSB,MOVSW,MOVSD
- 汇编字符串处理指令stosb、lodsb、movsw、scasb、rep
- 32位汇编语言学习笔记(30)--rep movsb指令
- 常用代码段 rep movsw/rep movsw
- 汇编:rep movsb
- 字符串处理相关的指令: MOVSB, MOVSW, MOVSD 汇编基础一日一学习25
- 内部类访问规则
- 记第一次百度电话面试
- Response方法使用
- cvHoughCircles
- 雨中飘荡的回忆
- MOVSB﹑MOVSW 和 REP 指令
- Thread 常搞混的几个概念sleep、wait、yield、interrupt
- Socket编程
- cocos2d-x学习笔记——cocoa目录
- 多线程的学习笔记
- web 开发视频资源
- 实验五:利用Servlet实现登陆系统
- 想念那一池莲花
- 复习MySQL