多字节加减法汇编程序
汇编语言1数值运算程序设计

; NAME EX—05—2
DATA SEGMENT
X
DD 12345678H; 32位被乘数
Y
DD 567890ABH; 32位乘数
RESULT DW 4 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV MOV MOV MOV MUL MOV MOV MOV MOV MUL ADD ADC MOV
5.3 多字节除法
设有一个64位数除16位数,则商可能仍是64位, 而余数为16位。 若用一般的除法,则很难进行 处理。 如果用被除数连续减去除数得到商,很 可能要减亿万次,计算机将用很长时间才能完成 这么大的运算量。
如果在进行最高位除法时,高16位被除数为0, 然后将被除数最高16位送AX,除数放在CX中, 这样, 除法肯定不会产生溢出。第一次除法后 的余数放在DX中, 作为第二次除法的高16位, 将下一个被除数16位送AX, 再进行除法, 用这 种方法,可以顺利地完成整个除法运算。
ADDHEX: LODSB ADC STOSB INC LOOP MOV INT
COSEG END
FIRST AL, [BX]
DEST BX ADDHEX AH, 4CH 21H ENDS START
5.2 多字节乘法运算 设有两个32位二进制数, 相乘的结果将是一 个64位范围内的二进制数。 如果将一个乘数分 为两个字, 被乘数也分为两个字, 分别按字进 行相乘。 例如被乘数的两个字分别为X1和X0, 乘数的两个字分别为Y1和Y0, 则:
DS, AX SI, OFFSET RESULT AX, WORD PTR X CX, WORD PTR Y CX [SI], AX [SI+2], DX AX, WORD PTR X CX, WORD PTR Y+2 CX [SI+2], AX WORD PTR[SI+4], DX AX, WORD PTR X+2
用c语言编写加减乘除程序

用c语言编写加减乘除程序加减乘除是数学上最基本的四则运算,而用计算机语言实现这些运算则是计算机科学最基本的知识之一。
在c语言中,实现四则运算需要使用基本的算术运算符,并需要注意数据类型的匹配。
加法运算是最简单的四则运算之一,使用c语言执行加法运算的方法是,用“+”符号分隔两个运算数并用“=”符号赋值给结果变量。
例如,将两个整数相加并输出结果,代码如下:```#include <stdio.h>int main(){int a = 5, b = 7, sum;sum = a + b;printf("The sum of %d and %d is %d", a, b, sum);}```这段代码将输出结果:“The sum of 5 and 7 is 12”,其中sum 变量存储了a和b两个变量的和。
减法运算的实现方法与加法运算类似,只需将运算符改为“-”即可,例如:```#include <stdio.h>int main(){int a = 5, b = 7, diff;diff = a - b;printf("The difference between %d and %d is %d", a, b, diff);}```这段代码将输出结果:“The difference between 5 and 7 is -2”,其中diff变量存储了a和b两个变量的差。
乘法运算可以使用“*”符号来实现,例如:```#include <stdio.h>int main(){int a = 5, b = 7, prod;prod = a * b;printf("The product of %d and %d is %d", a, b, prod);return 0;```这段代码将输出结果:“The product of 5 and 7 is 35”,其中prod变量存储了a和b两个变量的积。
chapter03-05(汇编).

;-----------任务0开始----------PROC TASK0 TASK0: ;取任务内作业指针 MOV DPTR,#JOBTAB MOV A,#TASK0P MOV B,#3 MUL AB JMP @A+DPTR ;任务0程序段
JOBTAB: LJMP JOB0 LJMP JOB1 LJMP JOB2 LJMP JOB3 …
HTASC:MOV A,@R0 ;取低4位二进制数 ANL A,#0FH ; ADD A,#15 ;偏移量修正 MOVC A,@A+PC ;查表 MOV @R1,A ;存ASCII码 INC R1 ; MOV A ,@R0 ;取十六进制高4位 SWAP A ANL A,#0FH ; ADD A,#06H ;偏移值修正 MOVC A,@A+PC ; MOV @R1,A INC R0 ;指向下一单元 INC R1 ; DJNZ R2,HTASC ;字节数存于R2 RET ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H
;作业入口地址表 ;跳到作业0 ;跳到作业1 ;跳到作业2 ;跳到作业3 ;跳到作业n
;---------作业0开始--------JOB0: … ;作业0实际内容 ;---------作业0结束--------;根据需要将处理结果保存到任务数据区内 ;根据执行结果设置下一次要执行的作业指针 ;设置任务指针 LJMP EXIT ;---------作业1开始---------
调用处理过程中执行。
下面是具有4个任务的实时多任务程序结构:
;程序头 TASKP DATA 30H TASK0P DATA 38H TASK1P DATA 40H TASK2P DATA 48H TASK3P DATA 50H ORG 100H PROC MAIN,TASKPRO MAIN: ;初始化部分 MOV TASKP,#0 MOV TASK0P,#0 MOV TASK1P,#0 MOV TASK2P,#0 MOV TASK3P,#0
单片机实验多字节加减法

