- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编语言 lybliu@cuit.edu.cn, QQ (学校主页?教学平台) 第9章 串操作 9.2 串操作指令 9.3 精选的部分字串过程 9.4 二维数组 9.4.2 基址-变址操作数 9.4.3 基址-变址-操作数(相对基址变址操作数) 9.5 查找与排序 9.1 引言 大多数程序90%的时间运行在10%的代码上。如对这10%的代码进行优化,效益更加明显。通常这部分代码处于深层循环中。 这一章介绍字串处理,以及使用数组的一些技术,它们都会用到循环。 9.2 基本的串操作指令 基本的串操作指令有五个 MOVS CMPS SCAS STOS LODS 每个指令因处理对象的宽度不同,各有三个后缀B,W,D 这些指令都使用各自隐含的寄存器,源操作数由DS:ESI指向,目的操作数由ES:EDI指向。有的指令涉及到累加器,因处理的宽度不同,分别对应AL,AX,EAX 在保护模式下,ES和DS的值相同,且应用程序不能修改。 执行串指令时,ESI或EDI的值会改变,可以增加,可以减小,由标志寄存器中的DF位确定:如果DF为0,则ESI或EDI的值会增加;如果DF为1,则ESI或EDI的值减小。ESI或EDI改变的大小由宽度后缀确定,如为后缀B,则改变1,如为后缀W,则改变2,如为后缀D,则改变4。 DF位由专门的指令修改:CLD指令将DF清0;STD指令将DF置1。 串操作指令支持称作重复操作的前缀,加上这个前缀后,则指令重复执行多次,重复次数由ECX中的值确定。 重复前缀有几种 REP 以ECX作循环控制直到ECX减到0时停止 REPZ/REPE 当ECX0并且ZF位为1时才重复操作 REPNZ/REPNE 当ECX0并且ZF位为0时才重复操作 示例 CLD REP MOVSB ;将一段内存内容复制到另一段地方,esi指向源内存开始,EDI指向目的内存的开始,ecx表示内存段的长度。一条串操作指令相当于一个循环。 通常,使用串操作指令时,一般使用带宽度后缀的助记符,此时,指令中不用指明操作数,即形如 MOVSB ,操作数是隐含的。 也支持不带宽度后缀的助记符,但此时,指令必须带操作数,形如 MOVS V1 , V2 V1和V2是两个同宽度的内存变量,只是指明操作的宽度 9.2.1 MOVS指令 MOVS指令把ESI指向的内存内容复制到EDI指向的内存单元中(相当于mov [edi],[esi]), ESI和EDI两个寄存器的值同时增加或减少,如DF位为0,则增加,否则,则减少。 例子:复制双字数组 .data source dword 20 dup(0ffh) target dword 20 dup(?) .code ; … cld mov ecx , lengthof source mov esi , offset source mov edi , offset target rep movsd ;将source开始的20个双字复制到target中 ; … 9.2.2 CMPS 将ESI指向的内存同EDI指向的内存相比较(相当于cmp [esi],[edi],但cmp指令两操作数不能同时为内存操作数,这儿只是表明意思),同时修改ESI和EDI的值。一般会跟repe或repne前缀,比较两个串是否相等。 例子:单独比较 .data source dword 1234h target dword 5678h .code ; … mov esi , offset source mov edi , offset target cmpsd ;比较双字 ja L1 ;如果sourcetarge跳转至L1 jmp L2 ;如果source=target跳转至L2,本例即是 ; …. 例子:比较串 .data CmpsTestSource byte ABCDE CmpsTestTarget byte AB .code CMPSTEST proc cld mov esi , offset CmpsTestSource mov eax, esi ;用于执行完串比较后,对比eax与esi的值 mov edi , offset CmpsTestTarget mov ecx, lengthof CmpsTestSource ;最多比较次数,此例为5 repe cmpsb ; 比较到第三个字母时,因两者不等,重复不再继续,但当前串 ; 操作执行完,e
文档评论(0)