汇编语言程序设计07高级过程与字符串和数组.ppt

上传人:小飞机 文档编号:6171005 上传时间:2023-10-02 格式:PPT 页数:31 大小:1.51MB
返回 下载 相关 举报
汇编语言程序设计07高级过程与字符串和数组.ppt_第1页
第1页 / 共31页
汇编语言程序设计07高级过程与字符串和数组.ppt_第2页
第2页 / 共31页
汇编语言程序设计07高级过程与字符串和数组.ppt_第3页
第3页 / 共31页
汇编语言程序设计07高级过程与字符串和数组.ppt_第4页
第4页 / 共31页
汇编语言程序设计07高级过程与字符串和数组.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《汇编语言程序设计07高级过程与字符串和数组.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计07高级过程与字符串和数组.ppt(31页珍藏版)》请在三一办公上搜索。

1、汇编语言程序设计,_07_高级过程与字符串和数组大连理工大学软件学院_朱明2009年5月31日_ V1.1,提问与回顾,第六章内容中我们介绍了移位、乘法和除法指令,扩展加减法指令,以及高级过程的定义和调用的内容 ROL指令在进行向左移位的过程中,最低位用什么数据填充?最高位被移出至何处?IMUL有符号数乘法指令有哪三种基本格式?IDIV进行有符号数除法运算时需要使用CBW、CWQ和CDQ指令进行何种操作?ADC指令在进行加法运算时,考虑哪三个因素相加?LOCAL定义的局部变量保存在何处?为了访问这些变量或访问其中传递的参数,通常需要用到那些寄存器?INVOKE指令与CALL指令在功能上有何不同

2、?,汇编语言程序设计-朱明,2,提问与回顾,ESP与EBP,1 过程调用的堆栈参数传递:将参数压入到堆栈中 2 过程调用与堆栈:将返回地址压入到堆栈中 3 过程中读取参数时使用EBP寄存器寻址,汇编语言程序设计-朱明,3,ESP值减4,返回后地址压入到堆栈中这是一般过程调用的第一个阶段,返回后地址,传递的参数,返回后地址,ESP值减4,将传递的参数压入到堆栈中这是堆栈传递参数的过程调用的第一个阶段,传递的参数,传递的参数,Section 1,EBP,ESP值再减4为使用EBP进行寻址,先将其保护到堆栈中,返回后地址,传递的参数,EBP,传递的参数,ESP与EBP,4 过程中获取堆栈传递来的参数

3、,通过EBP 5 过程运行结束前,需要恢复原来的ESP的值,汇编语言程序设计-朱明,4,Section 1,EBP,使用EBP进行间接寻址前还应当获取正确的位置正确的位置就是当前ESP的位置,即令EBP=ESP,返回后地址,传递的参数,在使用堆栈传递参数的过程中,只能使用EBP寻址如要访问传递来的参数,则对应的位置为EBP+8但是程序运行过程中定义变量则会改变ESP的值,EBP,程序结束之前,应当恢复原有ESP的值相当于释放局部变量占用的堆栈空间此外需要特别注意的是还要清理堆栈,返回后地址,传递的参数,局部变量等,EBP,返回后地址,PROTO伪指令,INVOKE伪指令用来调用带有参数传递的子

4、过程 PROC伪指令可以用来调用带有参数传递的子过程 PROTO伪指令用来为已经存在的过程创建原型 有点像是高级语言函数?,汇编语言程序设计-朱明,5,MyProg PROTO,INVOKE MyProg,MyProg PROCMyProg ENDP,标准使用顺序,INVOKE MyProg,MyProg PROCMyProg ENDP,先实现后使用,过程原型,过程调用,过程实现,过程实现,过程调用,Section 2,多模块过程*,整数求和的过程化设序设计方法 按照功能将程序划分为各个过程 主过程、取得用户输入、计算和、输出计算结果 多模块过程程序 多模块过程指使用MASM的高级过程伪指令I

5、NVOKE、PROTO和带有参数扩展的PROC创建的过程 多模块程序相对于CALL的直接调用,其优点在于检查INVOKE位指令传递的参数和PROC伪指令声明的参数 一个好的多模块过程程序应该具有一定的文件结构 XXX.inc包含文件 XXX_main.asm主过程文件 _YYY.asm,_ZZZ.asm模块文件,汇编语言程序设计-朱明,6,Section 2,多模块过程*,整数求和问题的多模块过程结构 位于C:irvineexamplesch08ModSum32_adva ncedModSum文件夹下,多个文件 sum.inc包含文件:子过程的原型声明 子过程模块:_prompt.asm、_a

