汇编语言程序设计06整数运算指令与高级过程课件_第1页
汇编语言程序设计06整数运算指令与高级过程课件_第2页
汇编语言程序设计06整数运算指令与高级过程课件_第3页
汇编语言程序设计06整数运算指令与高级过程课件_第4页
汇编语言程序设计06整数运算指令与高级过程课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计_06_整数运算指令与高级过程_2009年5月31日_

V1.1提问与回顾第五章内容中我们介绍并练习了外部链接库中的一些常用过程调用这些过程使用什么指令?在逻辑运算部分内容中

AND指令用于进行逻辑与运算,但他在改变标志位的同时也改变了目的操作数,什么指令能够实现逻辑与运算功能但只改变标志位而不改变操作数?同样,哪条指令与SUB类似但只改变标志位?该条指令比较后,如相等则跳转,应使用什么指令?尝试将下面的为指令转化成为汇编代码和决策伪指令汇编语言程序设计-朱明2if

(bx>cx)X=1;提问与回顾…

SHL(ShiftLeft),逻辑左移操作

最低位以0填充,最高位传送到CF中SHR(Shift

Right),逻辑右移操作

最高位以0填充,最低位传送到CF中

左移和右移的意义:乘法和除法逻辑移位汇编语言程序设计-朱明3B7B6B5B4B3B2B1B00SHL/SHRreg, imm8mem, imm8reg, CLmem, CLB7B6B4B3B2B1B0CFB5mov al,0D0hAL=11010000bCF0shr al,1AL=01101000bCF=1Section1…

SAL(ShiftArithmeticLeft),算术左移操作

最低位以0填充,最高位传送到CF中,同SHLSAR(Shift

ArithmeticRight),算术右移操作

最高位以自身填充,最低位传送到CF中右移的算术意义:有符号数除法算术移位汇编语言程序设计-朱明5B7B6B5B4B3B2B1B00SAL/SARreg, imm8mem, imm8reg, CLmem, CLB7B6B4B3B2B1B0CFB5mov al,-128AL=1000

0000bCFsar al,4AL=11111000bSection1…

ROL(RotateLeft),循环左移操作

最低位以最高位填充,最高位传送到CF中ROR(RotateRight),循环右移操作

最高位以最低位填充,最低位传送到CF中循环移位不丢弃数据可用来将特定的位移入CF中循环移位汇编语言程序设计-朱明6B7B6B5B4B3B2B1B0ROL/RORreg, imm8mem, imm8reg, CLmem, CLB7B6B4B3B2B1B0CFB5CFSection1…

SHLD(Shift

Left

Double),双精度左移操作目的操作数向左移指定位数空位用源操作数的高位填充源操作数不会有任何改变SHRD(ShiftRightDouble)目的操作数向右移指定位数空位用源操作数的低位填充源操作数不会有任何改变双精度移位汇编语言程序设计-朱明71001SHLD/SHLRreg16, reg16, CL/imm8mem16,reg16, CL/imm8reg32, reg32, CL/imm8mem32,reg32, CL/imm8Section1…1011101001101001101110100110bxaxmov bx,9BA6hmov ax,0AC36hshld bx,ax,4乘法指令IMUL有符号数乘法指令IMUL有单操作数、双操作数和三操作数三种格式单操作数的情况与MUL相同此时如果高半部分是结果的符号位扩展则OF=0汇编语言程序设计-朱明9mov al,48mov bl,4imul blAX=00C0hOF=1IMULreg/mem8reg/mem16reg/mem32mov al,-4mov bl,4imul blAX=FFF0hOF=0mov ax,48mov bx,4imul bxDX=0000hAX=00C0hOF=0Section2…乘法指令IMUL有符号数乘法指令

IMUL有单操作数、双操作数和三操作数三种格式双操作数的乘积存储在第一个操作数中,但只能是寄存器,第二个操作数可以是寄存器、内存操作数或者立即数

三操作数的乘积存储在第一个操作数中,但只能是寄存器,第二操作数可以是寄存器或内存,第三操作数是立即数要特别注意运算结果的尺寸问题:超出则CF和OF置位汇编语言程序设计-朱明10Section2…IMUL,双操作数reg16,

reg/mem16reg16,

imm8/16reg32,

reg/mem32reg32,

imm8/32IMUL,三操作数reg16,reg/mem16,imm8reg16,reg/mem16,imm16reg32,reg/mem32,imm8reg32,reg/mem32,imm32乘法指令

