为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

汇编语言程序设计_03_简单的算术运算与数据传送

2013-03-14 39页 ppt 4MB 37阅读

用户头像

is_412139

暂无简介

举报
汇编语言程序设计_03_简单的算术运算与数据传送nullnull_03_简单的算术运算与数据传送 大连理工大学软件学院_朱明 2009年5月31日_ V1.1第二章提问第二章提问 如何定义一个字符串变量使其包含10个“hi”? DWORD 12345678h按照小尾顺序存储,如果地址00400050h存储的是34h,那么004000051h和地址00400049h存储的分别是什么? MASM中的标识符需要遵循什么规则? 列举MASM中数据类型的三种? MASM汇编语言中的PROC、ENDP和END伪指令分别由什么作用?汇编语言程序设计 - 朱明*前章回顾前章回顾 本...
汇编语言程序设计_03_简单的算术运算与数据传送
nullnull_03_简单的算术运算与数据传送 大连理工大学软件学院_朱明 2009年5月31日_ V1.1第二章提问第二章提问 如何定义一个字符串变量使其包含10个“hi”? DWORD 12345678h按照小尾顺序存储,如果地址00400050h存储的是34h,那么004000051h和地址00400049h存储的分别是什么? MASM中的标识符需要遵循什么规则? 列举MASM中数据类型的三种? MASM汇编语言中的PROC、ENDP和END伪指令分别由什么作用?汇编语言程序设计 - 朱明*前章回顾前章回顾 本章程序中的DumpRegs过程 该过程的源代码irvine32.asm中,第404行开始 Macros.inc文件中的第248行开始,简单说一下 mShowRegister使用了宏定义 使用了宏内部变量(LOCAL伪指令定义) 使用了字符串变量(”®Name”) 使用了OFFSET操作符返回字符串的偏移地址 调用了两个常用的过程(WriteString和WriteHex),分别用来显示字符串和寄存器中的十六进制数 汇编语言程序设计 - 朱明*操作数类型 指令系统三种操作数表示:操作数类型汇编语言程序设计 - 朱明*MOV指令MOV指令 从源操作数向目的操作数复制数据 目的操作数不能够是CS、EIP和IP 操作数不能同为内存操作数(mem) 立即数不能直接送段寄存器 操作数尺寸必须相同汇编语言程序设计 - 朱明*MOV指令MOV指令 MOV,从源操作数向目的操作数复制数据 小尺寸操作数复制到大尺寸操作数中的问 需要判定操作数,然后进行一些适当的处理? 如果操作数是负数会怎么样?汇编语言程序设计 - 朱明*ECX ?再将一个WORD送到ecx中,怎么做?CX ?ECX ?将一个DWORD送到ecx中,怎么做?MOV指令MOV指令 MOVZX,零扩展传送 MOVZX只能用于无符号整数 使用0扩展值后 ECX=00009999h 汇编语言程序设计 - 朱明*CXECXCXECX0000MOV指令MOV指令 MOVSX,符号扩展传送 MOVSX只能用于有符号整数 使用符号扩展值之后 ECX=FFFFFFF0h 如果CX=-3呢,扩展出来的ECX的结果是多少?汇编语言程序设计 - 朱明*CXECXMOV指令MOV指令 MOVSX/MOVZX与MOV的应用比较 用处和原理以及操作目的不同 操作数的范围不同 MOV,5种基本的操作范围 MOVSX、MOVZX,2种基本的操作范围 操作数的属性不同 MOV,要求操作数尺寸必须一致 source和destination的位数必须一致 MOVSX/MOVZX,要求操作数尺寸必须不一致 source必须要比destination小 reg32,reg8/mem8 reg32,reg16/mem16 reg16,reg8/mem8 汇编语言程序设计 - 朱明*MOV指令MOV指令 从源操作数向目的操作数复制数据 其中的value1,在汇编完成后是什么?数据?或者其他? 使用变量时,隐含着一个寻址的问题——直接寻址汇编语言程序设计 - 朱明*汇编之后生成的机器码MOV指令MOV指令 直接寻址的过程中的偏移量问题 受篇幅影响程序间的部分内容略汇编语言程序设计 - 朱明*AL = ?AL = ?AL = ?MOV指令MOV指令 直接寻址的过程中的偏移量问题 有效地址:在变量的编译地址后面加上一个常数所得到的表示式,例如前面提到的value1+4,称为~ 采用方括号的方式使用有效地址,就表示需要对有效地址表达式进行寻址以获得该有效地址处的内容 MASM中可以省略掉方括号,上面的两个是等价的 MASM不会对有效地址进行范围检查,因此可能会造成对预定的有效范围之外的数据的访问 汇编语言程序设计 - 朱明*MOV指令MOV指令 直接寻址的过程中的偏移量问题 在使用16位字或者32位双字以及其他的数据类型的时候,不要忘记对应的偏移量的单位是多少 WORD:2,DWORD:4汇编语言程序设计 - 朱明*AX = ?AX = ?XCHG指令XCHG指令 XCHG,数据交换指令 交换数据,实际上是交换数据在容器中的位置 XCHG指令不能使用立即数作为操作数 XCHG指令不能直接交换两个内存操作数 必须使用至少一个寄存器作为临时存储容器汇编语言程序设计 - 朱明*INC、DEC和ADD指令INC、DEC和ADD指令 INC,增指令 DEC,减指令 ADD,将源操作数和目的操作数相加 ADD操作不改变源操作数 ADD的运算结果保存在目的操作数中汇编语言程序设计 - 朱明*SUB指令SUB指令 SUB,将源操作数从目的操作数中减掉 SUB操作不改变源操作数 SUB的运算结果保存在目的操作数中 SUB指令的执行实际上是ADD与补码的运算汇编语言程序设计 - 朱明*+进位了?NEG指令NEG指令 NEG,将对应的数字求二进制的补码 负数的补码的求法 将对应的操作数所有位取反然后加一得到汇编语言程序设计 - 朱明*+算术综合运算算术综合运算 简单的算术综合运算可以通过前面的指令完成 MOV、ADD、SUB、INC、DEC、NEG 其中所有的变量都是32位有符号 假设Xval为26, Yval为30, Zval为40 工程的建立和属性修改部分的内容省略 定义所使用到的各个变量(SDWORD) 处理表达式中的子项的值 Xval的取反 将Yval的值复制到寄存器中并减去Zval 最后把各个子项的值相加汇编语言程序设计 - 朱明*标志位的影响标志位的影响 前面讲到过关于EFLAGS的问题 标志位对于结果的判定有重要的作用 CF:判断无符号整数运算是否发生了溢出 OF:判断有符号整数运算是否发生了溢出 SF:判断运算结果是否为负数 仅判定运算结果的最高有效位是否被置位 ZF:判断运算结果是否为零 PF:判断最低字节内的1的个数是否为偶数 AC:判断运算结果的最低有效字节的第3位是否向高位产生了进位 汇编语言程序设计 - 朱明* EFLAGS:由控制CPU的位或者CPU的运算结果的独立位构成 CF、OF、SF、ZF、AC、PF标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 PF:奇偶标志位汇编语言程序设计 - 朱明*标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 ZF:零标志位汇编语言程序设计 - 朱明*标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 SF:符号标志位(最高有效位的判断) 符号标志位不区分有符号数和无符号数 不能通过符号位判断是有符号数还是无符号数汇编语言程序设计 - 朱明*标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 SF:符号标志位(最高有效位的判断) 符号标志位不区分有符号数和无符号数 不能通过符号位判断是有符号数还是无符号数汇编语言程序设计 - 朱明*标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 AC:辅助进位标志位 是第三位向第四位进位的值汇编语言程序设计 - 朱明*标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 CF:进位(借位呢?)标志位(无符号算术运算) INC和DEC不影响CF标志位 非零整数的NEG操作将设置CF汇编语言程序设计 - 朱明*如果是减法呢 ???标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 OF:溢出标志位(有符号算术运算) INC和DEC会影响OF标志位汇编语言程序设计 - 朱明*标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 从硬件的角度看OF与CF的判定方法 无符号数的算术运算进位的判定方法? 无符号运算,最高位的高一位产生了数据 硬件上的实现非常简单,设多一位的全加器即可 有符号数的算术运算溢出的判定方法? 两个正数加法的结果是负数 两个负数相加的结果是正数 两个符号不同的数相加的结果永远不会发生溢出 硬件的判定方法:第6位进位和第7位进位的异或的结果 还记得什么是异或操作么?汇编语言程序设计 - 朱明*标志位的影响标志位的影响 所有的标志位的变化都是在进行算术运算后产生 从硬件的角度看OF与CF的判定方法 有符号数的算术运算溢出的判定方法? 硬件的判定方法:第6位进位和第7位进位的异或的结果 还记得什么是异或操作么?汇编语言程序设计 - 朱明*+有进位 1无进位 0⊕结果为 1有溢出了 !!!标志位的影响标志位的影响 各个标志位的影响因素和判定方法总结 PF:最低字节内的1的个数是否为偶数 ZF:运算结果是否为零 SF:运算结果的最高有效位是否为1 AC:判断运算结果的最低有效字节的第3位是否向高位产生了进位 CF:运算结果的最高有效位的再高一位是否为1 OF:两个操作数的最高位的进位与次高位进位的异或运算的结果 同时需要注意什么样的算术运算能影响那些标志位 尤其要注意NEG、INC、DEC汇编语言程序设计 - 朱明*OFFSET操作符OFFSET操作符 实模式下的段和地址(半复习) 16位段值:16位段偏移 32位保护模式下的段和地址(半复习) 16位段选择符:32位段偏移 每个任务的逻辑空间可达64TB,计算方法? OFFSET操作符返回数据标号的偏移地址汇编语言程序设计 - 朱明*ALIGN伪指令ALIGN伪指令 ALIGN伪指令可以使指令或变量的位置按照字节、字、双字进行边界对齐 边界值可以是1、2或者是4 对齐可以提高CPU存取内存的效率 变量:填充数据 指令:填充NOP(空指令)汇编语言程序设计 - 朱明*PTR操作符PTR操作符 使用PTR操作符对操作数进行尺寸上的重载 功能上相当于C语言中的强制类型转换 PTR操作符不改变操作数的原类型,仅重载新类型汇编语言程序设计 - 朱明*PTR操作符PTR操作符 使用PTR操作符对操作数进行尺寸上的重载 CPU并不在乎你定的数据类型,它只是按照程序定义的规则去访问内存汇编语言程序设计 - 朱明*TYPE操作符TYPE操作符 TYPE操作符返回按照字节为单位的元素的大小 BYTE(1)、WORD(2)…. 汇编语言程序设计 - 朱明*LENGTHOF和SIZEOF操作符LENGTHOF和SIZEOF操作符 LENGTHOF操作符返回数组中的元素的个数 只能返回跨行数组第一行的元素的数目 SIZEOF操作符的返回值= LENGTHOF的返回值 * TYPE的返回值汇编语言程序设计 - 朱明*LABEL伪指令LABEL伪指令 LABEL伪指令用于在指定位置插入一个不占用存储空间的、但具有属性特征的标号 相同的存储空间的不同的名字(标号) LABEL也可用于合并成大数 汇编语言程序设计 - 朱明*0001h0000h0002h0003hwVal dVal章节回顾章节回顾 本章中以下内容是应当掌握 MASM汇编语言的操作数类型 数据传送指令MOV、MOVZX和MOVSX的用法 直接寻址的过程中的偏移量问题 XCHG、INC、DEC和NEG指令的用法 AC、PF、ZF、OF、SF和AC的影响因素和判定条件 OFFSET操作符、ALIGN伪指令、PTR操作符的作用 SIZE操作符和TYPE操作符、LENGTHOF操作符的作用和三者之间的关系 LABEL伪指令的作用汇编语言程序设计 - 朱明*章节回顾章节回顾 以下的问题我们应当轻松回答 r/m32、imm16分别表示什么? 用汇编语言实现类似下面的运算过程 AX = ( -wVal1 + BX ) – wval2 连续执行下面指令对于CF、SF、ZF和OF影响分别如何 mov ax, 7FF0h add al, 10h add ah, 1 add ax, 2 myBytes BYTE 10h, 20h, 30h, 40h 将其前两个字节送入DX寄存中,使其为2010h 将其内容全部传送至EAX寄存器中汇编语言程序设计 - 朱明*思考问题思考问题 本章中的学习了一些指令 如果我们要用这些指令对一个数组进行求和的操作 假设在程序运行之前,数组的大小(5个元素)和元素大小都是已知的(DWORD) 要求你的程序仅使用今天以前讲过的指令完成 本道题目作为一个小作业,占总成绩的10% 如果是抄书的则不给本次作业的成绩 不可以使用间接寻址等更高级的寻址方式完成 下次课上课之前发送至zmingcnc@163.com 姓名_班级_学号,附件形式发送代码汇编语言程序设计 - 朱明*
/
本文档为【汇编语言程序设计_03_简单的算术运算与数据传送】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索