6、rraysum.asm、_display.asm对应原型声明内容,汇编语言程序设计-朱明,7,INCLUDEirvine32.incPromptForIntegerPROC,ptrPrompt:BYTE,;提示输入字符串ptrArray:PTR DWORD,;指向数组ArraySize:DWORD;数组大小ArraySumPROTO,DisplaySumPROTO,Section 2,多模块过程*,_display.asm文件的部分内容 主过程模块:Sum_main.asm,包含启动过程main以及对于外部每个过程的调用,该文件使用了INCLUDE伪指令从sum.inc文件中复制过程的原型声明

7、,汇编语言程序设计-朱明,8,INCLUDESum.inc.code;-DisplaySumPROC,ptrPrompt:PTR BYTE,;输出提示字符串theSum:DWORD;运算结果;-pusheaxpushedxmovedx,WriteString.,Section 2,多模块过程*,Sum_main模块文件的部分内容 使用INVOKE、PROTO和PROC的方法能够从应用上隐藏大量的细节问题 以上是高级过程章节的内容,汇编语言程序设计-朱明,9,Section 2,INCLUDESum.inc.codemainPROCcallClrscrINVOKE PromptForIntege

8、rs,ADDR prompt1,ADDR prompt2,ADDR array,CountINVOKE,Section 3,字符串处理,基本的字符串操作指令 MOVSB、MOVSW和MOVSD:移动字符串数据指令,将由ESI寻址的内存地址处的数据复制到EDI寻址的内存地址处 CMPSB、CMPSW和CMPSD:比较字符串,比较由ESI和EDI寻址的两个内存地址处的值 SCASB、SCASW和SCASD:扫描字符串,比较累加器与EDI寻址的内存地址处的内容 STOSB、STOSW和STOSD:存储字符串数据,存储累加值的内容至EDI寻址的内存地址处 LODSB、LODSW和LODSD:字符串装入

9、累加器,加载ESI寻址的内存地址处的数据至累加器,汇编语言程序设计-朱明,10,Section 3,字符串处理,MOVSB、MOVSW和MOVSD B:BYTE、W:WORD、D:DWORD 三条指令会自动修改ESI和EDI的值 自动设置增加还是减小的数值的多少 连续的字符串移动指令使用方法设置ESI和EDI的方向:增加或者减少 CLD:清除方向标值位,也就是正向,ESI和EDI增加 STD:设置方向标值位,也就是反向,ESI和EDI减小 设置ECX寄存器内容为要复制的字符串的数量 设置源字符串偏移ESI和目的字符串偏移EDI两个寄存器 使用重复前缀指令rep设置重复执行的指令(三条指令之一)

10、rep的使用类似于loop,会按照ECX的值重复执行指令,汇编语言程序设计-朱明,11,Section 3,字符串处理,MOVSB、MOVSW和MOVSD 从source复制20个整数到target中,在复制完数据之后,ESI和EDI指向每个数组的最后一个位置 rep仅重复执行其后的指令,即程序中MOVSD指令 MOVSD设置每次ESI和EDI都加4,汇编语言程序设计-朱明,12,.datasourceDWORD 20 DUP(0FFFFFFFFh)targetDWORD 20 DUP(?).codecld;设置正向增加movecx,LENGTHOF source;设置REP的计数器moves

11、i,OFFSET source;设置ESI指向源movedi,OFFSET target;设置EDI指向目的repmovsd;复制双字DWORD,字符串处理,CMPSB、CMPSW和CMPSD 三条指令隐含操作为用左边操作数减去右边操作数,进而用户可以用无符号数跳转指令进行跳转 当需要进行多个双字时,仍需要设置方向,并初始化ECX寄存器的值,使用REP重复指令,汇编语言程序设计-朱明,13,Section 3,.datasourceDWORD 1234htargetDWORD 5678h.codemovesi,OFFSET source;设置ESI指向源movedi,OFFSET target

12、;设置EDI指向目的cmpsd;进行比较jaL1;sourcetargetjmpL2;sourcetarget,字符串处理,SCASB、SCASW和SCASD 分别将AL、AX或EAX中的值同EDI寻址的目标内存中的字节、字或者双字比较 特别适用于在长字符串或数组中查找匹配 除REP循环之外,可以使用REPNE,该指令的循环终止条件为ECX=0或者找到了匹配的内容,汇编语言程序设计-朱明,14,.codemovedi,OFFSET source;设置EDI指向字符串 moval,F;要查找的字母movecx,LENGTHOF source;设置EDI指向目的cld;方向正向增加repnesca