实验二实现多字节加(减)法一、 实验目的:a)熟悉单片机指令系统,b)学会用汇编语言编写计算程序二、 实验内容:(一)实验要求:正确建立工程文件、编写程序,会利用keil进行程序调试并观察运行结果。
z基本要求:编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相加,结果存放在内部RAM单元70H、71H、72H中(低位对应低字节)。
数据要求初始化:参考将20H和30H分别存放两个三字节的无符号数333333H和222222H。
z提高要求:将基本要求中的“相加”改成“减法”,其它要求与基本要求相同,数据要求初始化:参考将20H和30H分别存放两个三字节的无符号数333333H和223344H。
编写相应的程序并给予适当的注释。
(二)实验基本步骤:1.打开Keil,新建工程:Project/New Project,输入工程名,并保存2.选项选择器件:Atmel 的89C513.新建程序文本,并另存为该文件为汇编文件格式: (1)“File/New”,(2) File/Save As/键入欲使用的文件名及后缀名,即“文件名.asm”。
再单击“保存”4.添加该文件该工程:回到编辑界面后,单击“Target 1”前面的“+”号,然后在“SourceGroup 1”上单击右键,单击“Add File to Group ‘Source Group 1’”选择刚才新建的汇编文件。
5.在keil的汇编文件中输入程序代码,并编译,调试。
(1)写完代码后单击“Project”菜单,再在下拉菜单中单击“Built Target”选项(或者使用快捷键F7),编译成功后(0个errors),(每次修改程序后都要重新编译下,才能生效)。
(2)再单击“Debug”菜单,在下拉菜单中单击“Start/Stop Debug Session”(或者使用快捷键Ctrl+F5),点击RUN进行运行,或者按F11进行单步运行。
汇编语言加减除三则运算

汇编语言三一基地程序设计项目三任务:加减除三则运算。
说明:(1)读取字符串的内容,判断第四个字符是'+'、'-'或'/',然后按照相应的符号进行运算,并把运算结果转换为字符串存放在等号后面,最后把算式显示到屏幕中间,白底蓝字。
(2)注意数字字符的ASCII与数字的对应关系,数字的数值加30H为这个数字的字符所对应的ASCII。
Calculate segmentdb '1. 3/1= 'db '2. 5+3= 'db '3. 9-3= 'db '4. 4+5= 'Calculate ends汇编语言源代码:assume cs:code,ss:stackCalculate segmentdb '1. 3/1= 'db '2. 5+3= 'db '3. 9-3= 'db '4. 4+5= 'Calculate endsstack segmentdw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,Calculatemov ds,axmov ax,0b800hmov si,0mov cx,4s1: push cxmov al,byte ptr ds:[si+4]mov ah,0sub ax,2Bhmov cx,axjcxz jiasub ax,2mov cx,axjcxz jiansub ax,2mov cx,axjcxz chujia:mov al,byte ptr ds:[si+3]mov ah,0mov dl,byte ptr ds:[si+5]mov dh,0add ax,dxsub ax,60hjmp far ptr shuchujian:mov al,byte ptr ds:[si+3]mov ah,0mov dl,byte ptr ds:[si+5]mov dh,0sub ax,dxjmp far ptr shuchuchu:mov al,byte ptr ds:[si+3]mov ah,0sub ax,30hmov dl,byte ptr ds:[si+5]sub dl,30hdiv dlmov ah,0jmp far ptr shuchu shuchu:mov dl,10add al,30hmov ds:[si+7],aladd ah,30hmov ds:[si+8],ahadd si,16pop cxloop s1mov si,0mov cx,2000qingping:mov ax,0hmov es:[si],axadd si,2loop qingpingmov bx,0mov si,0mov cx,4xianshiy:push cxmov cx,16mov di,0xianshix: mov al,byte ptr ds:[si]mov byte ptr es:[di+840+bx],alinc dimov byte ptr es:[di+840+bx],71hinc diinc siloop xianshixpop cxadd bx,160loop xianshiymov ax,4c00hint 21hcode endsend start运行结果:。
多字节加减程序

