文章目录

  • 一、进位和溢出标志
  • 二、零标志、符号标志和奇偶标志
    • 标志一览表
  • 三、算术运算类指令
    • 1.ADD指令
    • 2、SUB指令
    • 3.ADC和SBB指令
    • 4.INC、DEC和NEG指令
      • 加减法指令一览表
    • 5.乘法指令
    • 6.除法指令
    • 7.零位扩展和符号扩展

一、进位和溢出标志

  • 状态标志
    状态标志是处理器最基本的标志
    ►一方面:作为加减运算和逻辑运算的辅助结果
    ►另一方面:构成各种条件,实现程序分支

  • 进位标志CF
    当加减运算结果的最高有效位有进位(加法)或借位(减 法)时,进位标志置1,即CF=1;否则CF=0
    针对无符号整数,判断加减结果是否超出表达范围

  • 溢出标志OF
    有符号数加减结果有溢出,则OF=1;否则OF=0
    针对有符号整数,判断加减结果是否超出表达范围

溢出标志的人工判断
只有当两个相同符号数相加(含两个不同符号数相减) 而运算结果的符号与原数据符号相反时,产生溢出
其他情况下,不会产生溢出

  • 进位和溢出的区别

►进位标志反映无符号整数运算结果是否超出范围
有进位,加上进位或借位后运算结果仍然正确

►溢出标志反映有符号整数运算结果是否超出范围
有溢出,运算结果已经不正确

处理器按照无符号整数求得结果
►设置进位标志CF
►设置溢出标志OF

程序员决定
无符号数,关心进位
有符号数,注意溢出

二、零标志、符号标志和奇偶标志

  • 零标志
    运算结果为0,则ZF=1,否则ZF=0
  • 符号标志SF
    运算结果最高位为1,则SF=1;否则SF=0
  • 奇偶标志PF
    当运算结果最低字节中“1”的个数为零或偶数时,PF=1;
    否则PF=0

影响状态标志的指令
►需要关注对标志影响的主要指令:
加减运算指令、逻辑运算指令、移位指令等
►只用于影响标志的特殊指令1:比较指令CMP
进行减法运算
用于判断两个数据大小、是否相等
►只用于影响标志的特殊指令2:测试指令TEST
进行逻辑与运算
用于判断某位为0或为1等

标志一览表

