第5章算术和逻辑运算指令共93页文档
算数运算指令
算数运算指令
机电教研室 李大勇
§4.6.4 算数运算指令
算术运算指令可完成整数、长整数及实数的加、减、 乘、除、求余、求绝对值等基本算数运算;以及32位浮点 数的平方、平方根、自然对数、基于 e 的指数运算及三角 函数等扩展算数运算。 基本算术运算指令 扩展算术运算指令
Your site here
LOGO
示例3:带CC1位的循环移位指令RRDA,RLDA
特点: 只移动一位
Your site here
LOGO
1.有符号右移指令格式
Your site here
返回上级
LOGO
2.字移位指令格式
Your site here
返回上级
LOGO
3.双字移位指令格式
Your site here
返回上级
Your site here
返回本节
LOGO
字逻辑运算指令格式
Your site here
返回上级
LOGO
§4.6.6 移位指令
移位指令有 2 种类型:基本移位指令可对无符号整数、 有符号长整数、字或双字数据进行移位操作;循环移位指 令可对双字数据进行循环移位和累加器 1 带 CC 1 的循环 移位操作。
将累加器1,2中的浮点数相乘,浮点数乘积在累加器1中
累加器2中的浮点数除以累加器1中的浮点数,商在累加器1,余数丢掉 取累加器1中的浮点数的绝对值 求浮点数的平方 求浮点数的平方根 求浮点数的自然指数 求浮点数的自然对数 求浮点数的正弦函数 求浮点数的余弦函数 求浮点数的正切函数 求浮点数的反正弦函数 求浮点数的反余弦函数 求浮点数的反正切函数
Your site here
返回上级
算术与逻辑运算指令具体解释
算术与逻辑运算指令具体解释算术与逻辑运算指令具体解释前⾔上⼀次解说了数据传送指令,⾹型⼤家肯定对此有了⼀定的认识了.这些简单的汇编指令,却能够将复杂的程序井然有序的运⾏完成,实在是让⼈惊叹.算术与逻辑运算指令算术逻辑运算包含⾮常多种,各级⼤家应该能⾮常快想出来,⽐⽅常见的加减乘除,与或⾮,左移右移等等另⼀个区地址运算符,⼤家可能想不到,可是看完以下这⼀部分之后,就会认为这个取地址运算符是个精妙的指令.先说⼀下各个指令,见下图:这⾥⾯⽐較特别的指令就是leal(取地址指令),其余的指令都是⽐較常规的算术和逻辑运算,相⽐之下⾮常好理解,因此在这⾥咱们重点是介绍leal指令.leal指令leal指令时很奇妙的⼀个指令,他能够去⼀个存储器操作数的地址,⽽且将其赋给⽬的操作数.假设⽤C语⾔其中来相应的话,就相当于&运算符.⽐⽅对于leal 4(%edx,%edx,4),%eax这条指令来说,我们如果%edx寄存器的值为x的话,那么这条指令的作⽤就是将4+x+4x=5x+4赋给%eax寄存器.他和mov指令的差别就在于,如果是movl 4(%edx,%edx,4),%eax这条指令,它的作⽤是将内存地址为5x+4的内村区域的值赋给%eax寄存器,⽽leal指令仅仅是将5x+4这个地址赋给⽬的操作数%eax⽽已,它并不正确寄存器进⾏引⽤的值的计算.为了更好的表⽰这条指令的效果,咱们⽤⼀个图来简单的表⽰这⼀过程.我们如果下图是运⾏指令之前,寄存器和存储器的状态.能够看到,此时在寄存器中,地址为5x+4的区域的值为1000.那么此时若是进⾏movl 4(%edx,%edx,4),%eax操作,⾮常显然,%eax的值应该为1000,也就是下图:可是假设进⾏leal 4(%edx,%edx,4),%eax操作的话,%eax的值就不是1000,由于leal指令不回去取存储器其中的值,因此寄存器%eax的值应该是5x+4.试想⼀下,倘若在地址为5x+4的位置存储的是变量i,那么事实上这条指令就相当于&i操作,也就是C语⾔其中的&取地址操作的汇编级做法.⼀个案例:因为其它的指令⾮常easy,因此咱们就不⼀⼀介绍了,咱们使⽤⼀个⼩程序来做⼀个实例,顺道看⼀下上⾯的算术与逻辑运算指令都是被怎样使⽤的.我们考虑这样⼀个C语⾔程序:int arith(int x, int y , int z){int t1 = x+y;int t2 = z*48;int t3 = t1&0xFFFF;int t4 = t2*t3;return t4;}这⾥⾯包括了加,乘,与运算,我们使⽤GCC -O1 -S sum.c这条命令,然后使⽤cat sum.c这条命令查看,就会得到例如以下的汇编代码:.file "sum.c".text.globl arith.type arith, @functionarith:pushl %ebpmovl %esp, %ebp //以上为栈帧建⽴movl 16(%ebp), %eaxleal (%eax,%eax,2), %edxsall $4, %edxmovl 12(%ebp), %eaxaddl 8(%ebp), %eaxandl $65535, %eaximull %edx, %eax //下⾯为栈帧完毕popl %ebpret.size arith, .-arith.ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3".section .note.GNU-stack,"",@progbits这⾥⾯还有leal指令,能够看到程序其中并没有取地址&操作,所以这⾥的leal指令不是⽤来取地址的,咱们使⽤⼀个图来演⽰这个程序的执⾏过程.⾸先是栈帧的建⽴过程,栈帧建⽴好以后,寄存器和存储器的状态例如以下:以上便是建⽴好的栈帧,通上⼀次⼀样,栈指针和帧指针都指向了⼀个新的位置,在帧指针偏移量为8,,12,16的地⽅存储着传递进来的參数x,y,z.接下来我们就開始分析,在汇编代码层次,是怎样完毕上述C语⾔程序其中的⼀些列动作的.⾸先是⼀个mov指令,他的作⽤⾮常easy,就是将參数z取⼊寄存器,以下是它的汇编代码以及图⽰:movl 16(%ebp),%eax上⾯的指令⽐較简单,接下来的这条指令就有点特别了,是⼀条leal指令.这⾥的leal指令不是⽤来取地址的,⽽是⽤来进⾏乘法运算的,他的⽬的是将%eax寄存器其中的值乘以3,然后发送⾄%edx寄存器.⽽採⽤的⽅式则是2*x+x的⽅式,这正是我们之前讲过的乘法优化算法,使⽤移位和加法来计算乘法.leal (%eax,%eax,2),%edx上⾯计算3z的⽬的,在接下来的这⼀条指令就看出来了.接下来的⼀条会令是sal左移操作,位数为4,左移4位事实上就相当于16,因此接下来的⼀条指令事实上就相当于将寄存器%edx当值的值乘以16,这事实上刚好是在计算48*z.从这⾥也能够看出来,在运⾏C程序的时候,并不⼀定依照程序其中的顺序去计算.下⾯是sal指令的内容与图⽰sall $4,%edx接下来的指令依旧是简单的取參数y,因此咱们就不解释了,看指令和图⽰movl 12(%ebp),%eax以下的⼀条指令是add加法指令,它是将左边操作数的值加到右边的⽬的操作数.也就是将内存地址为8(%ebp)的值加到%eax寄存器,⽽8(%ebp)这个位置存放的刚好是x,因此这⾥计算的便是x+y的值,⽽结果会存⼊%eax寄存器.以下是指令的内容和图⽰:addl 8(%ebp),%eax接下来是⼀条运算指令and,他计算的则是t1与0xFFFF(⼗进制就是65535)的与运算,t1的值为x+y,此时就存在%eax寄存器.接下来看这条指令和图⽰:andl $65535 ,%eax接下来是最后⼀个计算过程的指令imul乘法指令,它的作⽤也是将左边操作数的值乘到右边的⽬的操作数上.也就是将%edx寄存器的值乘到%eax寄存器上⾯去,⽽%edx此时的值为48*z(也就是t2),⽽%eax的值为(x+y)&0xFFFF(也就是t3),两者相乘得到t4的值,结果将存放在%eax寄存器,⽽且作为返回值返回,下⾯是指令和图⽰:imull %edx,%eax⾄此,我们整个计算过程就结束了,当中⽤到了⼀些算术与逻辑运算指令,事实上他们并没有什么难度,图例已经说得⾮常清楚了.最后则是栈帧的完毕部分,下⾯为当前帧释放后的状态:不知道打击注意到了没有,每次在%ebp偏移量为4的位置都是空着的,⽽參数都在8,12,16这种位置,难道偏移量为4的位置是空的吗?当然不是,地址不会跳着来,事实上他存储的是返回地址,这⼀点在此不做过多的说明,以后遇到了再具体的说明.⼩⼩的结⼀下本章内容是认识⼀下⼀些常见的算术和逻辑运算指令.事实上没有什么难度.。
算术与逻辑运算指令PPT课件
第2页/共45页
算术与逻辑运算指令
次高位进位 • 溢出O:当进行8位或16位数的加法或减法运算时,O = 最高位进位(借位) (借位)
• 49H + 6DH = 0100 1001B + 0110 1101B = 1011 0110B • 最高位(8th)无进位,次高位(7th)有进位 • O=1,有溢出
第9页/共45页
加法、减法与比较指令
• 带进位(借位)加法(减法)指令 • 指令形式:ADC/SBB REG/MEM, REG/MEM/imm • 目的操作数=目的操作数±源操作数±C(进位标志位) • 与ADD/SUB指令形式一致 • 实现位宽大于16位的加法/减法 • BX-AX+DX-CX
ADC
LEA SI, DATA2; 装载DATA2 MOV CX, [SI] MOV DX, [SI+2]
ADD AX, CX;计算BX-AX+DX-
CX|DATA1+DATA2
ADC BX, DX
• STACK SEGMENT • DW 128 DUP(0) • ENDS • CODE SEGMENT
LEA SI, RESULT;存储结果 MOV [SI], AX MOV [SI+2], BX ENDS END 代ST码ART
第8页/共45页
加法、减法与比较指令
• 寄存器加法/减法
• 操作数均为寄存器 • ADD/SUB AX, BX; AX = AX ± BX
• 立即数加法/减法
• 源操作数为立即数 • ADD/SUB AX, 100H • ADD/SUB WORD PTR[DI], 100H • 内存与寄存器加法/减法 • ADD/SUB AX, [DI] • ADD/SUB AX, NUM • ADD/SUB AX, [DI+2]
(微机原理与接口技术)chapter05算术和逻辑运算指令
30
0000 B8 FF9C 0003 B9 0009 0006 99 0007 F7 F9
例 17
MOV AX, -100 MOV CX, 9 CWD IDIV CX
;符号扩展
32-位除法指令
汇编语言
操作
DIV ECX
EDX-EAX 除以 ECX, 无符号的商在 EAX 中,余数在 EDX 中
IDIV DATA2
带借位的减法指令
操作
AH= AH-AL-carry
18
例 12
CF
(SBB) BX
(SUB) AX
SI
DI
-
BX
AX
带借位的减法,指出了进位标志(C)怎样传递借位
SUB AX, DI SBB BX, SI
19
比较指令
只改变标志位 不改变目标操作数
比较指令
汇编语言 CMP CL, BL CMP AX, SP CMP EBP, ESI CMP AX, 2000H CMP [DI], CH CMP CL, [BP] CMP AH, TEMP CMP DI, TEMP[BX] CMP AL, [EDI+ESI]
例 14
MOV BL, 5 MOV CL, 10 MOV AL, CL MUL BL MOV DX, AX
25
特殊的立即数16位乘法指令
8086/8088不能执行立即数乘法 80286~Pentium 4 可以使用这种特殊类型的乘法指
令 立即数乘法指令必须是有符号的乘法,而且包含3
个操作数 第1个操作数是16位目标寄存器 第2个操作数是容纳16位被乘数的寄存器或存储单
汇编语言 DEC BH DEC CX DEC EDX DEC BYTE PTR[DI] DEC WORD PTR[BP] DEC DWORD PTR[EBX] DEC NUMB
算术与逻辑运算指令
[D]:KnY、KnM、KnS、T、C、D、V,Z
❖ 梯形图
X0
[S1] [S2] [D]
MUL D0 D2 D4
X1
[S1] [S2] [D]
DDIV D10 D12 D14
被乘数 乘数 (D0)×(D2)
积 (D5D4)
被除数
除数
商
余数
(D11D10)÷(D13D12) (D15D14)···(D17D16)
一、二进制加减运算指令
❖ 说明 ➢ 该指令可以进行连续/脉冲执行方式。
注意连续与脉冲方式的区别: 连续方式:则每个扫描周期都加/减1; 脉冲方式:当X1=ON时,只加/减一次1.
二、二进制乘除运算指令
乘法 FNC22 MUL
减法 FNC23 DIV
❖ 操作数
[S1]、[S2]:K、H、KnX、KnY、KnM、KnS、T、C、D、 V,Z
FNC29 NEG
算术与逻辑运算指令
一、二进制加减运算指令
加法 FNC20 ADD
减法 FNC21 SUB
❖ 操作数
[S1]、[S2]:K、H、KnX、KnY、KnM、KnS、T、C、D、 V,Z
[D]:KnY、KnM、KnS、T、C、D、V,Z
❖ 梯形图
X0
X1
[S1] [S2] [D]
ADD D0 D2 D4
(D10) ∨ (D12) →(D14)
(D14) →(D14)
四、逻辑运算指令
❖ 说明 ➢ 各数据的对应位进行二进制与、或、异或运算。 ➢ 32位数据运算时,助记符为DAND、DOR、DXOR。 ➢ 指令运算规则如下:
逻辑与 1 ∧1= 1 1 ∧0= 0 0 ∧1= 0 0 ∧0= 0
逻辑运算指令
例3:测试AL的bit7,bit5,bit2是否都是1。
AND AL, 1010 0100B CMP AL, 1010 0100B JZ YES <not all 1> …… YES:
6
(2) 逻辑“或” OR
对两个操作数进行按位逻辑”或”操作。 格式:OR dst, src 功能: (dst)∨(src)→(dst) 用途:对操作数的某几位置1;
移动次数count只能为1或CL。 如:SHL AX,1
SHL AL,CL
“0”
17
逻辑右移指令SHR(Shift logical Right)
格式: SHR dst,count
功能:
dst
CF
D7 D6 D5 D4 D3 D2 D1 D0
“0”
0 D7 D6 D5 D4 D3 D2 D1
D0
特点是移出的位进入进位位CF,空出的 位用“0”填入。
3.4 逻辑运算指令
● 运算规则:按位操作,无进/借位,包括以
下两类:
•
逻辑位运算
•
移位、循环移位
● 对标志位的影响(除NOT指令外):
CF OF SF ZF PF AF 0 0 * * * 无定义
根据运算结果设置
1
1、逻辑运算指令
有5条指令。 (1)“与”运算指令AND (2)“或”运算指令OR (3)“异或”运算指令XOR (4)“非” 运算指令NOT (5)测试指令TEST
通用寄存器 存储器
立即数
通用寄存器
11
三种运算指令的主要作用
指令
作用
举例
AND 使目的操作数某些位不变, 保留AX的最后4位
某些位变成0
算术与逻辑指令
变为11001111B,其余不变。
⑥ XRL direct,#data ;direct ←(direct)∨data
4.逻辑移位指令 ① RL A 【例34】设原来A中的内容为10001110B,则执行指令 RL A 后,A中的内容变为00011101B。 ② RLC A ③ RR A ④ RRC A
(3)SUBB A,@Ri ;A←(A)-(Ri)-(C) (4)SUBB A,#data ;A←(A)-data-(C)
3.十进制加法调整指令
DA A ;若[(A)3~0>9]∨[(AC)=1],则A←(A)+06H 若[(A)7~4>9]∨[(CY)=1],则A←(A)+60H
【例25】设(A)=37H,(R0)=36H,则执行下列程序段的 过程如下:
【例29】设原来A中的无符号数为7EH,B中的无符号数为0AH, 则执行指令DIV AB后,A中的内容变为OCH,B中的内容变为 06H。
2.3.3 逻辑运算指令 1.逻辑“与”指令:
① ANL A,Rn
;A←(A)∧(Rn)
【例30】设原来A的内容是01100011B,R2的内容为11101001B ,
③ XRL A ,@ Ri ④ XRL A ,# data
;A ←(A)∨((Ri)) ;A ←(A)∨data
⑤ XRL direct ,A
;direct ←(direct)∨(A)
【例33】设原来内部RAM单元63H中的内容为01101001B,A中
的内容为10100110B,则执行指令XRL 63H,A后,63H的内容
(2)带进位加法指令
① ADDC A,Rn ② ADDC A,direct
;A←(A)+ (Rn)+(C) ;A←(A)+ (direct)+(C)
算术及逻辑运算类指令
DA指令不影响溢出标志OV,MCS-51指令系统中没有给出十进制的减法调整指令,不能用DA指令 对十进制减法操作的结果进行调整。借助Cy可实现多位BCD数的加法运算。
一.加减指令
2.减法指令
SUBB A,源操作数;带借位减法指令
逻辑与指令
• ANL A,Rn ;A与Rn中的值按位'与',结果送入A中。 • ANL A,direct ;A与direct中的值按位'与',结果送入A中。 • ANL A,@Ri ;A与间址寻址单元@Ri中的值按位'与',结果送入A中。 • ANL A,#data ;A与立即数data按位'与',结果送入A中。 • ANL direct,A ;direct中值与A中的值按位'与',结果送入direct中。 • ANL direct,#data ;direct中的值与立即数data按位'与',结果送入direct中。
在知道了逻辑与指令的功能后,逻辑或和逻辑异或的功能就很简单了。 逻辑或是按位“或”,即有“1”为1,全“0”为0。
例
10011000 或 01100001 结果 11111001
而异或则是按位“异或”,相同为“0”,相异为“1”。
10011000 异或 01100001 结果 11111001 而所有的或指令,就是将与指仿中的ANL 换成ORL,
谢谢观看!
单片机原理及应用
除法一般会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生还没接触到小数 时用的商和余数的概念,如13/5,其商是2,余数是3。除了以后,商放在A中,余数放在B中。 CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0指令 (A累加器为操作数)
逻辑运算指令课件
案例二
在决策分析中,我们可能需要比较多个方案并选择最优的一个。例如,比较三个供应商 的报价和质量,选择性价比最高的一个。这里可以使用逻辑或和逻辑与运算进行条件判
断和选择。
感谢您的观看
THANKS
示例2
假设有两个变量C和D,它们的值 分别为false和false。则C OR D的 结果为false,因为两个变量都为假。
逻辑或运算的应用场景
条件判断
在程序中,逻辑或运算常用于条件判断语句 中,以实现某些条件下的执行路径。例如, 在if语句中,可以使用逻辑或运算符来检查多 个条件中的至少一个是否满足。
数据筛选
根据多个条件进行筛选,如从数 据库中查询满足多个条件的记录 。
安全验证
在登录或支付等场景中,使用逻 辑与运算符验证用户输入的密码 、验证码等是否正确。
01
条件判断
在程序中,使用逻辑与运算符连 接多个条件,进行复杂的
在流程控制中,使用逻辑与运算 符确保所有条件都满足时,执行 相应的操作或进入特定的分支。
数据筛选
在数据处理和分析中,逻辑或运算可以用于 筛选符合多个条件的数据。通过将多个条件 用逻辑或连接,可以快速找到满足至少一个 条件的记录。
事件触发
在事件驱动的系统中,逻辑或运算可以用于 触发某些事件。例如,当传感器检测到某个 物体接近时,可以使用逻辑或运算符来比较 多个传感器的读数,以确定是否需要触发警 报或其他动作。
案例二
一个学生想要申请某大学的奖学金,需要满足多个条件(如成绩要求、社会实践经验等)。同样可以使用逻辑 与运算来确保学生满足所有申请条件。
利用逻辑运算进行数据筛选
案例一
在处理大量数据时,我们可能需要筛选出满足特定条件的数据。例如,在数据库中查找所有年龄大于 18岁且性别为女的用户,可以使用逻辑与和逻辑或运算来筛选出符合条件的数据。
微机原理 第5章5.2.2算术运算类指令
压缩BCD码 AAD指令跟在字节除DIV之前,先将非压缩BCD 码的被除数调整为二进制数 AAM和AAD指令根据结果设置SF、ZF和PF,但对 OF、CF和AF无定义
教学要求
熟悉指令对标志的影响、符号扩展的含义、压 缩和非压缩BCD的格式 掌 握 基 本 指 令 : ADD / ADC / INC 、 SUB / SBB/DEC/CMP/NEG、CBW/CWD 熟 悉 特 色 指 令 : MUL / IMUL 、 DIV / IDIV 、 DAA/DAS、AAA/AAS 了解不常使用的指令:AAM/AAD;
例5.34
IDIV r16/m16 ;有符号字除法:
;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
第3章
五、其他算术运算指令 1、符号扩展指令
不影响标志位
CBW ;AL的符号扩展至AH
;如AL的最高有效位是0,则AH=00 ;AL的最高有效位为1,则AH=FFH。AL不变
ADC mem,imm/reg ;mem←mem+imm/reg+CF
第5章
3、增量指令INC(increment)
INC
INC指令对操作数加1(增量) INC指令不影响进位CF标志,按
定义设置其他状态标志
INC reg/mem ;reg/mem←reg/mem+1
例5.26
inc bx inc byte ptr [bx]
作数的加法或减法指令 DAA和DAS指令对OF标志无定义,按结果影响其 他标志,例如CF反映压缩BCD码相加或减的进位 或借位状态 调整规则
第3章
非压缩BCD码加、减调整指令
(ADD AL,i8/r8/m8) (SUB AL,i8/r8/m8) (ADC AL,i8/r8/m8) (SBB AL,i8/r8/m8) 例5.36 AAA AAS ;AL←将AL的加和调整为 ;AL←将AL的减差调整 非压缩BCD码 为非压缩BCD码 ;AH←AH+调整的进位 ;AH←AH-调整的借位
二、算术逻辑运算指令
• 逻辑运算指令包括与、或、异或、循环、 累加器“清零”与“求反”指令,这些 指令的操作数都是8位。 • 逻辑运算指令不影响标志位。
三、逻辑运算指令
1. 单操作数逻辑运算指令
• ⑴累加器A的“清零”与“取反”指令 • CLR A ;(A)←#00H • CPL A ;(A)←( )
• 结 果 乘 积 为 3200H ( 12800 ) 则 ( A ) =00H,(B)=32H,OV=1,Cy=0
二、算术运算指令
⑵ 除法指令
• DIV AB ;(A)←(A)/ (B)的商
• (B)←(A)/(B)的余数
• 标志位Cy和OV清0(当除数为0时OV置1)
三、逻辑运算指令
• 共25条 • 按操作数个数分为两类:
二、算术运算指令
• 例3-13:设累加器A内容为压缩BCD码56 (即01010110B),寄存器R3的内容为 压缩BCD码67(即01100111B),Cy内 容为1。执行下列的指令: • ADDC A,R3 • DA A
二、算术运算指令
Hale Waihona Puke • 例3-14:设有4个压缩BCD码,分别放在 内部数据存储器50H~51H单元和60H~ 61H单元中,试编写求出两个数的和的 程序,结果存放到40H~41H单元中。
三、逻辑运算指令
⑶逻辑“异或”指令
• • • • • • XRL A,Rn ;(A)←(A) (Rn) XRL A,direct ;(A)←(A) (direct) XRL A,@Ri ;(A)←(A)(Ri)) XRL A,#data ;(A)←(A)data XRL direct,A;(A)←(A)(direct) XRL direct,#data;
汇编语言03
移位指令
移位指令分逻辑移位和算术移位,分别具有左 移或右移操作 SHL reg/mem,1/CL
;逻辑左移:reg/mem左移1/CL位,最低位补0,最高位进入CF
SHR reg/mem,1/CL
;逻辑右移:reg/mem右移1/CL位,最高位补0,最低位进入CF
例
AL=13H,执行指令 后AL的值
NEG AL
0000 0000 — 0001 0011 1 1110 1101
AL(0EDH)
乘法和除法指令
乘法和除法指令分别实现两个二进制操作 数的相乘和相除运算,并针对无符号数和 有符号数设计了不同指令 注意:加减指令不分无符号数和有符号数, 需要分别利用CF和OF,程序员自己确定运算 结果是否正确
1)乘法指令
MUL r8/m8 ;无符号字节乘法:AX←AL×r8/m8 MUL r16/m16 ;无符号字乘法:DX.AX←AX×r16/m16 IMUL r8/m8 ;有符号字节乘法:AX←AL×r8/m8 IMUL r16/m16 ;有符号字乘法:DX.AX←AX×r16/m16
乘法指令与标志位
例
INC SI ; SI寄存器加1
DEC BYTE PTR [SI] ; SI寄存器指向的 内存字节单元减 1
5)求补指令NEG
NEG reg/mem (取补指令) ; reg/mem←0-reg / mem
NEG指令对标志的影响与用零作减法的SUB指令 相同。 NEG指令也是一个单操作数指令
IDIV r16/m16
;有符号字除法: AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
算术运算、逻辑运算、控制语句
前言这里需要强调我写这些文档的目的不是教授详细的每个技术详细使用方法,而是引导你进入这个概念领域,很多东西都是没有深化展开讨论,只是帮助你对软件开发的每项内容有个快速理解,之后必须自己深化学习下每个环节的每样的东西的详细使用方法,或者深化的原理。
作者: 杜波联络方式QQ:276686525 交流群:244738537有想进一步学习JAVA软件开发的可以联络我算术运算既然我们知道了世界上的任何东西都可以在计算机内用8种类型或者8种类型组合而成的类来表示,那如今我们就该学习学习这些类之间的关系该如何表达,他们要如何工作才能最终完成如何表述现实世界。
首先我们要研究的是现实世界而不是计算机世界,因为计算机世界的所有一切都是人类世界预先设计好的,所以只要知道人类世界是如何处理两者关系就可以很容易的理解计算机的工作过程了。
如今我们回到超市中,今天某个供应商给我们送来了一车货物,其中有一笔为德芙巧克力,那么我们就需要计算这些德芙巧克力有多少,价格多少,总价多少,和我们的订单比照是多了还是少了,这时候我们就需要算数运算来处理这些,看下面例子public class Order{public int orderDefuNun = 10; //我们订单定制了10盒德芙public double lastTimeDefuPrice = 50; //上次的进货价格为100public double thisTimeDefuPrice ; //这次的价格还不知道等待供应商提供public int weHaveDefuNum = 20; //库存还剩多少public double thisTimeTotalMoney ; //总价未给出public int realDefuNum ; //真正给予的德芙量public double getThisTimeTotalMoney (){//该方法计算总价return realDefuNum*weHaveDefuNum;}}假设客户给了我们5盒德芙,每盒45,那么我们就需要将我们的库存增加,总价格就要通过本次单价和本次实际收到的德芙盒数相乘计算出,通过上面我们发现其实这些数据之间就是加减乘除间的关系。
第5章算术和逻辑运算指令
本章内容
• 加法、减法和比较指令 • 乘法和除法指令 • BCD码和ASCII码算术运算指令 • 基本逻辑运算指令 • 移位和循环移位指令 • 串比较指令
加法指令
• 加法指令注意事项: 1. 源操作数和目的操作数不能同时为内存单元 (MEM)。 2. 不允许与段寄存器(SREG)相关的加法。 3. XADD指令的源操作数在寄存器(REG)中。 4. 标志寄存器中状态位随运算结果而变化,但INC 指令不影响CF标志。 5. 指令中操作数是带符号数还是无符号数由程序员 解释。
本章内容
• 加法、减法和比较指令 • 乘法和除法指令 • BCD码和ASCII码算术运算指令 • 基本逻辑运算指令 • 移位和/MEM
号乘 功能 8位:源操作数与AL相乘,乘积在AX
法
16位:源操作数与AX相乘,乘积在DX:AX
32位:源操作数与EAX相乘,乘积在EDX:EAX
CF标志和OF标志
• 当加减运算结果的最高有效位有进位(加法)或借 位(减法)时,CF标志置1,即CF=1;否则CF=0。 –针对无符号整数,判断加减结果是否超出表达范 围。 –N个二进制位表达无符号整数的范围: 0~2N-1
• 有符号数加减结果有溢出,则OF=1;否则OF=0。 – 针对有符号整数,判断加减结果是否超出表达范 围。 • N个二进制位表达有符号整数的范围: -2N-1~2N-1-1
进位1表达256
溢出标志OF:举例
• 8位二进制数相加:
00111010+01111100=10110110
• 十六进制表达:3A+7C=B6 • 转换成十进制数:58+124=182 • 超出范围:OF=1
182>127
• 8位二进制数相加:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 设张三在海拔60米的地点,他先 往上走了65米,然后又往上走了 90米,请问他现在所在地点的海 拔高度? ;为便于表示低于海平面的 ;情况,采用有符号数表示
MOV AL, 60
ADD AL, 65 JO ERROR;(AL)=01111101
ADD AL, 90 JO ERROR;(AL)=11010111
进位1表达256
溢出标志OF:举例
• 8位二进制数相加:
00111010+01111100=10110110
• 十六进制表达:3A+7C=B6 • 转换成十进制数:58+124=182 • 超出范围:OF=1
182>127
• 8位二进制数相加:
10101010+01111100=[1]00100110
• 十六进制表达:AA+7C=[1]26 • 转换成十进制数:-86+124=38 • 没有超出范围:OF=0
补码AAH表达-86
Example 2
• 设一个学生的三门课的成绩分别 为60、65、90,入学分数线为总 分256分,判断该学生是否取得 入学资格。
;采用无符号数表示 MOV AL, 60 ADD AL, 65 ADD AL, 90 JC PASS;超过256分? …… PASS: ……;取得入学资格
…… ERROR:
……;错误处理
进位和溢出的区别
• 进位标志反映无符号整数运算结果是否超出范围 – 有进位,加上进位或借位后运算结果仍然正确
• 溢出标志反映有符号整数运算结果是否超出范围 – 有溢出,运算结果已经不正确
• 处理器按照无符号整数求得结果 – 在设置进位标志CF的同时,根据是否超出有符号整数的 范围设置溢出标志OF。
进位标志CF:举例
• 8位二进制数相加:
00111010+01111100=10110110
• 十六进制表达:3A+7C=B6 • 转换成十进制数:58+124=182 • 没有产生进位:CF=0
0<182<255
• 8位二进制数相加:
10101010+01111100=[1]00100110
• 十六进制表达:AA+7C=[1]26 • 转换成十进制数:170+124=294=256+38 • 产生进位:CF=1
“1”的个数为5个:PF=0 • 8位二进制数相加:
10000100+01111100=[1]00000000
“1”的个数为0个:PF=1
进位
结果
零标志ZF(Zero Flag)
• 运算结果为0,则ZF=1,否则ZF=0
结果是0,
举例
ZF标志不是0 !
• 8位二进制数相加:
00111010+01111100=10110110
最高位
正数
00111010
正数
+01111100
次高位
负数
10110110
奇偶标志PF(Parity Flag)
• 当运算结果最低8位中“1”的个数为零或偶数时, PF=1;否则PF=0
the least-significant byte
举例
中“1”的个数
• 8位二进制数相加:
00111010+01111100=10110110
• 应该利用哪个标志,由程序员决定! – 操作数是无符号数,关心进位 – 操作数是有符号数,注意溢出
溢出标志的判断
• 处理器硬件判断规则
– 最高位和次高位同时有进位或同时无进位,无 溢出;最高位和次高位进位状态不同,有溢出
• 人工判断的简单规则
– 只有当两个相同符号数相加(含两个不同符号 数相减),而运算结果的符号与原数据符号相 反时,产生溢出;其他情况下,不会产生溢出
本章内容
• 加法、减法和比较指令 • 乘法和除法指令 • BCD码和ASCII码算术运算指令 • 基本逻辑运算指令 • 移位和循环移位指令 • 串比较指令
加法指令
加法 格式 功能
标志
ADD REG/MEM, REG/MEM/IMM
源操作数、目的操作数相加,结果存入目的操 作数
所有状态标志(ZF、CF、PF、AF、SF 及 OF) 都受影响
ADD AL, BL ;结果AL=9AH
1001 1010
运算后标志:ZF=0, AF=1, CF=0, SF=1, PF=1, OF=1。
• 若程序员认为两个加数是无符号数,则运算结果位9AH,即 154。 ✓ 此时,SF标志和OF标志没有意义。
• 若程序员认为两个加数是有符号数,则运算溢出,结果无效。 ✓ 此时,CF标志没有意义。
CF标志和OF标志
• 当加减运算结果的最高有效位有进位(加法)或借 位(减法)时,CF标志置1,即CF=1;否则CF=0。 –针对无符号整数,判断加减结果是否超出表达范 围。 –N个二进制位表达无符号整数的范围: 0~2N-1
• 有符号数加减结果有溢出,则OF=1;否则OF=0。 – 针对有符号整数,判断加减结果是否超出表达范 围。 • N个二进制位表达有符号整数的范围: -2N-1~2N-1-1
交换 格式 并相 功能 加
标志
XADD REG/MEM, REG
(80486以上)源操作数和目的操作数相交换, 并将两者之和存入目的操作数
所有状态标志都受影响,根据加法结果设置
加法指令
• 加法指令注意事项: 1. 源操作数和目的操作数不能同时为内存单元 (MEM)。 2. 不允许与段寄存器(SREG)相关的加法。 3. XADD指令的源操作数在寄存器(REG)中。 4. 标志寄存器中状态位随运算结果而变化,但INC 指令不影响CF标志。 5. 指令中操作数是带符号数还是无符号数由程序员 解释。
带进 格式 位加 功能
标志
ADC REG/MEM, REG/MEM/IMM
源操作数、目的操作数以及进位标志CF相加, 结果存入目的操作数
所有状态标志(ZF、CF、PF、AF、SF 及 OF) 都受影响
加法指令
加1 格式 功能 标志
INC REG/MEM 目的操作数加1 除CF标志位,其余状态标志都受影响
注意:第4章的数据传送指令不改变状态标志。
Example 1
• 例、试用加法指令对两个8位16进制数5EH和3CH求和,并 分析加法运算指令执行后对标志位的影响。
• 解: MOV AL, 5EH ;AL=5EH(94)
3CH(50) 0011 1100