汇编带进位加法
- 格式:docx
- 大小:47.20 KB
- 文档页数:3
一、数据传送指令(七种助记符)MOV (Move)对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送MOVX (Move External RAM)对外部存储器的数据传送XCH (Exchange)字节交换XCHD (Exchange Low-order Digit)低半字节交换PUSH (Push onto Stack)入栈POP (Pop from Stack)出栈二、算术运算指令(8种助记符)ADD (Addition)加法ADDC (Add with Carry)带进位加法SUBB (Subtract withBorrow)带借位减法DA (Decimal Adjust)十进制调整INC (Increment)加1DEC (Decrement)减1MUL (Multiplication Multiply)乘法DIV (Division Divide)除法三、逻辑运算类指令(10种助记符)ANL (AND Logic)逻辑与ORL (OR Logic)逻辑或XRL (Exclusive-OR Logic)逻辑异或CLR (Clear)清零CPL (Complement)取反RL (Rotate left)循环左移RLC (RL throught the carry flag)带进位循环左移SWAP (Swap)低4位与高4位交换四、控制转移类指令(17种助记符)ACCALL (Absolute subroutine Call)子程序绝对调用LCALL (Long subrout Call)子程序常调用RET (Return from Interruption)子程序返回RET1 (Return from Interruption)中断返回SJMP (Short jump)短转移AJMP (Absolute jump)绝对转移LJMP (Long Jump)长转移CJNE (Compare Jump if Not Equal)比较不等则转DJNZ (Decrement Jump if Not Zero)减1不为0则转JZ (Jump if zero)结果为0则跳转JNZ (Jump if Not Zero)结果不为0则跳转JC (Jump if Not carry flag is set)有进位则转移JB (Jump if the Bit is set)位为1则转移JNB (Jump if the Bit is Not set)位为0则转移JBC (JB and Clear the bit)位为1则转并清除该位NOP (No Operation)空操作五位操作指令(1种助记符)CLR 位清零SETB (Set Bit)位置1八种常用伪指令 16位地址此指令用在原程序或数据块的开始,指明此语句后面目标程序或数据块存放的起始地址2.【标号】DB 字节数据项表:奖项表中的字节数据存放到从标号开始的连续字节单元中。
汇编语言标志位(CF)及一些常用指令英文翻译:carry 进位 flag标志NV: no overflow OV: overflowUP: up DN:downDI: disable interrupt EI: enable interruptPL: plus NG: negativeNZ: no zero ZR: zeroNA: no assistant carry AC: assistant carryPO: parity odd PE: parity even 奇偶校验NC: no carry CY: carry汇编标志位:标志名标志 1 标志 0 OF (溢出标志) OV NVDF (方向标志) UP DNIF (中断标志) DI EISF (符号标志位) PL NGZF (零标志) NZ ZRAF (辅助进位标志位) NA ACPF (奇偶标志) PO PECF (进位标志) NC CYOF 溢出(是/否) OV OVerflow NV Not oVerflowDF 方向(减量/增量) DN DowN UP UPIF 中断(允许/关闭) EI Enable Interrupt DI Disable Interrupt SF 符号(负/正) NG NeGative PL PLusZF 零(是/否) ZR ZeRo NZ Not ZeroAF 辅助进位(是/否) AC Auxiliary Carry NA Not AuxiliaryPF 奇偶(是/否) PE Parity Even PO Parity OddCF 进位(是/否) CY CarrY NC Not Carry英文解释:NV: no overflow OV: overflowUP: up DN:downDI: disable interrupt EI: enable interruptPL: plus NG: negativeNZ: no zero ZR: zeroNA: no assistant carry AC: assistant carryPO: parity odd PE: parity evenNC: no carry CY: carry先熟悉一下FLAGS标志位:OV、NV即溢出标志位OF=1或0,表示运算结果有无溢出。
51单片机汇编语言带进位加法指令带进位加法指令(4 条)这4 条指令除与[1]功能相同外,在进行加法运算时还需考虑进位问题。
ADDC A,data ;(A)+(data)+(C)(A)累加器A 中的内容与直接地址单元的内容连同进位位相加,结果存在A 中ADDC A,#data;(A)+#data +(C)(A)累加器A 中的内容与立即数连同进位位相加,结果存在A 中ADDC A,Rn ;(A)+Rn+(C)(A)累加器A 中的内容与工作寄存器Rn 中的内容、连同进位位相加,结果存在A 中ADDC A,@Ri ;(A)+((Ri))+(C)(A)累加器A 中的内容与工作寄存器Ri 指向地址单元中的内容、连同进位位相加,结果存在A 中用途:将A 中的值和其后面的值相加,并且加上进位位C 中的值。
说明:由于51 单片机是一种8 位机,所以只能做8 位的数学运算,但8 位的运算范围只有0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将2 个8 位的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以到达0-65535。
如何合并呢?其实很简单,让我们看一个十进制数的例子吧:66+78 这两个数相加,我们根本不在意这个过程,但事实上我们是这样做的:先做6+8(低位),然后再做6+7,这是高位。
做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法。
之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范围(0-9)。
在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法时将这一点加进去。
那么计算机中做16 位加法时同样如此,先做低8 位的,如果两数相加后产生了进位,也要点一下做个标记,这个标记就职进位位C,在程序状态字PSW 中。
在进行高位加法是将这个C 加进去。
例如:1067H+10A0H,先做67H+A0H=107H,而107H 显然超过了0FFH,因此,最终保存在A 中的数是。
⽤汇编实现⼤数的加减运算1.⼤数加法DATAS SEGMENTA db 100 dup(?);第⼀个数B db 100 dup(?) ;第⼆个数count db ?;记录最⼤位数temp db ?;进位标志位len1 db 0;记录A的位数len2 db 0;B的位数DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:DATASSTART:MOV AX,DATASMOV DS,AXmov es,axxor ax,axin1:;A数组的输⼊mov ah,1int 21hsub al,'0'cmp al,0;判定输⼊的字符是否是0-9jl @Fcmp al,9jg @Fpush axinc len1jmp in1@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea di,Amov cl,len1inc diloop @Bxor ax,axin2:;输⼊B数组mov ah,1int 21hsub al,'0';判定输⼊的字符是否是0-9cmp al,0jl @Fcmp al,9jg @Fpush axinc len2jmp in2@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea si,Bmov cl,len2@@:;将数组A倒置pop axmov [si],alinc siloop @Bmov bl,len1mov al,len2mov count,bl ;⽐较出最⼤位数,并将位数⼩的数组在⾼位补0,直到位数相等cmp bl,aljz sajg xymov count,alsub al,blmov cl,al@@:mov [di],0xy:sub bl,almov cl,bl@@:mov [si],0inc siloop @Bsa:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志clcfg:;2个数组addmov bl,[si]cmp temp,1clcjnz p3stcp3:mov temp,0adc bl,[di]cmp bl,10jl p2sub bl,10mov temp,1p2:push bxinc diinc siloop fgcmp temp,1jnz p1mov bl,1;最⾼位有进位,加1位并置1 push bxinc countp1:mov cl,0@@:;清除前⾯多余的0cmp al,0jz @B@@:push axdec clsub count,clmov cl,count@@:;结果输出pop dxadd dl,'0'mov ah,2int 21hloop @BMOV AH,4CHINT 21HCODES ENDSEND STARTView Code结果:4986746546546879879849867553453442.⼤数减法DATAS SEGMENTA db 100 dup(?);第⼀个数B db 100 dup(?) ;第⼆个数count db ?;记录最⼤位数temp db ?;标志位len1 db 0;记录A的位数len2 db 0;BDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:DATASSTART:in1:;A数组的输⼊mov ah,1int 21hsub al,'0'cmp al,0;判定输⼊的字符是否是0-9 jl @Fcmp al,9jg @Fpush axinc len1jmp in1@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea di,Amov cl,len1@@:;将数组A倒置pop axmov [di],alinc diloop @Bxor ax,axin2:;输⼊B数组mov ah,1int 21hsub al,'0';判定输⼊的字符是否是0-9 cmp al,0jl @Fcmp al,9jg @Fpush axinc len2jmp in2@@:lea si,Bmov cl,len2@@:;将数组A倒置pop axmov [si],alinc siloop @Bmov bl,len1mov al,len2mov count,bl ;⽐较出最⼤位数,并将位数⼩的数组在⾼位补0,直到位数相等cmp bl,aljz comjg xymov count,alsub al,blmov cl,al@@:mov [di],0inc diloop @Bjmp sbaxy:sub bl,almov cl,bl@@:mov [si],0inc siloop @Bjmp sabmov cl,countlea di,Alea si,B;⽐较a/b⼤⼩com:mov bl,[di]cmp bl,[si]sab:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志fg1:mov bl,[di]sub bl,tempmov temp,0cmp bl,[si]jge p3add bl,10mov temp,1p3:sub bl,[si]push bxinc diinc siloop fg1jmp p1;;a<b是让b-asba:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志fg2:;2个数组submov bl,[si]sub bl,tempmov temp,0cmp bl,[di]jge p32add bl,10mov temp,1p32:mov dl,2DH ;输⼊‘-’mov ah,2int 21h;p1:mov cl,0@@:;清除前⾯多余的0 pop axinc clcmp cl,countjz @Fcmp al,0jz @B@@:push axdec clsub count,clmov cl,count@@:;结果输出pop dxadd dl,'0'mov ah,2int 21hloop @BMOV AH,4CHINT 21HCODES ENDSEND STARTView Code结果:416546546 87987987979-87571441433。
汇编基本指令对标志位的影响算术运算指令1、加法指令1)、普通加法指令ADD ADD reg/mem,reg/mem/imm受影响标志位:AF/CF/OF/PF/SF/ZF 2)、带进位的加法ADC ADCreg/mem,reg/mem/imm受影响标志位:AF/CF/OF/PF/SF/ZF该指令和1)中唯一不同的是除了执行1)中加法外还要加上CF。
3)、加1指令INC INC reg/mem受影响标志位:AF/OF/PF/SF/ZF 4)、交换加法指令XADD XADDreg/mem,reg该指令首先交换两个操作数的值,然再做加法,相当于以下两条指令:XCHG reg/mem,reg ADD reg.mem,reg 2、减法指令[和加法指令相反]1)、普通减法SUB 2)、带借位的减法SBB除了1)中减法还有减去CF 3)、减1指令DEC 4)、求补指令NEG NEG reg/mem受影响标志位:AF/CF/OF/PF/SF/ZF执行结果:操作数=0-操作数3、乘法指令分为带符号乘法和无符号乘法,区别在于:数据的最高位是作为符号还是数值参与运算。
1)、无符号乘法MUL MUL reg/mem受影响标志位:CF/OF我们知道乘法要有乘数和被乘数,指令中只有一个操作数,所以我们必须知道第二个操作数在哪里。
Intel处理的方式是,被乘数提前存在EAX中,然后与给出的乘数相乘,结果放在规定的寄存器中:乘数位数隐含的被乘数乘积存放位置[高-低]举例8 AL AX MUL CL 16 AX DX-AX NUL CX 32 EAX EDX-EAX MUL ECX 2)、有符号乘法IMUL IMUL reg/mem受影响标志位:CF/OF其操作数都作为有符号数相乘。
4、除法指令1)无符号除法DIV reg/mem不影响标志位被除数默认存放规则如下:除数位数隐含的被除数商余数8 AX AL AH 16 DX-AX AX DX 32 EDX-EAX EAX EDX 2)有符号除法IDIV reg/mem受影响标志位:AF/CF/OF/PF/SF/ZF三、逻辑运算指令1、逻辑与AND指令AND reg/mem,reg/mem/imm受影响的标志位:CF(0)/OF(0)/SF/PF/ZF执行过程:源操作数和目的操作数进行逻辑与运算,结果存放在目的操作数。
小学数学《20以内的数进位加减法》150道选择题包含答案一、选择题(共150题)1、根据题意,列式计算,正确的是()A.9个B.8个C.7个D.6个2、车上有12个座位,有7名男生和4名女生乘车,座位够吗?()A.够B.不够3、妈妈买回来14个苹果,比梨多5个,那么梨有()个。
A.8B.9C.104、同学们排成一队做操.东东的前面有3人,他的后面有5人.一共有()A.7人B.8人C.9人5、1个一,2个十组成的数字是()。
A.12B.21C.116、一个蘑菇也没采到的是()。
A. B. C. D.7、8+()<13,()里最大填几?A.3B.4C.58、从5、6、7三个数中任意选取其中2个数求和,得数有()种可能。
A.3B.4C.69、红、黄、蓝三种颜色的小旗各有5面,一共有多少面小旗?列式计算正确的是()A.5+5=10(面)B.5+3=8(面)C.5+5+5=15(面)D.5+2=7(面)10、一个数减1就得最大的三位数,这个数是()A.1000B.10000C.99911、学校有9个,又买来5个,一共有________个.()A.4B.13C.14D.3012、小青有语文本、数学本共14本,其中语文本有8本,数学本有多少本?正确的解答是()A.14-6=8(本)B.14-8=6(本)C.14-6=9(本)D.14+8=22(本)13、小亮要做14面,做好了4面,还要做_________面.()A.18B.10C.15D.914、不数,你能看出大约有多少吗?()A.5个B.10个C.15个15、小明排第10,小红排第16,小明和小红之间有()人。
A.4B.5C.6D.716、12比()少3。
A.17B.11C.1517、一年级有15名同学玩捉迷藏游戏,已经捉住了9名,还剩( )名没有捉住。
(1人找,其他人藏)A.6B.5C.418、树上有12只小鸟,飞走了6只,树上还有()只小鸟。
A.18B.6C.919、看图列式计算,正确的是 ( )A.14-6=8B.14-8=6C.14-6=20D.6+8=1420、一根绳子先剪去了6米,又剪去5米,现在这根绳子比原来短了()A.1米B.10米C.11米D.12米21、“12 3+8”,比较大小,在里应填的符号是()A.>B.<C.=D.-22、林奶奶买了一些,吃了6个,还剩8个。
一.实验题目:8位,16位,32位加法运算(考虑进位)
二.程序内容及结果
1.8位加法运算
#include<stdio.h>
#include<math.h>
int main()
{
char buffer[5]={110,132,123,234,112};
int sum;
_asm
{
LEA ESI,buffer
MOV CX,5//计数器
XOR EAX,EAX//清0
NEXT:
ADD AL,[ESI]//低8位相加
ADC AH,0//高8位加上可能的进位
INC ESI//指针指向下一位
DEC CX//计数器减1
JNZ NEXT//计数器不为0,跳转
MOV sum,EAX
}
printf("8位加法\n")
printf("sum=%d\n",sum);
return 0;
}
2.16位加法运算
1)移位,不考虑进位
#include<stdio.h>
#include<math.h>
int main()
{
int BUFFER[5]={110,132,123,234,112};//五个32位整形数
int SUM;
_asm
{
LEA ESI,BUFFER//取数组的首地址
XOR ECX,ECX//清0
MOV DX,5//计数器,5次
NEXT:
MOV EAX,[ESI]//赋值
MOV EBX,EAX
AND EAX,0000FFFFH//32位前16位变为0,后16位不变
SHR EBX,16//右移16位
ADD AX,BX//低16位相加
ADD CX,AX//结果放在cx中
ADD ESI,4//指针指向下一位整数
DEC DX
JNZ NEXT
MOV SUM,ECX
}
printf("16位加法移位程序,不考虑进位\n");
printf("SUM=%x\n",SUM);
printf("SUM=%d\n",SUM);
return 0;
}
2)16位考虑进位
#include<stdio.h>
#include<math.h>
int main()
{
int BUFFER[5]={110,132,123,234,112};//整形32位
int SUM;
_asm
{
LEA ESI,BUFFER//取数组的首地址
MOV DX,10//计数器,32位分解成16加法,10个
XOR BX,BX//EBX清零
NEXT:
MOV AX,[ESI]//首地址后的16位赋值给AX
ADD BX,AX//16加法
ADC CX,0//进位放在CX中
ADD ESI,2//指针指向下一个16位
DEC DX//计数器减1
JNZ NEXT//计数器不是0跳转
LEA ESI,SUM//取SUM的低位地址
MOV [ESI],BX//加法的低16位放在SUM首地址的低32位
MOV [ESI+2],CX//进位放在SUN的高32位
}
printf("16位加法考虑进位");
printf("SUM=%d\n",SUM);
return 0;
}
3.32位加法
#include<stdio.h>
#include<math.h>
int main()
{
long long int BUFFER[5]={110,132,123,234,112};//长整形64位 long long int SUM;
_asm
{
LEA ESI,BUFFER//取数组的首地址
MOV EDX,10//计数器,64位分解成32加法,10个
XOR EBX,EBX//EBX清零
NEXT:
MOV EAX,[ESI]//首地址后的32位赋值给EAX
ADD EBX,EAX//32加法
ADC ECX,0//进位放在ECX中
ADD ESI,4//指针指向下一个32位
DEC EDX//计数器减1
JNZ NEXT//计数器不是0跳转
LEA ESI,SUM//取SUM的低位地址
MOV [ESI],EBX//加法的低32位放在SUM首地址的低32位
MOV [ESI+4],ECX//进位放在SUN的高32位
}
printf("32位加法\n");
printf("SUM=%I64d\n",SUM);
return 0;
}。