13、sb;不相等则重复jnzquit;没有找到decedi;找到了,EDI回退,Section 3,字符串处理,STOSB、STOSW和STOSD 分别将AL、AX或EAX中的值存储到EDI寻址的目标内存单元中 特别适用于用填充字符串或者数组 LODSB、LODSW和LODSD 从ESI寻址的内存单元中将对应尺寸的内容复制到AL、AX或EAX寄存器中 IRVINE函数库提供的一些字符串操作过程,汇编语言程序设计-朱明,15,;字符串复制过程str_copy PROTO,source:PTR BYTE,target:PTR BYTE,;删除字符串中指定字符str_trim PROTO,pString

14、:PTR BYTE,char:BYTE,Section 3,二维数组,一维数组的存储方式?二维数组的存储方式?二维数组常用行优先的存储方式-一维排列,汇编语言程序设计-朱明,16,Section 4,tableBYTE 10h,20h,30h,40h,50h,10h,20h,30h,40h,小地址,大地址,tableBYTE 10h,20h,30h,40h,50hBYTE 60h,70h,80h,90h,0A0h,10h,20h,30h,40h,小地址,大地址,50h,60h,70h,80h,90h,A0h,二维数组,访问二维数组的两个参数:行号和列号 IA-32中更适合数组访问所需的两种寻址

15、方式 基址变址操作数寻址 相对基址变址操作数寻址 基址变址操作数,汇编语言程序设计-朱明,17,base+index,ebx+esiedi+ecxebp+esi.,tableWORD 1000h,2000h,3000hmovebx,OFFSET tablemovesi,2movax,ebx+esimovedi,OFFSET tablemovecx,4movax,edi+ecx,Section 4,二维数组,通过基址变址操作数寻址 二维数组的通常定义方法($与定义符号,当前地址)Rowsize为数组中每行的元素占用的字节数 行列都是从数字0开始编号的,汇编语言程序设计-朱明,18,tableBY

16、TE 10h,20h,30h,40h,50hRowsize=($-table)BYTE 60h,70h,80h,90h,0A0hBYTE 0B0h,0C0h,0D0h,0E0h,0F0h,Section 4,row_index=1;行1colume_index=2;列2movebx,OFFSET tableaddebx,Rowsize*row_indexmovesi,column_indexmoval,ebx+esi,二维数组,通过基址变址操作数寻址 比例因子在二维数组访问中的作用(变址偏移倍数)Rowsize为数组中每行的元素占用的字节数 比例因子必须和元素尺寸一致,汇编语言程序设计-朱明,

17、19,tableWORD 10h,20h,30h,40h,50hRowsize=($-table)WORD 60h,70h,80h,90h,0A0hWORD 0B0h,0C0h,0D0h,0E0h,0F0h,Section 4,row_index=1;行1colume_index=2;列2movebx,OFFSET tableaddebx,Rowsize*row_indexmovesi,column_indexmovax,ebx+esi*TYPE table,二维数组,通过相对基址变址操作数寻址 其中的displacement(偏移)可以使变量的名字或者常量表达式,汇编语言程序设计-朱明,20

18、,base+index+displacementdisplacementbase+index,tableDWORD 10h,20h,30h,40h,50hRowsize=($-table)DWORD 60h,70h,80h,90h,0A0hDWORD 0B0h,0C0h,0D0h,0E0h,0F0h,Section 4,movebx,Rowsizemovesi,2moveax,tableebx+esi*TYPE table,二维数组,课堂练习 假设一个二维双字数组有三个逻辑行和四个逻辑列,如果使用ESI作为行指针,那么应该给ESI加上什么值才能从当前行移动到下一行?通常采用什么方法能够获得数组

19、每行元素占用的空间?假设一个二维双字数组有三个逻辑行和四个逻辑列,分别使用ESI和EDI寄存器来寻址第二行第三列的值的表达式 默认存储的任何数组的的行和列都是从0开始的 在寻址的过程中应当考虑每行元素占用的空间 在寻址的过程中应当考虑当前行前面的元素占用的空间,汇编语言程序设计-朱明,21,Section 4,数组的排序与查找,冒泡排序算法 内层循环比较元素的大小 外层循环比较元素的数目,汇编语言程序设计-朱明,22,冒泡排序第一次处理时间复杂度为O(n2),Section 4,数组的排序与查找,冒泡排序算法的伪代码 CX1代表外层循环计数,CX2代表内存循环计数,汇编语言程序设计-朱明,23

