第3章数据处理(3)算数与逻辑运算指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;EAX=AAFF736FH,OF= ;EAX=AAFF736FH,OF=0,SF=0,ZF=0,PF=1,CF=0 SF= ZF= PF= CF= ax,3 add ax,3fffh ;ax=736fh+3fffh=b36eh ax=736fh+3fffh=b36eh 736fh+ 36
;EAX=AAFFB36EH,OF= ;EAX=AAFFB36EH,OF=1,SF=1,ZF=0,PF=0,CF=0 SF= ZF= PF= CF= eax,88000000 88000000h add eax,88000000h ;0aaffb36eh+88000000h aaffb36eh+88000000h 36eh+88000000
1
3.5.1 加法指令
加法指令 ADD 带进位加法指令 ADC 增量指令 INC INC不影响进位标志CF外 不影响进位标志CF 除INC不影响进位标志CF外 其他指令按定义影响全部状态标志位 按照运算结果相应设置各个状态标志为0或为1 按照运算结果相应设置各个状态标志为0或为1
数据传送类指令不影响( 不改变) 数据传送类指令不影响(=不改变)状态标志 不影响 加法和减法指令根据结果按定义改变 根据结果按定义改变状态标志 加法和减法指令根据结果按定义改变状态标志
14
如果 AX=0FFFFH, 执行 NEG AX 后,AX=0001, 可以看到,并不是数据FFFFH的补码, FFFFH的补码 可以看到,并不是数据FFFFH的补码, 如果是补码,应该是除符号位外,其它位取反, 如果是补码,应该是除符号位外,其它位取反,然后在最低位 +1 1111 1111 1111 1111 1000 0000 0000 0000 ;除符号外,每一位取反 除符号外, 最低位+1 1000 0000 0000 0001 ;最低位+1 8 0 0 1 ; 8001
;EAX=32FFB36EH,OF=1,SF=0,ZF=0,PF=0,CF=1 ;EAX=32FFB36EH,OF= SF= ZF= PF= CF=
4
带进位加法指令ADC 2. 带进位加法指令ADC
两个操作数相加,再加CF,结果送目的操作数 两个操作数相加,再加CF, CF 按照定义影响6 按照定义影响6个状态标志位 ;dest←dest+src+ ADC dest,src ;dest←dest+src+CF 注意事项与ADD ADD指令相同 注意事项与ADD指令相同 主要用于与ADD指令相结合实现多精度数的加法, 主要用于与ADD指令相结合实现多精度数的加法,例如 指令相结合实现多精度数的加法 64为数据的加法 为数据的加法: 64为数据的加法:
11
减量指令DEC 3. 减量指令DEC
对操作数减1(减量)再将结果返回原处 对操作数减1 减量) reg/mem←reg/mem- DEC reg/mem ;减1:reg/mem←reg/mem-1 用于计数器和地址指针的调整 不影响进位CF标志, CF标志 不影响进位CF标志,影响其他状态标志位 例如 dec ecx dec esi dec wvar dec dvar[ebx+edi]
8
减法指令SUB 1. 减法指令SUB
目的操作数减去源操作数,差送到目的操作数 目的操作数减去源操作数, 减法:dest←dest- SUB dest,src ;减法:dest←dest-src
注: ① ② ③ ④ dest是寄存器,src可以是立即数、寄存器、 dest是寄存器,src可以是立即数、寄存器、存储单元 是寄存器 可以是立即数 dest是存储单元 src可以是立即数 是存储单元, 可以是立即数、 dest是存储单元,src可以是立即数、寄存器 不能两个操作数都是存储器操作数 dest不能是立即数 dest不能是立即数
到此,已经学习过的算术运算指令, 到此,已经学习过的算术运算指令,注意进行功能对比 ADD与 ADD与ADC? ? ADD与 ADD与SUB? ? SUB与 SUB与SBB? ? ADC与 ADC与SBB? ? INC与 INC与DEC? ? DEC与 DEC与NEG? ?
6
增量指令INC 3. 增量指令INC
只有一个操作数:寄存器或存储单元 只有一个操作数: 对操作数加1 增量) 对操作数加1(增量)再将结果返回原处 reg/mem←reg/mem+ INC reg/mem ;加1:reg/mem←reg/mem+1 用于计数器和地址指针的调整 不影响进位CF标志, CF标志 不影响进位CF标志,影响其他状态标志位 例如 inc ecx inc esi inc wvar inc dvar[ebx+edi]
10
带借位减Baidu Nhomakorabea指令SBB 2. 带借位减法指令SBB
目的操作数减去源操作数,再减CF,结果送目的操作数 目的操作数减去源操作数,再减CF, CF 按照定义影响6 按照定义影响6个状态标志位 格式: 格式:SBB dest,src ;dest←dest-src- ;dest←dest-src-CF
操作数的注意事项与SUB指令相同。 操作数的注意事项与SUB指令相同。 SUB指令相同 用于与SUB指令相结合实现多精度数的减法 用于与SUB指令相结合实现多精度数的减法 SUB 先将两个操作数的低32位相减( SUB指令) 先将两个操作数的低32位相减(用SUB指令) 32位相减 指令 然后减高位部分、并减去借位( SBB指令 指令) 然后减高位部分、并减去借位(用SBB指令)
7
3.5.2 减法指令
减法指令 SUB 带借位减法指令 SBB 减量指令 DEC 求补指令 NEG 比较指令 CMP DEC不影响CF标志外 不影响CF 除DEC不影响CF标志外 其他按定义影响全部状态标志位
数据传送类指令不影响( 不改变) 数据传送类指令不影响(=不改变)状态标志 不影响 加法和减法指令根据结果按定义改变 根据结果按定义改变状态标志 加法和减法指令根据结果按定义改变状态标志
13
求补指令NEG 4. 求补指令NEG
对操作数执行求补运算, 对操作数执行求补运算,即用零减去操作数 reg←0-reg, NEG reg/mem ;reg←0-reg,或者 mem←0- ;mem←0-mem 实际上是求机器负数——负数变正, ——负数变正 实际上是求机器负数——负数变正,正数变负 绝对值不变。 数,绝对值不变。 与求数的补码不一样,这点要注意。 与求数的补码不一样,这点要注意。 对标志的影响与用零作减法的SUB指令一样。 SUB指令一样 对标志的影响与用零作减法的SUB指令一样。 如果是一个负数,利用该指令, 如果是一个负数,利用该指令,可以求出它的 绝对值。 绝对值。
16
比较指令CMP 5. 比较指令CMP
SUB与 SUB与CMP? ?
将目的操作数减去源操作数,按照减法结果影响状态 将目的操作数减去源操作数, 标志, 标志,差值不回送目的操作数 做减法运算:dest- CMP dest,src ;做减法运算:dest-src 根据标志状态获知两个操作数的大小关系 给条件转移等指令使用其形成的状态标志 操作数与减法指令相同
15
可用于求补码或由补码求其绝对值 mov ax,0ff64h ;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1, neg al ;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1,CF=1 ;AX=FFFFH,OF=0,SF=1,ZF=0,PF=1, sub al,9dh ;AX=FFFFH,OF=0,SF=1,ZF=0,PF=1,CF=1 ;AX=0001H,OF=0,SF=0,ZF=0,PF=0, neg ax ;AX=0001H,OF=0,SF=0,ZF=0,PF=0,CF=1 ;AX=0000H,OF=0,SF=0,ZF=1,PF=1, dec al ;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=1 ;AX=0000H,OF=0,SF=0,ZF=1,PF=1, neg ax ;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=0
3.5 算术运算类指令
算术运算 对数据进行加减乘除 基本的数据处理方法 加减运算有“ 的结果外, 加减运算有 “ 和 ” 或 “ 差 ” 的结果外 , 还有进借 溢出等状态标志, 位、溢出等状态标志,也是结果的一部分 注意算术运算类指令对标志的影响 注意算术运算类指令对标志的影响 掌握: 掌握:加法和减法指令 熟悉: 熟悉:乘法和除法指令 理解:零位扩展和符号扩展 理解:
2
加法指令ADD 1. 加法指令ADD
目的操作数加上源操作数, 目的操作数加上源操作数,和送到目的操作数 ADD dest,src 注:
① ② ③ ④
;加法:dest←dest+src 加法:dest←dest+
dest是寄存器,src可以是立即数、寄存器、存储单元 dest是寄存器,src可以是立即数、寄存器、 是寄存器 可以是立即数 Dest是存储单元 src可以是立即数 是存储单元, 可以是立即数、 Dest是存储单元,src可以是立即数、寄存器 不能两个操作数都是存储器操作数 Dest不能是立即数 Dest不能是立即数
可以是字节加法、16位加法、32位加法。 可以是字节加法、16位加法、32位加法。 位加法 位加法 影响6 影响6个状态标志位
3
例 eax,0aaff7348 7348h mov eax,0aaff7348h al,27 27h add al,27h ;EAX=AAFF7348H EAX=AAFF7348H 7348 ;al=48h+27h=6Fh al=48h+27h=6 48h+27h=
12
〔例〕大小写字母转换程序
数据段定义的是小写字母 定义的是小写字母, ; 数据段定义的是小写字母,转换为大写字母后显示 大写=小写- 大写=小写-20H msg byte 'welcome',0 小写=大写+ 小写=大写+20H ; 代码段 msg)mov ecx,(lengthof msg)-1 ECX等于字符串长度 ; ECX等于字符串长度 EBX= mov ebx,0 ; EBX=0指向头一个字母 msg[ebx],'a'again: sub msg[ebx],'a'-'A' 小写字母减20H 20H转换为大写 ; 小写字母减20H转换为大写 inc ebx ; 指向下一个字母 loop again ; 循环 mov eax,offset msg call dispmsg ; 显示
先将两个操作数的低32位相加( ADD指令) 先将两个操作数的低32位相加(用ADD指令) 32位相加 指令 再加高位部分、并将进位加到高位( ADC指令 指令) 再加高位部分、并将进位加到高位(用ADC指令)
5
〔例〕64位数据相加程序 64位数据相加程序 取低32 32位 mov eax,dword ptr qvar1 ;取低32位 加低32 32位 设置CF add eax,dword ptr qvar2 ;加低32位,设置CF 取高32 32位 mov edx,dword ptr qvar1+4 ;取高32位 加高32 32位 同时加CF adc edx,dword ptr qvar2+4 ;加高32位,同时加CF
可以是字节、16位、32位减法。 可以是字节、16位 32位减法。 位减法 按照运算结果设置6 按照运算结果设置6个状态标志位
9
例 mov eax,0aaff7348h sub al,27h ;EAX=AAFF7321H,OF= ;EAX=AAFF7321H,OF=0,SF=0,ZF=0,PF=1,CF=0 SF= ZF= PF= CF= sub ax,3fffh ;EAX=AAFF3322H,OF= ;EAX=AAFF3322H,OF=0,SF=0,ZF=0,PF=1,CF=0 SF= ZF= PF= CF= sub eax,0bb000000h ;EAX=EFFF3322H,OF= ;EAX=EFFF3322H,OF=0,SF=1,ZF=0,PF=1,CF=1 SF= ZF= PF= CF= ;EAX= ;EAX=AAFF7348H