汇编语言

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指令 MOVSB,MOVSW,MOVSD CMPSB,CMPSW,CMPSD SCASB,SCASW,SCASD STOSB,STOSW,STOSD LODSB,LODSW,LODSD 描述
移动字符串:将 一个整数从内存中的一个 位置拷贝到另外一个位置 比较字符串:比较两个内存值 扫描字符串:将一个整数与内存值比较 存储字符串数据:将一个整数存储到内存 中 将字符串数据装入累加器:从内存中取出 一个整数送至累加器(AL,AX或EAX)
10
STOSB,STOSW和STOSD指令
STOSB,STOSW和STOSD指令将AL/AX/EAX的内容存储在EDI指向的内 存单元中,同时EDI的值将依据方向标志的值增加或减少。同REP前 缀联合使用的时候,这组指令在将整个字符串或数组填充为某个值 时非常有用。
.data Count = 100 string1 BYTE Count DUP(?) .code mov al,0FFh mov edi,OFFSET string1 mov ecx,Count cld rep stosb
基址变址(base-index)操作数将两个寄存器的值相加(称为基址 和变址)来产生偏移地址,操作数中可使用任意两个32位通用寄存 器。在实地址模式下也可以使用16位的寄存器作为基址变址操作数
,在这种情况下,惟一允许的组合是[bx+si],[bx+di],[bp+si]和 [bp+di](在通常情况下应避免使用BP寄存器,除非要访问的是堆栈 操作数)。
2007年10月
汇编语言
15
整数数组的查找和排序
冒泡排序法
冒泡排序(bubble sort)法从位置0和1开始比较每对数组值,如果两 个值得顺序不对则进行交换。下图显示了对一系列整数进行的一次 完整的比较过程:
3 1 7 5 2 9 4 3 1 3 7 5 2 9 4 3 1 3 7 5 2 9 4 3 1 3 5 7 2 9 4 3 1 3 5 2 7 9 4 3 1 3 5 2 7 9 4 3 1 5 5 2 7 4 9 3 1 5 5 2 7 4 3 9
2007年10月 汇编语言
ESI和EDI自动增加或减少的值 ESI和EDI自动增加或减少的值
1 2 4
8
CMPSB,CMPSW和CMPSD指令
CMPSB,CMPSW和CMPSD指令每次将ESI指向的内存操作数同EDI指向 的内存操作数相比较: CMPSB,CMPSW和CMPSD指令可以同重复前缀联合使用,方向标志决定 了ESI和EDI的值是增加还是减少。 CMPSB CMPSW CMPSD
汇编语言
数学科学学院计算机应用技术专业
修兴强 北京师范大学数学科学学院 202.112.84.202/~xiux/download.php E-mail: xq_xiu@
汇编语言
2007年10月
1
第9章 字符串和数组
2007年10月
汇编语言
2
基本字符串操作指令
Intel指令集中有5组高度优化的简单字符串指令,处理字节 、字和双字数组。
2007年10月
汇编语言
18
二进制查找非常高效,因为它使用了二分法查找策略,每次循环后 查找范围都会减半,通常该算法被称为是时间复杂度为O(log n)的 算法,也就是说如果数组元素增加到n倍,那么平均查找时间只增加 到log n倍。由于查找时间非常短,下表简单地记录了各种不同大小 的数组最多需要的比较次数: 数组的大小(n) 最多比较次数(1+log n) 数组的大小(n) 最多比较次数(1+log
在第一遍处理完毕之后, 数组并未被排序,因此外层 循环又开始另一轮处理,在 完成n-1遍处理后,就能保证 数组是按顺序排列好了的。
冒泡排序法是一个时间复杂度为O(n^2)的算法,也就是说 排序时间与数组元素的数目(n)之间是二次方的关系。
2007年10月 汇编语言 16
SubbleSort
2007年10月
mov al,[esi]
inc esi 数组乘法的例子Mult.asm。
2007年10月
汇编语言
12
精选的字符串过程
Str_compare过程 Str_length过程 Str_copy过程 Str_trim过程 Str_ucase过程
2007年10月
Hale Waihona Puke 汇编语言13二维数组
许多应用程序,无论是数学还是其他方面,都要涉及到二维数组的 处理。Intel指令集提供了基址变址和相对基址变址这两种非常适 合于数组应用程序的操作数类型。
2007年10月
汇编语言
4
使用重复前缀
字符串操作指令本身每次只处理一个内存值,但如果增加一个重复 前缀的话,该指令就会使用ECX作为计数器进行重复。换句话说,就 是可以使用一条指令处理整个数组。可以使用的重复前缀如下所 示: REP REPZ,REPE REPNZ,REPNE
当ECX>0时重复 当零标志被设置并且ECX>0时重复 当零标志被清除并且ECX>0时重复
期末成绩计算方法:
MAX { 平时成绩 * 40% + 期末成绩 * 60%, 期末成绩 }
2007年10月
汇编语言
21
比较字节 比较字 比较双字
例子:比较两个字符串Cmpsb.asm。
比较结束时,ESI和EDI最终指向两个字符串不同之处后面的一个位置; 如果两个字符串相同的话,ESI和EDI将指向各自字符串结尾处后面的一个 位置。 只有在两个字符串长度相等的条件下,使用CMPSB指令才是可行的。
2007年10月
汇编语言
64 1 024 65 536 1 048 576 4 294 967 296 7 11 17 21 33
2007年10月
汇编语言
19
BinarySearch
2007年10月
汇编语言
20
第二次作业
阅读Irvine32.asm中的代码,选择至少3个过程,对每 一行代码写注释,要求说明清楚过程的作用和方法。1周内 提交。
9
SCASB,SCASW和SCASD指令
SCASB,SCASW和SCASD指令将AL/AX/EAX中的值同目标内存中的字节 、字或双字相比较,目标内存数据是由EDI寻址的。 这些指令在一个字符串或数组中查找一个值的时候特别有用。如果 使用REPE(或REP)前缀,当ECX>0并且AL/AX/EAX不能匹配内存中的 值时,指令将继续扫描字符串或数组。REPNE前缀使得指令扫描字符 串直到AL/AX/EAX匹配内存中的一个值或ECX=0为止。
2007年10月
汇编语言
3
上页中的每条指令都使用ESI或EDI寄存器,或同时使用二者以寻址 内存。字符串操作指令只使用内存操作数。简单字符串操作指令可 以自动重复执行,这使得它在处理字符串和数组时特别有用。 在保护模式程序中,ESI被作为偏移自动地在DS指定的段中寻址, EDI自动地在ES指定的段中寻址,DS和ES总是被设置为同样的值而 且无法改变它们。 在实地址模式下,字符串操作指令使用SI和DI寄存器来寻址内存。 SI是DS段中的偏移,DI是ES段中的偏移。我们通常在main过程的开 始将ES和DS设置为同样的段值。
.data alpha BYTE ‘ABCDEFGH’,0 .code 扫描匹配字符串例子: mov edi,OFFSET alpha mov al,’F’ mov ecx,LENGTHOF alpha cld repne scasb jnz quit dec edi
2007年10月 汇编语言
;将EDI指向字符串 ;查找字符F ;将计数器设置为字符串长度 ;清除方向标志 ;在字符串中重复比较直至相等 ;如果没有找到则推出 ;将EDI值减1
基址变址操作数在访问二维表格的时候非常有用,通常使用基址寄存器 存放行偏移,变址寄存器存放列偏移。表格的例子(table.asm)。
2007年10月
汇编语言
14
相对基址变址操作数将偏移、基址寄存器和变址寄存器组合起
来产生一个有效地址,下面是该操作数最常见的两种格式:
[base + index + displacement] displacement[base + index]
汇编语言
6
使用重复前缀的例子
cld mov mov mov rep
esi,OFFSET string1 edi,OFFSET string2 ecx,10 movsb
;清除方向标志 ;将ESI指向源字符串 ;将EDI指向目的字符串 ;将计数器设置为10 ;重复按字节移动10个数据
2007年10月
汇编语言
汇编语言
17
二进制查找
二进制查找算法在大数组中查找一个项时被证明是非常高效的,但 该算法有一个重要的前提条件:数组元素必须已经按升序或降序 排列。下面是该算法的一个非正式描述:
在进行查找之前,首先要求用户输入一个整数,我们称之为search Val。 1.查找范围由名为first和last的下标表示,如果first>last则退出查找, 表明没有匹配项 2.计算由下标first和last标识的数组的中点。 3.将search Val值同数组中点处的值进行比较: 如果两个值相等则从过程中返回,EAX中包含中点值,这个返回值表明 在数组中发现了匹配项。 如果search Val大于中点处的数值,将第一个数组下标重设为中点之后 的下一个位置。 如果search Val小于中点处的数值,将最后一个数组下标重设为重点之 前的一个位置。 4.重复步骤1。
;将被存储的数值 ;将EDI指向目的字符串 ;设置计数器 ;清除方向标志 ;将AL的内容存储在EDI指向的字符串中
2007年10月
汇编语言
11
LODSB,LODSW和LODSD指令
LODSB,LODSW和LODSD指令从ESI指向的内存位置向AL/AX/EAX中装 入一个值,同时ESI的值根据方向标志值增加或减少。我们很少将 REP前缀同LODS指令联用,因为装入到累加器中的每个新值都会覆盖 掉以前的值,相反,一般仅用LODS指令来装入一个值。例如LODSB指 令可以替代下面的两条指令(假设方向标志被清除):
偏移(Displacement)可以是变量的名字或常量表达式,基址和变 址可以使用任意的32位寄存器。由于在实地址模式下只允许16位
的寄存器作为基址/变址操作数,因此这时的限制和在实模式下使 用基址变址方式寻址的限制是一样的。
和基址变址操作数一样,相对基址变址操作数也很适用于处理二维表格 。表格的名字可以用来作为操作数的偏移部分,基地址寄存器用于存放 表格的行号,变址寄存器用于存放列号。表格的例子(table2.asm)。
2007年10月
汇编语言
5
方向标志
简单字符串指令使用方向标志来决定ESI和EDI是自动增加还是自动 减少。 方向标志可以通过CLD和STD指令显式地改变: CLD ;清除方向标志
STD ;设置方向标志
方向标志值
清除 设置
对ESI和EDI的影响 ESI和EDI的影响
增加 减少
寻址顺序
低-高 高-低
2007年10月
7
MOVSB,MOVSW和MOVSD指令
MOVSB,MOVSW和MOVSD指令从ESI指向的内存位置拷贝数据到EDI指 向的内存位置,同时ESI和EDI寄存器自动增加或减少(依据方向指 标的值而定)。 MOVSB MOVSW MOVDSD
移动(拷贝)字节 移动(拷贝)字 移动(拷贝)双字
MOVSB,MOVSW和MOVSD指令可以和重复前缀联合使用,方向标志决定 ESI和EDI的值是增加还是减少,增减的数字大小如下所示: 指令 MOVBSB MOVSW MOVSD
相关文档
最新文档