算数运算指令
- 格式:pdf
- 大小:70.63 KB
- 文档页数:7
1. 加法指令(s 代表源操作数,d 代表目标操作数)(1)不带进位的加法指令add d,ss和d相加的结果存入d。
(2)带进位的加法指令adc d,sS和d相加后再加上标志位CF,结果存入dAdd主要用来计算低位字加法,adc用来计算高位字加法,实现32位加法比如一个32位数,高16位存在dx中,低16位存在ax中另一个32位数,高16位置存在cx中,低16位存在bx中计算加法add ax,bxAdc dx,cx(3)加1指令inc d 则d=d+1Inc axInc bl2. 减法指令(1)不带借位的减法sub d, sd-s结果存入d(2)带借位的减法sbb d,sd-s-CF,结果存入d比如一个32位数,高16位存在dx中,低16位存在ax中另一个32位数,高16位置存在cx中,低16位存在bx中计算减法,第一个数减第二个数sub ax,bxsbb dx,cx(3)减1指令dec d 则d=d-1dec axdec bl(4)求补NEG d将d包括符号位在内各位取反,末位加1相当于d=0-d比如字节型-5计算机中存的是11111011求补后是00000101,即5比如字节型+7计算机中存的是00000111求补后是11111001即-7 (5)比较cmp d,s类似做减法sub,但不保存结果,只用来影响标志位,主要通过执行后的标志位来判断两个数的大小关系比如cmp ax,bx (类似做ax-bx)Jz label1 (JZ意思是两数相等则跳转, jmp if zf=1)3. 乘法指令(1)无符号数乘法(用于正数)Mul s (该指令隐含了操作数ax或al)s为无符号word型,将s与AX相乘,结果存入DX,AX;s为无符号byte型,将s与AL相乘,结果存入AX(2)有符号数乘法(用于负数)imul s (该指令隐含了操作数ax或al)s为有符号word型,将s与AX相乘,结果存入DX,AX;s为有符号byte型,将s与AL相乘,结果存入AX乘法指令影响of位和cf位,乘积结果用到高字(节)寄存器,则of=1,cf=1;没用到高字(节)寄存器(结果在8位或16位范围内) 则of=0,cf=0 书p974. 除法指令(隐含被除数在ax或dx,ax中)(1)无符号数除法Div sS为无符号byte型,则用ax/s ,商存在al中,余数存在ah中S为无符号word型,则用dx,ax/s,商存在ax中,余数存在dx中(2)有符号数除法idiv s和无符号数除法类似,用于有符号数假设用30001/2 ,代码如下Mov ax, 30001Mov bl, 2Div bl得到的是divide override,这样的情况暂不考虑,只考虑结果能够存放到相应寄存器中的情况(3)字节转换成字(隐含操作数为al)CBW将al中的符号位扩展到ah中,比如-5,mov al,-5<=> mov al, 11111011bal中的11111011b经cbw扩展后AX中为1111111111111011b;al存的如果是正数,直接在ah中存入00000000b(4)字转换成双字(隐含操作数为ax)Cwd (convert word to dword)和cbw类似,将ax中的符号位扩展到dx中。
算数运算指令展开全文算数运算指令算术运算指令的主要功能是实现算术加、减、乘、除等运算。
1.ADD类指令是不带进位的加法运算指令(4条)。
ADD A,Rn ;A+Rn→A, A与Rn寄存器内容相加,结果送到A中ADD A,direct ;(direct)+A→A, A与直接地址内容相加,和送AADD A, @Ri ;(Ri)+A→A, A与Ri间址内容相加,和送AADD A, #data ;data+A→A, A与立即数相加,和送A注意:ADD类指令相加结果均在A中,相加后源操作数不变。
若A中最高位有进位,Cy置1;若半加位有进位,AC置1。
A的结果还影响奇偶标志位P。
例 A=30H, R0=10H执行 ADD A,R0 结果:A=40H, R0=10H,标志位 P=1, Cy=0, OV=0, AC=02.ADDC类指令(带进位加法4条)ADDC A, Rn ;A+Rn+Cy→A, A与R n内容、进位状态相加,和送到A中ADDC A, direct ;(direct)+Cy+A→A, A与直接地址中内容、进位状态相加,和送AADDC A, @Ri ;(Ri)+Cy+A→A, A与Ri间址单元中内容、进位状态相加,和送AADDC A, #data ;data+Cy+A→A, A与立即数、进位状态相加,和送A与ADD类指令的区别是,ADDC指令相加时连同进位标志Cy内容一起相加,主要用于多字节加法中的高位字节的相加,而最低位字节相加用ADD指令。
进位位Cy加到字节的最低位。
例写计算1234H+0FE7H的程序,将结果存入内部RAM的41H 和40H单元,40H存低8位,41H存高8位。
程序MOV A, #34H ;被加数低8位数34H送AADD A, #0E7H ;加数低8位数E7H与之相加,A=1BH,Cy=1 MOV 40H, A ;A→40H即34H+E7H结果存入40H中(40H=1BH)MOV A, #12H ;被加数高8位数12H送AADDC A, #0FH ;加数高8位0FH和Cy与A相加,A=22H MOV 41H, A ;高8位与进位位之和存入41H中(41H)=22H ;总和为221BH,总结果在41H,40H单元中3.SUBB类指令(4条)SUBB类指令是带借位减法指令,其功能是将A中被减数减去源操作数指出的内容,再减去借位标志Cy(原进位标志)状态,差值在A中。
算术运算类指令
1.加法指令
ADD ⽬的操作数, 源操作数
ADC ⽬的操作数,源操作数
INC ⽬的操作数
ADD不带进位的加法指令,ADC带进位的加法指令,影响CF,INC增量指令,操作数⾃加⼀
2.减法指令
SUB ⽬的操作数,源操作数
SBB ⽬的操作数,源操作数
DEC ⽬的操作数
NEG ⽬的操作数
CMP ⽬的操作数,源操作数
SUB不带借位的减法指令,SBB带借位的减法指令,影响标志位,DEC⾃减⼀,NEG是求补指令,功能是将⽬的操作数的内容取补码,再将结果送回操作数,CMP⽐较指令,功能是⽬的操作数减去源操作数,不送回结果,影响标志位
3.乘法指令
MUL 源操作数
IMUL 源操作数
MUL是⽆符号数相乘,IMUL是有符号数相乘。
功能是AL乘以源操作数,16位乘积存放在AX中,或AX乘以源操作数,32位乘积存放在DX,AX
4.除法指令
DIV 源操作数
IDIV 源操作数
CBW
CWD
DIV是⽆符号除法,IDIV是有符号数除法。
功能是DX和AX表⽰的32位除以源操作数,得到的商放在AX中,16位的余数DX中。
或AX表⽰的16位数除以8位的源操作数,得到8位商放在AL中,8位余数放在AH中,CBW将字节扩展成字的指令,即将AL寄存器中的符号位扩展到AH 中。
CWD指令将AX中的被除数扩展成双字,即把AX中的符号位扩展到DX中
5.BCD码运算的调整指令
DAA AAA DAS AAS AAM AAD
⼆进制数实现⼗进制加减法。
算术运算指令是反映CPU计算能⼒的⼀组指令,也是编程时经常使⽤的⼀组指令。
它包括:加、减、乘、除及其相关的辅助指令。
该组指令的操作数可以是8位、16位和32位(80386+)。
当存储单元是该类指令的操作数时,该操作数的寻址⽅式可以是任意⼀种存储单元寻址⽅式。
1、加法指令、加法指令ADD(ADD Binary Numbers Instruction)指令的格式:ADD Reg/Mem, Reg/Mem/Imm受影响的标志位:AF、CF、OF、PF、SF和ZF指令的功能是把源操作数的值加到⽬的操作数中。
、带进位加指令ADC(ADD With Carry Instruction)指令的格式:ADC Reg/Mem, Reg/Mem/Imm受影响的标志位:AF、CF、OF、PF、SF和ZF指令的功能是把源操作数和进位标志位CF的值(0/1)⼀起加到⽬的操作数中。
、加1指令INC(Increment by 1 Instruction)指令的格式:INC Reg/Mem受影响的标志位:AF、OF、PF、SF和ZF,不影响CF指令的功能是把操作数的值加1。
、交换加指令XADD(Exchange and Add)指令的格式:XADD Reg/Mem, Reg ;80486+受影响的标志位:AF、CF、OF、PF、SF和ZF指令的功能是先交换两个操作数的值,再进⾏算术“加”法操作。
例5.3 已知有⼆个32位数d1和d2(⽤数据类型DD说明),编写程序⽚段把d2的值加到d1中。
解:32位数d1和d2在内存中如下所⽰。
…… …… ……⽅法1:⽤16位寄存器编写程序MOVAX, word ptr d1;由于d1是双字类型,必须使⽤强制类型说明符。
以下同。
MOVDX, word ptr d1+2;(DX,AX)构成⼀个32位数据ADDAX, word ptr d2;低字相加ADCDX, word ptr d2+2;⾼字相加。
汇编指令分类及使用方法汇编指令可以分为以下几类:数据传输指令、算术运算指令、逻辑运算指令、转移指令和其他指令等。
一、数据传输指令1. MOV(Move)指令:用于将数据从源操作数传输到目的操作数。
例如:MOV AX, BX 将BX寄存器中的数据传输到AX寄存器中。
2. PUSH(Push)指令:将数据压栈。
例如:PUSH AX 将AX寄存器中的数据压入栈中。
3. POP(Pop)指令:将数据从栈弹出。
例如:POP AX 将栈顶数据弹出然后存入AX寄存器中。
二、算术运算指令1. ADD(Addition)指令:将两个操作数相加。
例如:ADD AX, BX 将AX和BX寄存器中的数据相加并存储在AX寄存器中。
2. SUB(Subtraction)指令:将第二个操作数从第一个操作数中减去。
例如:SUB AX, BX 将AX寄存器中的数据减去BX寄存器中的数据并存储在AX寄存器中。
3. MUL(Multiply)指令:将两个操作数相乘,结果存储在一个乘法寄存器中。
例如:MUL AX, BX 将AX寄存器中的数据与BX寄存器中的数据相乘并存储在AX:DX寄存器对中。
三、逻辑运算指令1. AND(And)指令:对两个操作数逐位执行逻辑与运算。
例如:AND AX, BX 将AX和BX寄存器中的数据逐位执行逻辑与运算并存储在AX寄存器中。
2.OR(Or)指令:对两个操作数逐位执行逻辑或运算。
例如:ORAX,BX将AX和BX寄存器中的数据逐位执行逻辑或运算并存储在AX寄存器中。
3. XOR(Exclusive Or)指令:对两个操作数逐位执行逻辑异或运算。
例如:XOR AX, BX 将AX和BX寄存器中的数据逐位执行逻辑异或运算并存储在AX寄存器中。
四、转移指令1.JMP(JuMP)指令:无条件跳转到一些标号或地址。
例如:JMPLABEL1将程序转移到LABEL1处。
2. JE(Jump Equal)指令:当两个操作数相等时跳转。
汇编语言指令汇编语言是一种低级语言,用于编写计算机程序。
在汇编语言中,指令起着至关重要的作用,它们直接控制着计算机的运行。
本文将介绍几种常见的汇编语言指令。
1. 数据传送指令数据传送指令用于将数据从一个地方传送到另一个地方。
常见的数据传送指令包括MOV(move)指令和LEA(load effective address)指令。
MOV指令可以将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。
LEA指令将源操作数的有效地址加载到目标寄存器中。
2. 算术运算指令算术运算指令用于进行各种数学运算,包括加法、减法、乘法和除法等。
常用的算术运算指令有ADD(addition)指令和SUB (subtraction)指令。
ADD指令用于将两个操作数相加,并将结果存储到目标操作数中。
SUB指令可以实现减法运算。
3. 逻辑运算指令逻辑运算指令用于执行逻辑运算,如与、或、非等。
与运算用AND指令表示,或运算用OR指令表示,非运算用NOT指令表示。
这些指令可以对某一位或多位进行逻辑运算,并将结果存储到目标操作数中。
4. 控制转移指令控制转移指令用于改变程序的执行顺序。
常见的控制转移指令包括JMP(jump)、JZ(jump if zero)和JC(jump if carry)等。
JMP指令用于无条件跳转到指定的目标地址。
JZ指令在零标志位为真时跳转,用于实现条件语句。
JC指令在进位标志位为真时跳转,常用于实现循环。
5. 栈操作指令栈操作指令用于对堆栈进行操作。
堆栈是一种后进先出(LIFO)的数据结构,常用于保存和恢复程序的上下文。
常见的栈操作指令有PUSH(push)和POP(pop)。
PUSH指令将一个数据压入堆栈,而POP指令将栈顶数据弹出。
6. 输入输出指令输入输出指令用于与外部设备进行数据的输入和输出。
常见的输入输出指令包括IN(input)和OUT(output)。
IN指令用于从指定的端口读取数据,而OUT指令用于将数据输出到指定的端口。
一、算术运算指令算术运算中的溢出问题以8位二进制数的加法为例,两个8位数相加时有4种情况:二进制运算对应的十进制运算数据作为无符号数数据作为有符号数Case1:无符号数和有符号数均不溢出0000 1000+ 0001 11100010 0110结果: 26H(38)CF=0, OF=08+ 3038未超出8位无符号二进制数表示范围+8+ (+30)+38未超出8位有符号二进制数表示范围Case2:无符号数溢出,有符号数不溢出0000 1000+ 1111 11011 0000 0101结果:5CF=1, OF=08+ 253261超出8位无符号二进制数表示范围+8+(-3)+5未超出8位有符号二进制数表示范围Case3:无符号数不溢出,有符号数溢出0000 1000+ 0111 11011000 0101结果:-123(补码)CF=0, OF=18+ 125133未超出8位无符号二进制数表示范围+8+ (+125)+133超出8位有符号二进制数表示范围Case4:无符号数和有符号数均溢出1000 1000+ 1111 01111 0111 1111结果:127CF=1, OF=1136+ 247383超出8位无符号二进制数表示范围-120+ (-9)-129超出8位有符号二进制数表示范围上面四种情况说明,算术运算溢出的判别是比较复杂的,不能只用一个标志位来判别。
算术运算溢出是一种出错状态,在运算过程中应当避免。
1 加法运算指令【例1】ADD CL,20H ;CL←(CL)+ 20HADD AX,SI ;AX←(AX)+(SI)ADD [BX+2],AL ;(BX+2)←((BX)+2)+(AL)ADD DX,[BX+SI] ;DX←(DX)+((BX)+(SI))ADD AX,CL ;错误!操作数类型应一致ADD [SI],[BX] ;错误!不允许两个操作数都是存储器ADD DS,AX ;错误!不允许把段寄存器作为操作数加法指令对全部6个状态标志位都会产生影响。