20、,cx1=N 1while(cx 1)esi=addr(array);cx2=cx1;while(cx2 0)if(arrayesi arrayesi+4)exchange(arrayesi,arrayesi+4)add esi,4dec cx2dec cx1,Section 4,数组的排序与查找,冒泡排序算法的汇编代码,汇编语言程序设计-朱明,24,movecx,countdececx;N=N-1L1:pushecx;保存外层循环计数器ECXmovesi,pArray;指向第一个元素L2:moveax,esi;获取该处元素的值cmpesi+4,eax;与下一个元素作比较jgL3;如果下一个元

21、素大则忽略xchgeax,esi+4;当前元素大,交换位置movesi,eaxL3:addesi,4;下一个位置loopL2;内部循环popecx;恢复外层循环计数器ECXloopL1;外层循环ret,Section 4,数组的排序与查找,二分法的数组查找 二分法的数组必须是已经按照升序或者降序排列好 查找范围名为从first和last的下标表示,若firstlast则退出 计算first和last标示的数组的中点 把要搜索的值SearchValue与中点处的值比较 如果值相等则返回,表明在数组中发现了匹配项 如果SearchValue大于中点处的值,则把first重新设置为中点之后的下一个位

22、置 如果SearchValue小于中点处的值,则把last重新设置为中点之后的下一个位置 开始一次新的比较 二分法的时间复杂度O(log n),汇编语言程序设计-朱明,25,Section 4,数组的排序与查找,通过C/C+实现二分法,汇编语言程序设计-朱明,26,int BinSearch(int value,const int SearchVal,int count)int first=0;int last=count 1;while(first SearchVal)last=mid-1;elsereturn mid;return-1;,Section 4,Section 4,课程作业,基

23、于冒泡排序与二分法查找的课程作业 本次作业占总成绩的45%(45分)作业基本要求 需要完成课程报告 报告包含:程序设计要求;程序运行环境;程序需要使用的外部过程;程序运行流程图;程序代码;程序运行测试时的屏幕截图,共计以上6项 完成课程的代码 将代码附带在课程报告中 作业的提交方式 打印版的课程报告,A4纸单面打印,报告中明确标明姓名、学号和班级以及电子邮件 同时需要提交电子版,发送到,汇编语言程序设计-朱明,27,课程作业,基于冒泡排序与二分法的课程作业 程序设计要求 按照之前介绍的课程说明与环境设置方法,通过IA-32汇编语言和MASM课程环境完成程序设计和调试 按照顺序依次执行以下的步骤

24、 设计一个数组,至少有10个元素,使用随机整数填充数组 显示出排序前的数组的内容 使用冒泡排序算法对数组进行排序 显示出排序后的数组的内容 要求用户输入一个整数 使用二分法从数组中查找用户输入的整数 显示二分法查找的结果(未找到或者在排序后数组中的位置),汇编语言程序设计-朱明,28,Section 4,课程作业,基于冒泡排序与二分法的课程作业 多模块的过程设计方法,程序应当包含以下的模块 主模块:包含主过程、显示结果过程和获取用户输入的要查找的整数数值的过程,并包含程序的基本设置,如入口等 冒泡排序模块:对32位有符号整数进行冒泡排序 二分法查找模块:对32位有符号整数进行二分法查找 随机填

25、充模块:用随机的32位有符号整数填充数组 数组输出模块:将32位的有符号数的数组输出到屏幕上 包含文件:.inc文件包含了住模块中调用的过程的原型,汇编语言程序设计-朱明,29,B_main.asmBsort.asm、Bsearch.asm、FillArray.asm、PrtArray.asm,Section 4,章节回顾,在高级过程调用过程中,有参数传递和局部变量的情况下,EBP与ESP的变化过程以及对应关系 INVOKE伪指令、带参数的PROC伪指令和PROTO伪指令在高级过程中的作用 多模块过程的程序设计方法 5类15条基本的字符串处理指令的各自功能 一维数组和二维数组在内存中的存放形式

26、 通过基址变址操作数寻址和相对基址变址操作数寻址实现对于数组的访问,汇编语言程序设计-朱明,30,章节回顾,章节回顾,以下的问题我们应当轻松回答 PROC用于定义一个过程,在过程中常会用到寄存器,为了保存寄存器中的内容,除了人工进行压栈和弹栈操作外,还可以使用哪条伪指令完成该功能?在保护模式下,过程调用时最后一个压入堆栈的参数存储在什么位置上?(相对于EBP)如何声明一个名为myArr的20个双字的局部数组 在执行简单字符串指令时,通过什么指令能够设置方向标志位使指针寄存器在内存中反向移动 写一个32位模式下相对基址变址操作数寻址的例子 对一个已经排序好的n个元素的数组使用二分法排序,最多只需要比较多少次?,汇编语言程序设计-朱明,31,章节回顾,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号