标志 功能 判断
CF 进位标志 有进位:CF=1;无进位:CF=0
OF 溢出标志 有溢出:OF=1;无溢出:OF=0
ZF 零标志 运算结果为0:ZF=1;不为0:ZF=0
SF 符号标志 运算结果最高位为1:SF=1;最高位为0:SF=0(SF与结果最高位保持一致
PF 奇偶标志(可记为偶数标志) 运算结果最低字节中“1”的个数为偶数或0时:PF=1;为奇数时:PF=0

三、算术运算类指令

算术运算对数据进行加减乘除
这是基本的数据处理方法
注意,加减运算有“和”或“差”的结果外,
还有进借位、溢出等状态标志,也是结果的一部分

1.ADD指令

加法指令:
(1)加法指令 ADD
(2)带进位加法指令 ADC
(3)增量指令 INC
►除INC不影响进位标志CF外
►其他指令按定义影响全部状态标志位
即,按照运算结果相应设置各个状态标志为0或为1

  • 加法指令ADD

目的操作数加上源操作数,和送到目的操作数

ADD reg, imm/reg/mem
;reg←reg+imm/reg/mem
ADD mem, imm/reg
;mem←mem+imm/reg

►按照定义影响状态标志位
►支持8位(字节)、16位(字)和32位(双字)数据运算

ADD指令:8位加法
mov eax,0aaff7348h
add al,27h ;8位加法
;最高位是D7
-------------------------
加法之前EAX AAFF7348H8位加法         +27H—————————
加法之后EAX AAFF736FH
ADD指令:16位加法
add ax,3fffh
;16位加法
;最高位是D15
-----------------------
加法之前EAX  AAFF736FH
16位加法        +3FFFH——————————
加法之后EAX  AAFFB36EH

ADD指令是最基本的加法指令
支持8、16和32位加法运算
►并按照8、16和32位相应影响状态标志
►但PF标志只利用低8位结果
ADD dest, src
; dest←dest+src

2、SUB指令

减法指令:
减法指令 SUB
带借位减法指令 SBB
减量指令 DEC
求补指令 NEG
比较指令 CMP
►除DEC不影响CF标志外
►其他按定义影响全部状态标志位

mov eax,0aaff7348h
sub al,27h ;8位减法
;最高位是D7
----------------------
减法之前EAX  AAFF7348H
8位减法           -27H———————————
减法之后EAX  AAFF7321H
sub ax,3fffh
;16位减法
;最高位是D15
------------------------
减法之前EAX AAFF7321H
16位减法       -3FFFH————————————
减法之后EAX AAFF3322H
sub eax,0bb000000h
;32位减法
;最高位是D31
-----------------------
减法之前EAX AAFF3322H
32位减法   -BB000000H————————————
减法之后EAX EFFF3322H

SUB指令是最基本的减法指令
支持8、16和32位减法运算
►并按照8、16和32位相应影响状态标志
►但PF标志只利用低8位结果
SUB dest, src
; dest←dest - src

3.ADC和SBB指令

ADC和SBB指令是带进(借)位的加法、减法指令
支持8、16和32位加法、减法运算
►并按照8、16和32位相应影响状态标志
►但PF标志只利用低8位结果
ADC dest, src
; dest←dest + src +CF
SBB dest, src
; dest←dest – src – CF

用于支持大于32位整数的加减运算

ADC和ADD、SBB和SUB相结合实现高精度数的加减法:
►先用ADD/SUB指令将两个操作数的低32位相加减 ►再用ADC/SBB指令加减高位部分
►并将进位加到高位、或高位减去借位

64位数据相减程序:
mov eax,dword ptr qvar1 ;取低32位
add eax,dword ptr qvar2 ;加低32位,设置CF
mov edx,dword ptr qvar1+4 ;取高32位
adc edx,dword ptr qvar2+4 ;加高32位,同时加CF
-----------------------------------------------------ADD指令     ADC指令67783000    82347856H + 67762000    82348998H ——————————————————————————    CEEE5001    046901EEH
64位数据相减程序:
mov eax,dword ptr qvar1 ;取低32位
sub eax,dword ptr qvar2 ;减低32位,设置CF
mov edx,dword ptr qvar1+4 ;取高32位
sbb edx,dword ptr qvar2+4 ;减高32位,同时减CF
---------------------------------------------SBB指令    SUB指令67783000    82347856H+ 67762000    82348998H——————————————————————00020FFF    FFFFEEBEH 

4.INC、DEC和NEG指令

  • 增量指令INC
只有一个操作数:寄存器或存储单元
对操作数加1(增量)再将结果返回原处
INC reg/mem    ;加1:reg/mem←reg/mem+1
用于计数器和地址指针的调整
►不影响进位CF标志,影响其他状态标志位inc ecx
inc dword ptr [ebx]
inc wvarinc bl
inc word ptr [esi]
inc wvar[edi]
  • 减量指令DEC
只有一个操作数:寄存器或存储单元
对操作数减1(减量)再将结果返回原处
DEC reg/mem ;减1:reg/mem←reg/mem-1
用于计数器和地址指针的调整
►不影响进位CF标志,影响其他状态标志位dec cx
dec byte ptr [ebx]
dec wvardec bl
dec word ptr [esi]
dec wvar[edi]
  • 求补指令
对操作数执行求补运算,即用零减去操作数
NEG reg/mem ;reg/mem←0-reg/mem
 对标志的影响与用零作减法的SUB指令一样
 可用于对负数求补码或由补码求其绝对值neg al
neg byte ptr [ebx]
neg wvar[esi]neg ax
neg word ptr [ebx]
neg wvar[edi]

INC、DEC和NEG是加减运算的辅助指令
►INC实现指针加1(与ADD加1功能相同)、不影响CF
►DEC实现指针减1(与SUB减1功能相同)、不影响CF
►NEG进行数据求补(使用0减功能实现) 这些指令都只给出一个操作数位置
►既是源操作数,也是目的操作数

加减法指令一览表

加法指令 执行操作
ADD dest,src src+dest->dest
ADC dest,src dest+src+CF->dest
INC reg reg+1->reg
减法指令 执行操作
SUB dest,src dest-src->dest
SBB dest,src dest-src-CF->dest
DEC reg reg-1->reg
NEG reg 0-reg->reg

5.乘法指令

IA-32处理器的乘法和除法指令比较特殊
针对无符号数和有符号数有各自的指令
►有符号数指令前用I(sIgned)表示
隐含使用EAX(和EDX)寄存器
加减指令只进行无符号数运算
利用CF和OF区别无符号数和有符号数

  • 基本的乘法指令MUL
无符号数乘法指令
MUL reg/mem
有符号数乘法指令
IMUL reg/mem
两数相乘、乘积倍长
----------------------
;8位乘法(r8/m8)
AX=AL×r8/m8
;16位乘法(r16/m16)
DX.AX=AX×r16/m16
;32位乘法(r32/m32)
EDX.EAX=EAX×r32/m32
  • 无符号数乘法
计算二进制数乘法:A5H×64H
;用MUL指令作无符号数乘法
mov al,0a5h
mov bl,64h
mul bl
  • 乘积不倍长的乘法指令
双操作数乘法指令
IMUL reg, reg/mem/imm
3操作数乘法指令
IMUL reg, reg/mem, imm
乘积不倍长,注意溢出
CF=OF=1,表示溢出
---------------------------
;16位乘法
r16=r16×r16/m16/i16/i8
r16=r16/m16×i16/i8
;32位乘法(r32/m32)
r32=r32×r32/m32/i32/i8
r32=r32/m32×i32/i8用于支持高级语言的类型一致的乘法运算

6.除法指令

  • 除法指令DIV
无符号数除法指令
DIV reg/mem
有符号数除法指令
IDIV reg/mem;8位除法(r8/m8)
AX÷r8/m8,AL=商、AH=余数
;16位除法(r16/m16)
DX.AX÷r16/m16,
AX=商、DX=余数
;32位除法(r32/m32)
EDX.EAX÷r32/m32,
EAX=商、EDX=余数
  • 无符号除法
计算二进制数除法:400H÷B4H
;用DIV指令作无符号数除法
mov ax,400h
mov bl,0b4h
div bl
--------------------------AL 400H 1024÷BL ÷B4H ÷180_______________
(商)  AL  05H    5
(余数)AH  7CH   124
  • 有符号数除法
计算二进制数除法:400H÷B4H
;用IDIV指令作有符号数除法
mov ax,400h
mov bl,0b4h
idiv bl
----------------------------AL   400H    1024÷BL   ÷B4H   ÷(-76) —————————————————————
(商)   AL    F3H     -13
(余数) AH    24H      36

7.零位扩展和符号扩展

  • 位数扩展
    数据运算时,通常要求操作数类型相同
    ►乘法指令会产生倍长的乘积
    ►除法指令需要倍长的被除数
    数据类型不一致时,通常将位数少的进行数据扩展
    ►无符号整数,进行零位扩展
    ►有符号整数,进行符号扩展

数据位数加长
数值大小不能变

  • 零位扩展
    对于无符号数,进行零位扩展
    ►前面加0实现位数扩展
    位数加长,大小不变

  • 符号扩展
    对于有符号数,进行符号扩展
    ►前面加符号位(最高位)实现位数扩展
    位数加长,大小不变

  • 符号扩展指令MOVSX

例如:
mov al,82h ;AL=82H
movsx bx,al ;AL=82H,BX=FF82H
movsx ebx,al ;AL=82H,EBX=FFFFFF82H

//注:本文内容参考自中国大学MOOC汇编语言程序设计

汇编语言(算术运算类指令总结)相关推荐

  1. 【汇编语言】通用数据处理指令——算术运算类指令

    通用数据处理指令--算术运算类指令 文章目录 通用数据处理指令--算术运算类指令 一.状态标志 1.进位标志CF(Carry Flag) 2.溢出标志OF(Overflow Flag) 3.零标志ZF ...

  2. 8086指令系统 操作数地址,双操作数,单操作数,无操作数指令。一,传送类指令;二,二、算数运算类指令

    双操作数指令:OPR DEST,SRC 单操作数指令:OPR DEST 无操作数指令:OPR 按指令功能划分为六大类: 1传送类指令 2算术运算类指令 3位操作类指令 4串操作类指令 5程序转移类指令 ...

  3. c语言rsi2010中制运行,汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163

    1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...

  4. 【汇编语言】通用数据处理指令——位操作类指令

    通用数据处理指令--位操作类指令 文章目录 通用数据处理指令--位操作类指令 一.逻辑运算指令 1.逻辑与指令AND 2.逻辑或指令OR 3.逻辑非指令NOT 4.逻辑异或指令XOR 5.逻辑运算的应 ...

  5. 【汇编语言】通用数据处理指令——数据传送类指令

    通用数据处理指令--数据传送类指令 文章目录 通用数据处理指令--数据传送类指令 一.MOV指令 1.数据长度 2.传送方式 3.常见错误 二.XCHG指令 1.数据长度 2.空操作指令NOP(no- ...

  6. 汇编语言数据传送指令之通用数据传送类指令

    文章目录 1.通用数据传送类指令 1. 1)Mov reg/mem,imm//立即数传送 1. 2)Mov reg/mem/seg,reg//寄存器传送] 1. 3)Mov reg/seg,mem// ...

  7. 微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

    博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问. [没事儿可以到我主页看看 ...

  8. or1200处理器的异常处理类指令介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...

  9. 6.汇编语言显示、指令

    一:显示的原理 1.在屏幕中显示的内容来自显存中的数据 2.低位后8个高位前8个 3.在屏幕中显示 二:代码直接定址表 assume cs:code code segmenta : db 1,2,3, ...

最新文章

  1. 《Pro ASP.NET MVC 3 Framework》学习笔记之十六【示例项目SportsStore】
  2. vue 声明周期函数_Vue2.0 探索之路——生命周期和钩子函数的一些理解
  3. 在Java中动态传参调用Python脚本
  4. 关于VS环境下制作和使用静态库和动态库
  5. 线性筛素数的实现与证明
  6. 用css3制作一个搜索框效果
  7. 面试系列-Memcached面试专题
  8. 结合webpack配置_呕心沥血编写的webpack多入口零基础配置 【建议收藏】
  9. 用DIB位图显示图像
  10. 360服务器安全加固系统,360政企安全
  11. 【面试宝典】HR最喜欢的程序员简历模板,最佳建议篇
  12. 酒店后台管理系统、客栈管理、入住会员、房间管理、房源、房型、订单、报表、酒店企业、短信模板、积分、打印、交接班、住宿、入住、锁房、收支流水、房间销售、消费项目、酒店管理、渠道销售、支付管理、连锁酒店
  13. 5g局域网传输速度_4G5G和上网带宽与下载速度的换算方法
  14. 【海康威视】前端开发:【5】PaleMoon苍月浏览器 Web Components Kit 插件支持
  15. 有生之年转ta系列 2.6 伽马校正
  16. 计算机与航空方向专业,2018航空航天工程专业就业前景和就业方向分析
  17. 报错:Caused by: tech.yooo.common.exception.controller.ControllerException: null
  18. 如何搭建一个公链?公链生态“吸金“七件套,缺一不可
  19. java代码条形码链接网址_Java在PDF中添加条形码
  20. 龙芯3a5000下安装达梦8和Qt

热门文章

  1. 暴力递归——打印一个字符串的全部子序列
  2. oracle中怎么获取系统时间,oracle中得到当前系统时间
  3. SQLserver修改表名和列名
  4. 芳华永在!一个老运维的20年奋斗史
  5. 阳光电源西藏安装20MW太阳能光伏储能微电网电站
  6. 启建教育:2020年一级消防工程师备考,该怎样合理分配时间?
  7. 更改WordPress语言设置(例如中文版和英文版转换)
  8. 搜书利器 -- 壹搜网
  9. uITRON之任务状态和任务调度
  10. 【预测模型-ELM预测】基于布谷鸟算法优化极限学习机预测matlab代码