汇编语言(算术运算类指令总结)
文章目录
- 一、进位和溢出标志
- 二、零标志、符号标志和奇偶标志
- 标志一览表
- 三、算术运算类指令
- 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.进位标志CF(Carry Flag) 2.溢出标志OF(Overflow Flag) 3.零标志ZF ...
- 8086指令系统 操作数地址,双操作数,单操作数,无操作数指令。一,传送类指令;二,二、算数运算类指令
双操作数指令:OPR DEST,SRC 单操作数指令:OPR DEST 无操作数指令:OPR 按指令功能划分为六大类: 1传送类指令 2算术运算类指令 3位操作类指令 4串操作类指令 5程序转移类指令 ...
- c语言rsi2010中制运行,汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163
1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...
- 【汇编语言】通用数据处理指令——位操作类指令
通用数据处理指令--位操作类指令 文章目录 通用数据处理指令--位操作类指令 一.逻辑运算指令 1.逻辑与指令AND 2.逻辑或指令OR 3.逻辑非指令NOT 4.逻辑异或指令XOR 5.逻辑运算的应 ...
- 【汇编语言】通用数据处理指令——数据传送类指令
通用数据处理指令--数据传送类指令 文章目录 通用数据处理指令--数据传送类指令 一.MOV指令 1.数据长度 2.传送方式 3.常见错误 二.XCHG指令 1.数据长度 2.空操作指令NOP(no- ...
- 汇编语言数据传送指令之通用数据传送类指令
文章目录 1.通用数据传送类指令 1. 1)Mov reg/mem,imm//立即数传送 1. 2)Mov reg/mem/seg,reg//寄存器传送] 1. 3)Mov reg/seg,mem// ...
- 微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)
博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问. [没事儿可以到我主页看看 ...
- or1200处理器的异常处理类指令介绍
下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...
- 6.汇编语言显示、指令
一:显示的原理 1.在屏幕中显示的内容来自显存中的数据 2.低位后8个高位前8个 3.在屏幕中显示 二:代码直接定址表 assume cs:code code segmenta : db 1,2,3, ...
最新文章
- 《Pro ASP.NET MVC 3 Framework》学习笔记之十六【示例项目SportsStore】
- vue 声明周期函数_Vue2.0 探索之路——生命周期和钩子函数的一些理解
- 在Java中动态传参调用Python脚本
- 关于VS环境下制作和使用静态库和动态库
- 线性筛素数的实现与证明
- 用css3制作一个搜索框效果
- 面试系列-Memcached面试专题
- 结合webpack配置_呕心沥血编写的webpack多入口零基础配置 【建议收藏】
- 用DIB位图显示图像
- 360服务器安全加固系统,360政企安全
- 【面试宝典】HR最喜欢的程序员简历模板,最佳建议篇
- 酒店后台管理系统、客栈管理、入住会员、房间管理、房源、房型、订单、报表、酒店企业、短信模板、积分、打印、交接班、住宿、入住、锁房、收支流水、房间销售、消费项目、酒店管理、渠道销售、支付管理、连锁酒店
- 5g局域网传输速度_4G5G和上网带宽与下载速度的换算方法
- 【海康威视】前端开发:【5】PaleMoon苍月浏览器 Web Components Kit 插件支持
- 有生之年转ta系列 2.6 伽马校正
- 计算机与航空方向专业,2018航空航天工程专业就业前景和就业方向分析
- 报错:Caused by: tech.yooo.common.exception.controller.ControllerException: null
- 如何搭建一个公链?公链生态“吸金“七件套,缺一不可
- java代码条形码链接网址_Java在PDF中添加条形码
- 龙芯3a5000下安装达梦8和Qt