关于MUL和IMUL乘法的问题传统意义上对于乘法运算是能少用就尽量少用乘法的执行效率要低于移位操作的速度理论上后一种方法的执行效率要远高于前一种方法但是对于某些处理器则可能有所不同老式的体系结构上,如Pentium4,比较会很明显在嵌入式系统上,比较同样会很明显在Core以上的体系结构上,比较结果不明显汇编语言程序设计-朱明11Section2…mov ebx,eaxshl eax,5shl ebx,2add eax,ebxmov ebx,36mul ebx除法指令

IDIV有符号数除法指令在进行除法指令前,应首先进行符号位扩展

符号位扩展用于将AL、AX和EAX的符号分别扩展至AH、DX和EDX中,以保证运算结果的符号正确汇编语言程序设计-朱明13IDIVreg/mem8reg/mem16reg/mem32Section3…mov al,-48cbwmov bl,5idiv blAL=-9AH=-3被除数除数商余数符号扩展AXreg/mem8ALAHCWBDX:AXreg/mem16AXDXCWDEDX:EAXreg/mem32EAXEDXCDQ除法指令除法的溢出问题(超出寄存器范围)

除法的商过大导致目的操作数无法装载使用更大的寄存器可以减少溢出的问题汇编语言程序设计-朱明14DIV/IDIVreg/mem8reg/mem16reg/mem32Section3…mov ax,1000hmov bl,10hdiv blAL=100h?被除数除数商余数符号扩展AXreg/mem8ALAHCWBDX:AXreg/mem16AXDXCWDEDX:EAXreg/mem32EAXEDXCDQ乘法和除法运算使用汇编语言完成以下算术运算汇编语言程序设计-朱明15Section3…val4=(val1+val2)*val3val4=(val1*5)/(val2-3)val4=(val1*(-5))/(-val2%3) mov eax,val1 add eax,val2 mul val3 jc tooBig mov val4,eax jmp ;后面程序tooBig: ;数据过大的处理加法扩展

0FFFFFFFFh+0FFFFFFFFh=>EDX:EAXADC指令在进行加法运算时,会将CF标志位也作为一个加数参与加法运算通过加法扩展指令实现64位的加法运算?结果保存在DWORD数组中汇编语言程序设计-朱明17mov edx,0mov eax,0FFFFFFFFhadd eax,0FFFFFFFFhEAX=FFFFFFFEh CF=1adc edx,0EDX=00000001h CF=0Section4…加法扩展两个64位数的定义

数据在内存中的存储与阶段运算汇编语言程序设计-朱明18val1 QWORD 0A2B2A40674981234hval2 QWORD 08010870000234502hsum DWORD 3

DUP(?)34129874…B2A202452300…10+80val1[ESI]val2[EDI]L1: mov eax,[esi] adc eax,[edi] pushfd mov [ebx],eax add esi,4 add edi,4 add ebx,4 popfdloop L1 adc [ebx],0 popadsum[EBX]+Section4…加法扩展两个64位数的定义

数据在内存中的存储与阶段运算汇编语言程序设计-朱明19val1 QWORD 0A2B2A40674981234hval2 QWORD 08010870000234502hsum DWORD 3

DUP(?)34129874…B2A202452300…10+80val1[ESI]val2[EDI]main PROCmov esi,OFFSETval1mov edi,OFFSETval2mov ebx,OFFSETsummov ecx,2call ;调用前面的过程mov esi,OFFSETsummov ebx,4mov ecx,4call DumpMemssum[EBX]+Section4…局部变量

C语言中的局部变量——汇编语言中的局部变量局部变量在单个过程中创建、使用并销毁局部变量在堆栈上运行,汇编时不确定初始值但是在运行时进行初始化

LOCAL伪指令LOCAL伪指令定义的变量列表需要占用堆栈空间要保证堆栈中有足够的空间供局部变量使用汇编语言程序设计-朱明21LOCAL 变量列表LOCAL 标号:类型[,标号:列表][,标号:列表]Section5…LOCAL temp:DWORD,Flags:BYTE局部变量

LOCAL伪指令定义的变量列表需要占用堆栈空间需要为局部变量的保存准备保留的堆栈空间使用STACK伪指令定义4096字节的堆栈空间过程的嵌套调用会造成局部变量数量的叠加Sub1+Sub2的局部变量将占用800字节的堆栈空间汇编语言程序设计-朱明22.STACK 4096Sub1

