第5章算术和逻辑运算指令共93页文档

合集下载

算数运算指令

算数运算指令
LOGO
算数运算指令
机电教研室 李大勇
§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课件

算术与逻辑运算指令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算术和逻辑运算指令

(微机原理与接口技术)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

逻辑运算指令

逻辑运算指令
5
例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)

算术及逻辑运算类指令

算术及逻辑运算类指令
调整后,辅助进位位AC表示十进数中个位向十位的进位,进位标志Cy表示十位向百位的进位。
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累加器为操作数)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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
相关文档
最新文档