汇编语言通用数据处理指令——算术运算类指令
Posted BkbK-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言通用数据处理指令——算术运算类指令相关的知识,希望对你有一定的参考价值。
通用数据处理指令——算术运算类指令
文章目录
一、状态标志
状态标志是处理器最基本的标志
►一方面:作为加减运算和逻辑运算的辅助结果
►另一方面:构成各种条件,实现程序分支
1.进位标志CF(Carry Flag)
-
当加减运算结果的最高有效位有进位(加法)或借位(减 法)时,进位标志置1,即CF=1;否则CF=0
-
针对无符号整数,判断加减结果是否超出表达范围
无符号整数的表达范围:N位 8位 16位 32位 0~ 2 N − 1 2^N-1 2N−1 0~255 0~65535 0 ~ 2 32 − 1 0~2^{32}-1 0~232−1
2.溢出标志OF(Overflow Flag)
-
有符号数加减结果有溢出,则OF=1;否则OF=0
-
针对有符号整数,判断加减结果是否超出表达范围
有符号整数(补码)的表达范围
N位 8位 16位 32位 − 2 N − 1 -2^N-1 −2N−1~ 2 N − 1 − 1 2^N-1-1 2N−1−1 -128~127 -32768~32767 - 2 31 2^{31} 231~ 2 31 − 1 2^{31}-1 231−1
进位和溢出的区别
- 进位标志反映无符号整数运算结果是否超出范围
►有进位,加上进位或借位后运算结果仍然正确- 溢出标志反映有符号整数运算结果是否超出范围
►有溢出,运算结果已经不正确 处理器按照无符号整数求得结果
►设置进位标志CF
►设置溢出标志OF
3.零标志ZF(Zero Flag)
运算结果为0,则ZF=1,否则ZF=0
结果是0,ZF标志不是0 !)
-
8位二进制数相加:结果不是0,ZF=0
00111010+01111100=10110110
-
8位二进制数相加:结果是0,ZF=1
10000100+01111100=100000000
4.奇偶标志PF(Parity Flag)
当运算结果最低字节中“1”的个数为零或偶数时,PF=1;否则PF=0
仅最低8位“1”的个数
-
8位二进制数相加: “1”的个数为5个,PF=0
00111010+01111100=10110110
-
8位二进制数相加: “1”的个数为0个,PF=1
10000100+01111100=100000000
5.影响状态标志的指令
- 需要关注对标志影响的主要指令:
加减运算指令、逻辑运算指令、移位指令等 - 只用于影响标志的特殊指令1:比较指令CMP
►进行减法运算
►用于判断两个数据大小、是否相等 - 只用于影响标志的特殊指令2:测试指令TEST
►进行逻辑与运算
►用于判断某位为0或为1等
二、算术运算类指令
1.加法指令ADD指令
- 加法指令
ADD
- 带进位加法指令
ADC
- 增量指令
INC
►除INC不影响进位标志CF外,其他指令按定义影响全部状态标志位 即,按照运算结果相应设置各个状态标志为0或为1
目的操作数加上源操作数,和送到目的操作数
ADD reg, imm/reg/mem
;reg←reg+imm/reg/mem
ADD mem, imm/reg
;mem←mem+imm/reg
-
大写字母转换为小写可以用ADD:
确认是大写字母, 加20H为小写字母
add al,20h ;20H='a' - 'A'
20H=’ '(空格字符)
2.减法指令SUB指令
- 减法指令
SUB
- 带借位减法指令 SBB
- 减量指令 DEC
- 求补指令 NEG
►除DEC不影响CF标志外
►其他按定义影响全部状态标志位
目的操作数减去源操作数,差送到目的操作数
SUB reg,imm/reg/mem
reg←reg-imm/reg/mem
SUB mem,imm/reg
mem←mem-imm/reg
-
小写字母转换为大写可以用SUB
确认是小写字母, 减20H为大写字母
sub al,20h ;20H='a' - 'A'
20H=’ '(空格字符)
3.ADC和SBB指令
ADC和SBB指令是带进(借)位的加法、减法指令,支持8、16和32位加法、减法运算。并按照8、16和32位相应影响状态标志,但PF标志只利用低8位结果。
-
dest←dest + src +CF
ADC dest, src
-
dest←dest – src – CF
SBB dest, src
ADC和ADD、SBB和SUB相结合实现高精度数的加减法:
►先用ADD/SUB指令将两个操作数的低32位相加减
►再用ADC/SBB指令加减高位部分
►并将进位加到高位、或高位减去借位
4.INC、DEC和NEG指令
(1)增量指令INC(increment)
-
只有一个操作数:寄存器或存储单元
-
对操作数加1(增量)再将结果返回原处
INC reg/mem ;加1:reg/mem←reg/mem+1
-
用于计数器和地址指针的调整
►不影响进位CF标志,影响其他状态标志位
inc ecx
inc dword ptr [ebx]
inc wvar
inc bl
inc word ptr [esi]
inc wvar[edi]
(2)减量指令DEC(decrement)
-
只有一个操作数:寄存器或存储单元
-
对操作数减1(减量)再将结果返回原处
DEC reg/mem ;减1:reg/mem←reg/mem-1
-
用于计数器和地址指针的调整
►不影响进位CF标志,影响其他状态标志位
dec cx
dec byte ptr [ebx]
dec wvar
dec bl
dec word ptr [esi]
dec wvar[edi]
(3)求补指令NEG(negative)
-
对操作数执行求补运算,即用零减去操作数
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]
5.乘法指令
-
基本的乘法指令MUL(multiplication)
两数相乘、乘积倍长
无符号数乘法指令
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
-
乘积不倍长的乘法指令
乘积不倍长,注意溢出 CF=OF=1,表示溢出
双操作数乘法指令
IMUL reg, reg/mem/imm
3操作数乘法指令
IMUL reg, reg/mem, imm
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 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=余数
除数为0,或者商超出表达范围,则发生除法溢出 发生除法溢出错误,将产生编号为0的内部中断(异常)
7.零位扩展和符号扩展
-
零位扩展(Zero Extension)
对于无符号数,进行零位扩展
►前面加0实现位数扩展
-
符号扩展(Sign Extension)
对于有符号数,进行符号扩展
►前面加符号位(最高位)实现位数扩展
以上是关于汇编语言通用数据处理指令——算术运算类指令的主要内容,如果未能解决你的问题,请参考以下文章