PROC LOCAL arr1[50]:DWORD…Sub2PROC LOCAL arr2[150]:DWORD…Section5…局部变量与堆栈堆栈与过程的调用(复习内容)堆栈在过程调用中用来保存返回地址和现场数据汇编语言程序设计-朱明23PA返回后地址……PA返回后地址PB返回后地址PB返回后地址PA返回后地址…PC返回后地址PB返回后地址PA返回后地址…PB返回后地址PA返回后地址…PA返回后地址…PC返回后地址PB返回后地址PA返回后地址……00000FF4…00000FF8000000A500000FFCESPSection5…使用到了堆栈指针ESP

ESP指向有效数据,以恢复现场局部变量与堆栈*局部变量的空间开辟与EBP和ESP的关系部分内容可以参考

ENTER指令

LEAVE指令以上指令不作要求*部分仅要求了解即可汇编语言程序设计-朱明25voidMySub(){ intX=10; int

Y=20;}push ebpmov ebp,espsub esp,8mov DWORDPTR[ebp-4],10mov DWORDPTR[ebp-8],20mov esp,ebppop ebpret…小地址Y,20X,10EBP返回地址大地址EBP[EBP-4][EBP-8]ESPSection5…局部变量与存储*在了解局部变量与堆栈的关系后看LOCAL伪指令ESP减掉4以便给双字节的局部变量留出空间

BYTE依然占用4字节存储空间汇编语言程序设计-朱明26Exam1 PROC LOCAL temp:DWORD mov eax,temp retExam1 ENDPpush ebpmov ebp,espsub esp,4mov eax,[ebp-4]mov esp,ebppop ebpret小地址tempEBP返回地址大地址EBP[EBP-4]ESPExam2 PROC LOCAL temp:BYTE mov al,temp retExam2 ENDP小地址大地址NULLNULLNULLtempEBPSection5…EBP[EBP-4]ESP[EBP-1]递归递归——直接或者间接调用自身子过程递归,必须要有一个终止条件递归会涉及到过程的调用,至少要到用4字节的堆栈空间,可能会占用处理器、占用内存并导致堆栈溢出思考一下下面问题的解决采用递归的方法求从n的阶乘

n!=n*(n-1)*(n-2)*…*3*2*1汇编语言程序设计-朱明27int

factorial(intn){ if(n==0) return1; else returnn*factorial(n-1);}Section5…递归要考虑的几个问题(假设使用局部变量传递参数)如何进行乘法运算(MUL指令)递归过程的返回(局部变量的删除,L2)

增加过程的定义和结束的内容汇编语言程序设计-朱明29mov ebx,[ebp+8]mul ebx(5);恢复EBP的值ret 4(5)pop ebpFactorial

PROC….….Factorial

ENDPSection5…递归

n的阶乘问题解决伪代码

该问题的解决方法中,使用了堆栈传递参数的方法注意程序执行过程中堆栈的变化使用上更简洁的参数传递方法?INVOKE汇编语言程序设计-朱明30main PROC push 10 ;10的阶乘 call Factorialmain ENDPEND mainFactorial

PROC ;局部变量传递 ;对于n的值的判定 ;递归过程的调用 ;乘法运算 ;递归过程的返回Factorial

ENDPSection5…INVOKE与PROC

INVOKE伪指令

调用一个名为AddTwo的过程,传递val1和val2参数

PROC伪指令的改进汇编语言程序设计-朱明31INVOKE 过程名[,参数列表]Section6…立即数 10h,3000h,OFFSETarr1整数表达式 (10*20)变量名 arr1,val1地址表达式 [esi],arr1[esi]寄存器名 eax,ebx,ecxADDR名 ADDR arr1INVOKE AddTwo,val1,val2AddTwo PROC, val1:BYTE, val2:BYTEINVOKE与PROC

第一次作业的题目——数组求和问题将该程序结构化为一个主过程和一个字过程主过程负责调用子过程并保存运算结果子过程负责对数组各元素进行加法运算汇编语言程序设计-朱明32arr1DWORD111h,222h,333h,444h,555hESI保存有数组的首地址ECX保存数组的元素数目调用数组加法运算子过程EAX保存运算结果获取EAX中的运算结果Section6…INVOKE与PROC第一次作业的题目——数组求和问题汇编语言程序设计-朱明33 mov eax,0L1: add eax,[esi] add esi,4 loop L1Section6…核心数组加法运算代码ArraySum PROC, offArr:DWORD sizeArr:DWORD pop esi,ecx retArraySum

ENDP子过程返回和定义 pushesi,ecx movesi,offArr movecx,sizeArr使用获得的参数定义带有参数传递的过程哦?使用USES伪指令可以简化现场的保护和恢复过程在PROC,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论