多字节加/减程序实验通信1班李耀东23320112204128一.实验目的(1)掌握多字节二进制,BCD码加减运算程序的编程方法;(2)掌握多字节二进制,BCD码加减运算程序的调试方法;(3)掌握循环程序的编程方法;(4)了解调试程序的选区原则;(5)熟练掌握DEBUG中D,E,A,G等命令的使用。
二.实验内容(1)二进制加法78563412+FODEBC9A=016934F0ACCCDDEEFF+8899AABB=01557799BA(2)多字节压缩型BCD码的加法56868656+34654387=9152304387645425+76656522=0164301947(3)多字节非压缩型BCD码的加法08050607+08030704=010*******05020403+02080602=08010005(4) DATA SEGMENTDATA1 DB 4 DUP(?)DATA2 DB 4 DUP(?)DATA3 DB 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET DATA1MOV CX,DATA2-DATA1CLCNEXT:MOV AL,[SI]ADC AL,[SI+DATA2]NOPMOV [SI+DATA3],ALINC SILOOP NEXTMOV AL,0ADC AL,0MOV [SI+DATA3],ALMOV AH,4CHINT 21HCODE ENDSEND START(5)将上述DATA SEGMENTDATA1 DB 4 DUP(?)DATA2 DB 4 DUP(?)DATA3 DB 5 DUP(?)DATA ENDS改为DATA SEGMENTDATA1 DB 8 DUP(?)DATA2 DB 8 DUP(?)DATA3 DB 9 DUP(?)DATA ENDS(6) DATA SEGMENTDATA1 DW 4 DUP(?)DATA2 DW 4 DUP(?)DATA3 DW 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET DATA1MOV DI,OFFSET DATA2MOV BX,OFFSET DATA3MOV CX,(DATA2-DATA1)/2 CLCNEXT:MOV AX,[SI]ADC AX,[DI]NOPMOV [BX],AXINC SIINC DIINC BXINC SIINC DIINC BXLOOP NEXTMOV AL,0ADC AL,0MOV [BX],ALMOV AH,4CHINT 21HCODE ENDSEND START三.选择实验(1)要改为多字节二进制减法程序,则将ADC指令改为SBB指令即可:修改为多字节压缩型,非压缩型BCD码减法程序只需将NOP指令改为DAS 和AAS。
单片机多字节加减乘除法程序

单片机多字节加减乘除法程序文章长度[6790]加入时间[2007-8-14]更新时间[2012-6-12 18:04:14]级别[0][评论][收藏]一种实用的单片机多字节除法算法一种实用的单片机多字节除法算法在单片机的实际应用中,除法运算是比较常见的一种运算。
以MCS-51单片机为例,虽然它提供了除法指令,但只能进行单字节除以单字节的运算,如果要进行多字节的除法运算,就得自己设计算法。
目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二位大于除数时,不能进行运算;3.商只有两个字节。
例如,被除数是0FFFFFFFFH,除数是0004H时,商数应该是3FFFFFFFH,余数是0003H。
但是,用以前的算法是无法进行运算的。
在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。
为了满足实际运用中的需要,我设计了一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。
下面以MCS-51汇编语言为例进行说明。
该算法增加了两字节的余数单元,并把被除数单元用来存放商数。
运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。
若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。
再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位(如图示),共移位32次。
每移位一次,余数单元都 C (H L)(HH HL LH LL) 进位位余数单元被除数单元和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。
判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。
仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。
多字节加法多字节乘法

多字节无符号数加法实验报告
通信二班张晓宇 200800120295
一、实验目的
熟悉汇编中的加法指令。
二、实验内容
将被加数置入片内RAM 以40H 单元为起始地址的区间,将加数置入片内
RAM 以50H 单元为起始地址的区间。
置入时,多字节数按先低位后高位的次序存数,相加结果,放回30H 的存放单元。
三、流程图
否 有
开始
R0指向加数最低位地址40h
R1指向被加数最低位地址50h
R0与R1对应为相加将相
加结果放入R0中
R0加1,R1加1
所有位加完 最高位是否有进
位 否
是
向最高位进位
四、实验程序
org 0000h
ajmp main
org 0030h Main: mov r0,#40h mov r1,#50h mov r2,#4h
clr c
loop1:MOV A,@R0
ADDC A,@R1
MOV @r0,A
INC R0
INC R1
djnz r2,loop1 mov a,#00h
addc a,#00h mov @r0,a
mov r0,#40h mov r1,#30h mov r2,#10h loop2:mov a,@r0
mov @r1,a
inc r0
inc r1
djnz r2,loop2 Sjmp $
END 将40h地址数据移到30h地址中
结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16位10进制正整数加减法汇编程序代码说明:
将代码复制到Masm for Windows 集成实验环境 2012.5软件当中保存后点击运行如图:
出现如下窗口:
在屏幕上输入被加数(被减数)按‘+’结束,然后再输入加数(减数)按‘=’结束,最后窗口会显示运算结果。
例如要计算123456+123456789,步骤如下:
显然运算结果是正确的。
进行减法运算:123456-123456789,结果如下:
(注:由于n=16所以本程序最多只能进行16位数以内的正整数加减运算,如需进行任意位数的运算只需对n进行更改即可,这是本程序的最大优点。
但是本程序只能完成正整数的加减运算,对负数和小数的运算就无能为力了,另外也无法进行连加与连减的运算。
因此程序还有待进一步的改进。
)
汇编程序代码:
DATAS SEGMENT
n EQU 16 ;n表示和的最大位数
m EQU 8 ;因为和是ASCII码要转换成BCA码所以m=n/2
k EQU 9*m+6 ;
BUF0 DB 1 DUP (30H);
BUF1 DB n DUP(0) ;被加数(ASCII),n=8
DB 1 DUP (30H)
BUF2 DB n DUP(0) ;加数(ASCII)
BUF3 DB m DUP(0) ;被加数(BCD)
BUF4 DB m DUP(0) ;加数(BCD)
FHA DB 4 DUP(?) ;用于保存‘+’、‘-’、数据长度
SBC DB m DUP(?) ;BCD码形式的和
SAS DB n DUP(?) ;ASCII码形式的和
BUF5 DB 30H,n DUP(0),30H,n DUP(0),n DUP(0),4 DUP(?),m DUP(?),n DUP(?)
DATAS ENDS
STACKS SEGMENT
DB 100 DUP(?)
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
INPT1 PROC
;输入被加数到BUF1按‘+’结束
LEA SI,BUF1
MOV CX,0 ;CX用来统计输入数的字长
IN1:MOV AH, 01H
INT 21H
CMP AL,'+'
JZ BJS1
CMP AL,'-'
JZ BJS1
MOV[SI],AL
INC SI
INC CL
JMP IN1
;将BUF1中的ASCII转换成BCD码到BUF3
BJS1:
MOV [FHA],AL
MOV 1[FHA],CL
LEA DI,BUF3
MOV BX,2
MOV AX,CX
DIV BL
ADD AL,AH
MOV CL,AL
AB1: DEC SI ;AB1--ASCII转换成BCD码MOV AL,[SI]
SUB AL,30H
DEC SI
MOV AH,[SI]
SUB AH,30H
PUSH CX
MOV CL,4
SHL AH,CL
POP CX
ADD AL,AH
MOV[DI],AL
INC DI
LOOP AB1
;输入加数到BUF2按‘=’结束
LEA SI,BUF2
MOV CX,0 ;CX用来统计输入数的字长IN2:MOV AH, 01H
INT 21H
CMP AL,'='
JZ JAS
MOV[SI],AL
INC SI
INC CX
JMP IN2
;将BUF2中的ASCII转换成BCD码到BUF4 JAS:
MOV 2[FHA],CL
LEA DI,BUF4
MOV BX,2
MOV AX,CX
DIV BL
ADD AL,AH
MOV CL,AL
AB2: DEC SI ;AB2--ASCII转换成BCD码
MOV AL,[SI]
SUB AL,30H
DEC SI
MOV AH,[SI]
SUB AH,30H
PUSH CX
MOV CL,4
SHL AH,CL
POP CX
ADD AL,AH
MOV[DI],AL
INC DI
LOOP AB2
RET
INPT1 ENDP
;加法子程序
JAF PROC
CLC
MOV CL,m ;m=8
LEA BX,BUF3
LEA SI,BUF4
LEA DI,SBC
ADC_:MOV AL,[BX]
ADC AL,[SI]
DAA
MOV [DI],AL
INC SI
INC DI
INC BX
LOOP ADC_
RET
JAF ENDP
;减法子程序
JIAF PROC
SBB_:MOV AL,1[FHA]
CMP AL,2[FHA]
JA BDJ1 ;被加数长度大于加数长度,即被加数大于加数JZ BZJ1 ;被加数长度等于加数长度,进行大小比较
JMP BBJ ;被加数长度小于加数长度,即被加数小于加数
BZJ1:MOV CL,AL ;被加数长度等于加数长度,进行大小比较LEA SI,BUF1
LEA DI,BUF2
BZJ3:MOV AL,[SI]
CMP AL,[DI]
JA BDJ1 ;被加数当前位大于加数当前位即被加数大于加数跳转JB BBJ ;被加数当前位小于加数当前位即被加数小于加数跳转INC SI ;被加数当前位等于加数当前位,调整指针继续比较
INC DI
LOOP BZJ3
JMP BDJ1 ;被加数等于加数
BBJ:MOV AH,02H
MOV DL,'-'
INT 21H
CLC
MOV CL,m
LEA BX,BUF4
LEA SI,BUF3
LEA DI,SBC
JMP BDJ
BDJ1:CLC
MOV CL,m
LEA BX,BUF3
LEA SI,BUF4
LEA DI,SBC
BDJ:MOV AL,[BX]
SBB AL,[SI]
DAS
MOV [DI],AL
INC SI
INC BX
INC DI
LOOP BDJ
RET
JIAF ENDP
;BCD码转ASCII码子程序
BCD_ASC PROC
MOV CX,m ;m=8
LEA SI,SBC
LEA DI,SAS
BC_as:MOV AL,[SI]
MOV AH,AL
AND AL,0FH
ADD AL,30H
MOV [DI],AL
INC DI
PUSH CX
MOV CX,4
SHR AH,CL
POP CX
ADD AH,30H
MOV [DI],AH
INC DI
INC SI
LOOP BC_as
MOV CL,n ;这里n等于16
DIS1:DEC DI ;把首位的0去掉例如:0+1=00000001显示结果1 CMP BYTE PTR[DI],30H
JNZ DISP ;首位不为0跳转
LOOP DIS1
JNZ DISP ;CX不等于0 即结果不为0跳转
MOV DL,'0';CX等于0 即结果为0则显示0结束
MOV AH,02H
INT 21H
JMP DIS2
DISP:MOV DL,[DI]
MOV AH,02H
INT 21H
DEC DI
LOOP DISP
DIS2:RET
BCD_ASC ENDP
;数据段初始化子程序
CLC1 PROC
MOV CX,K
LEA SI,BUF5
LEA DI,BUF0
CLC2:MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP CLC2
RET
CLC1 ENDP
START:
;主程序:16位数以内整数加减法
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
CALL INPT1 ;调用输入子程序
CMP [FHA],'+';判断加减号
JNZ Jiha ;是'-'跳转到减法
CALL JAF ;调用加法子程序
JMP B_A1 ;跳转到BCD 转ACSII子程序
Jiha:CALL JIAF ;调用减法子程序
B_A1:CALL BCD_ASC ;将和转换成十进制数保存在SAS中MOV DL,0DH ;回车换行
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
CALL CLC1 ;调用数据段初始化子程序
JMP START;重新输入
MOV AH,4CH
INT 21H
CODES ENDS
END START。