多字节加减法汇编程序

合集下载

汇编语言1数值运算程序设计

汇编语言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语言中,实现四则运算需要使用基本的算术运算符,并需要注意数据类型的匹配。

加法运算是最简单的四则运算之一,使用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(汇编).

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地址中
结束。

单片机实验多字节加减法

单片机实验多字节加减法

实验二汇编语言程序设计(一)【实验目的】复习MCS—51单片机汇编语言的编辑、编译、调试方法,熟练掌握汇编语言程序设计的方法与技巧。

【实验内容】1.多字节加减法2.多字节乘法3。

数据转换(选做)【实验原理】利用子程序调用在内部RAM单元中实现多字节的加法程序,并且把和再放回原单元中,其中R7是循环次数计数器,R0和R1分别作为加数和被加数指针。

1、多字节加法源程序:ORG 0000HMOV R0,#40HMOV R1,#50HMOV R7,#03HCLR CLOOP1: MOV A,@R0ADD A,@R1MOV @R0,AJNC LOOP2LOOP2: INC R0INC R1MOV A,R0DJNZ R7,LOOP1SJMP $END实验结果如下图:2、多字节乘法源程序:ORG 0000HQMUL: MOV A,R3MOV B,R7MUL ABXCH A,R7MOV R5,BMOV B,R2MUL ABADD A,R5MOV R4,ACLR AADDC A,BMOV R5,AMOV A,R6MOV B,R3MUL ABADD A,R4XCH A,R6XCH A,BADDC A,R5MOV R5,AMOV F0,CMOV A,R2MUL ABADD A,R5MOV R5,ACLR AMOV ACC。

0,CMOV C,F0ADDC A,BMOV R4,AEND实验结果如下图:。

实验2_多字节整数加减法

实验2_多字节整数加减法

实验二ARM的多字节整数加减法一、实验目的:●掌握ARM汇编语言程序设计和调试方法;●熟悉Embest IDE集成开发环境的操作方法。

二、实验原理:ARM处理器具有很强的算术逻辑运算功能,算术指令可以实现32位有符号数和无符号数的加法和减法操作。

其语法为:<Opcode>{<cond>}{S} Rd,Rn,N从上表可以看出,ADD和SUB是最简单的加减运算。

ADC和SBC是带进位标志的加减运算,对于SBC,若进位标志为0,则结果减1。

RSB是反减,即用第2操作数减去源操作数,由于第2操作数可选的范围宽,故这条指令很有用。

RSC是带进位标志反减,若进位标志为0,则结果减1。

在ARM指令集中,通过设置S位(第20位),可以直接控制指令的执行是否影响条件码。

当S位为0时,条件码不改变;当S位为1时(且Rd不是R15(PC)),条件码改变。

另外,在算术指令和逻辑指令中广泛使用的第2操作数移位功能,是ARM指令集的一个非常显著的特征。

这样可以在操作数进入ALU之前,对操作数进行指定位数的左移或右移(即乘“2”或除“2”)。

这种功能明显增强了许多数据处理操作的灵活性。

三、实验内容:●完成两个128位无符号整数加法程序。

●观察寄存器中的内容,检验实验结果是否正确。

●改变两个128位加数和被加数的值,观察CPSR中标志位的变化。

四、实验步骤:1.在Embest IDE环境中新建工程,编写程序;2.编译成功后,连接下载进行调试。

3.观察程序运行结果。

五、实验参考程序.global _start.text.arm_start:MOV R0, #0x10MOV R1, #0x1000000AMOV R2, #0x00MOV R3, #0x6000000DMOV R5, #0x1000000AMOV R6, #0x00MOV R7, #0x6000000DADCS R0, R0, R4ADCS R1, R1, R5ADCS R2, R2, R6ADCS R3, R3, R7 stop:B stop.end实验结果截图:六、思考题:完成两个128位无符号整数减法程序。

多字节加减法汇编程序

多字节加减法汇编程序

多字节加减法汇编程序16位10进制正整数加减法汇编程序代码说明:将代码复制到Masm for Windows 集成实验环境软件当中保存后点击运行如图:出现如下窗口:在屏幕上输入被加数按‘+’结束,然后再输入加数按‘=’结束,最后窗口会显示运算结果。

例如要计算123456+123456789,步骤如下:显然运算结果是正确的。

进行减法运算:123456-123456789,结果如下:汇编程序代码: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 ENDSSTACKS SEGMENT DB 100 DUP;此处输入堆栈段代码 STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS INPT1 PROC;输入被加数到BUF1按‘+’结束LEA SI,BUF1MOV CX,0 ;CX用来统计输入数的字长IN1:MOV AH, 01H INT 21H CMP AL,'+' JZ BJS1CMP AL,'-'JZ BJS1MOV [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 BLADD AL,AH MOV CL,ALAB1: DEC SI ;AB1--ASCII转换成BCD码MOV AL,[SI] SUB AL,30H DEC SIMOV AH,[SI] SUB AH,30H PUSH CX MOV CL,4 SHL AH,CL POP CXADD AL,AH MOV [DI],AL INC DILOOP AB1;输入加数到BUF2按‘=’结束LEA SI,BUF2MOV 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 BLADD AL,AH MOV CL,ALAB2: DEC SI ;AB2--ASCII转换成BCD码MOV AL,[SI] SUB AL,30H DEC SIMOV AH,[SI] SUB AH,30H PUSH CX MOV CL,4 SHL AH,CL POP CXADD AL,AH MOV [DI],AL INC DI LOOP AB2 RET INPT1 ENDP ;加法子程序JAF PROC CLCMOV CL,m 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 PROCSBB_:MOV AL,1[FHA] CMP AL,2[FHA]JA BDJ1 JZ BZJ1 JMP BBJ ;m=8 ;被加数长度大于加数长度,即被加数大于加数 ;被加数长度等于加数长度,进行大小比较;被加数长度小于加数长度,即被加数小于加数。

微机原理及接口技术实验2多字节加减法

微机原理及接口技术实验2多字节加减法

进位 22
ADD
11
= 未带 33
进位 22
ADC
11
=
已带 34
执行后C标 志不变
执行后C标 志改变
33
22 11
不带进位加 99
11
99
CC 33 AA
33
带进位加 99
1
32
22 11 11 99 34 10
编程提示
CL=0
标志位清0
CL3
SI 1000H
AL [SI] CL不为0
关键点 进位标志 十进制调整 分支程序
数据存放位置
1000H
11
1001H
22
1002H
33
1003H
99
1004H
11
1005H
99
1006H
1007H
1008H
1009H
100AH
被加数 加数
和 进位
第一个字节相加
进位 11
+
99
= 无 AA
DAA 调整
进位 11

+
99
= 有 10
第二个字节相加
XOR AX,AX
MOV CL,3
MOV SI,1000H
LP1: MOV AL,[SI]
MOV BL,[SI+3]
ADC AL,BL
DAA
MOV [SI+6],AL
INC SI
DEC CL
JNZ LP1 JNC LP2 MOV AL,1 MOV [SI+6],AL JMP LP3 LP2: MOV AL,0 MOV [SI+6],AL LP3: INT 3

实验三、多字节、多进制加减运算实验

实验三、多字节、多进制加减运算实验

实验三、多字节、多进制加减运算实验一、实验目的1.学习多字节压缩BCD码加减法运算的程序设计2.学习单字节有符号数加减运算的程序设计二、实验要求1.编写通用4字节压缩BCD码的加、减法运算程序2.编写通用单字节有符号二进制数加、减法运算程序三、实验原理对于简单的8位加减可以直接调用指令就可以了。

例如加法可以使用指令ADD以及带进位加ADDC,但单字节加减法只能在256之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数据。

该实验介绍单片机BCD码多字节加、减运算通用程序的设计。

1.多字节无符号压缩BCD码加法运算假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计算结果的地址于被加数相同。

◆入口参数:R0:被加数地址指针;R1:加数地址指针;len:字节数。

◆出口参数:@R0:计算结果;rLen:计算结果字节数。

◆使用资源:ACC,R0、R1,内部RAM单元len、rlen及存放被加数、加数、计算结果的内存单元。

示例程序如下:ADDl: PUSH PSW ;保护标志寄存器内容CLR C ;进位位清0MOV rlen,#00H ;和的字节数先清0ADD: MOV A,@R0 ;取被加数ADD A,@R1 ;求和DA A ;十进制调整MOV @R0,A ;保存INC R0 ;地址增1INC R1INC rlen ;字节数增1DJNZ len,ADD ;所有字节未加完继续,否则向下执行JNC ADD20 ;和的最高字节无进位转ADD20MOV @R0,#01H ;和的最高字节地址内容为01HINC rlenADD20: POP PSWRETEND多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD码,最大不超过99,而99+99+1(进位)=199,此时不需要使用ADDC指令,但当两字节当最低两字节相加后,必须使用“DA A”进行十进制调整,调整后产生进位。

汇编语言多字节BCD码加法减法

汇编语言多字节BCD码加法减法

汇编语言多字节BCD码加法减法(1)标号:BCDA功能:多字节BCD码加法给大家介绍一个单片机汇编语言写的多字节BCD 码加法减法子程序入口条件:字节数在R7 中,被加数在[R0]中,加数在[R1]中。

出口信息:和在[R0]中,最高位进位在CY 中。

影响资源:PSW、A、R2 堆栈需求:2字节BCDA: MOV A,R7 ;取字节数至R2 中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET汇编语言多字节BCD 码加法减法(2)标号:BCDB功能:多字节BCD码减法入口条件:字节数在R7 中,被减数在[R0]中,减数在[R1]中。

出口信息:差在[R0]中,最高位借位在CY 中。

影响资源:PSW、A、R2、R3 堆栈需求:6字节BCDB: LCALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET(3)标号:NEG功能:多字节BCD码取补汇编语言多字节BCD 码加法减法入口条件:字节数在R7 中,操作数在[R0]中。

出口信息:结果仍在[R0]中。

影响资源:PSW、A、R2、R3 堆栈需求:2字节NEG: MOV A,R7 ;取(字节数减一)至R2 中DEC AMOV R2,AMOV A,R0 ;保护指针MOV R3,ANEG0:。

认识实验及多字节加减法程序

认识实验及多字节加减法程序

实验一认识实验及多字节加减法程序一、任务与目的1. 实验任务:(1) 熟悉和掌握MASM汇编程序及TD调试软件的使用;(2) 熟悉代码段、数据段、堆栈段的结构;(3) 掌握8086/8088汇编程序的结构;(4) 掌握多字节加减法程序的编写。

2. 实验目的:(1). 掌握8086/8088汇编程序及调试程序的基本使用方法;(2) 熟悉8086/8088汇编语言编写的基本结构;(3) 熟悉多字节加减算术运算的基本方法。

二、原理(条件)1.相关知识:(1) MASM汇编程序及TD调试软件的使用方法;(2) 8086/8088汇编程序结构及算术运算等相关指令。

2.实验条件:MASM汇编程序及TD调试软件。

三、内容步骤1.启动TD(Turbo Debugger)输入程序段,观察执行情况并分析结果:(1) MOV BL,08HMOV CL,BLMOV AX,03FFHMOV BX,AXMOV [0200H],BXMOV ES:[0300H],AX(2) MOV AX,0A268HMOV SI,9D1CHADD AX,SIAX= 3F84 CF= 1 AF= 1 ZF= 0 PF= 1 OF= 1 SF= 0 ADD AL,30HAX= 3FB4 CF= 0 AF= 0 ZF= 0 PF= 1 OF= 0 SF= 1 ADC AX,0FFFFHAX= 3FB3 CF= 1 AF= 1 ZF= 0 PF= 0 OF= 0 SF= 0 (3) 输入程序段,分步运行:MOV AX,0102HMOV BX,0304HMOV CX,0506HMOV DX,0708HPUSH AXPUSH BXPUSH CXPUSH DXPOP DXPOP CXPOP BXPOP AX2.编写多字节加/减汇编程序,观察执行情况并分析结果:利用MASM宏汇编程序及TD程序进行调试。

(1)编写多字节加法汇编程序:B6XX4F7C341FH + 2457FD9A6813H=?其中XX为组号。

汇编语言程序设计之多字节加减法程序

汇编语言程序设计之多字节加减法程序

汇编语⾔程序设计之多字节加减法程序多字节加减法程序编写多字节加/减汇编程序,观察执⾏情况并分析结果,利⽤MASM宏汇编程序及TD程序进⾏调试。

题⽬描述编写多字节加法汇编程序:112233445566H + AA9988776655H=?参考代码DATA变量定义两个相加数(BUFFER1与BUFFER2)的时候,需要注意的是应该从后往前赋值DATA SEGMENTBUFFER1 DB 66H, 55H, 44H, 33H, 22H, 11HBUFFER2 DB 55H, 66H, 77H, 88H, 99H,0AAHSUM DB 7 DUP(0)CONT DB 3DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,OFFSET BUFFER1MOV DI,OFFSET BUFFER2MOV BX,OFFSET SUMMOV CL,CONTMOV CH,0CLCGOON: MOV AX,[SI]ADC AX,[DI] ;将“ADC”改为“ SBB” 即为多字节减法程序INC SIINC SIINC DIINC DIMOV [BX],AXINC BXINC BXDEC CLJNE GOONMOV AH,4CHINT 21HCODE ENDSEND START如果要执⾏减法操作,则将“ADC”改为“ SBB” 即为多字节减法程序程序分析先来看⼀下这两个⼗六进制数的相加的正确结果是多少吧:112233445566H + AA9988776655H = ?这样便于我们去验证程序的正确性:下⾯我们进⼊TD⼀步步分析程序。

⾸先找到DS段,找到两个待加数:把两个待加数的低位的偏移地址取到:BX⾥存放结果的偏移地址,CL⾥存放循环次数,12位六进制需要循环3次:进⼊主程序,取BUFFER1的低4位放⼊AX:将BUFFER2的低4位与AX相加(相当于与BUFFER1的低4位相加),并把结果存⼊AX:增加两个待加数的偏移地址,即取下4位:把运算结果保存到SUM⾥,此时SUM的低4位保存了运⾏结果,为了保存下⼀个运算结果,要使其偏移地址指向下4位:⼀次循环结束,外循环次数减1:判断循环是否结束,循环未结束则继续执⾏主程序:如此往复循环,直⾄CL的值为0,此时运算结果为BBBBBBBBBBBBH,与实际结果⼀致,故程序正确:。

单片机实验一 多字节十进制加法程序设计

单片机实验一 多字节十进制加法程序设计

实验一多字节十进制加法程序设计
一.实验目的:
1.熟悉仿真器的软件使用环境及单片机汇编语言编程;
2.掌握多字节十进制加法的程序设计及实现方法。

二.实验内容:
编写多字节十进制加法程序,实现下式运算:
4574+6728=11302
要求:被加数在片内RAM区20H、21H单元;分别为学号(7),学号+1(8);
加数在片内RAM区30H、31H单元;分别为学号+2(9),学号+3(10);
结果在片内RAM区20H(最高位进位)、21H(高位)、22H(低位)单元。

三.实验步骤:
1.开机启动Keil C51软件进入μVision2 集成开发环境,确认89C51处于软件仿真状态。

2.完成程序的设计、编辑、编译、连接。

3.进入DEBUG方式,打开存储器Memory 1窗口,在窗口Address栏键入D:20H;点击鼠标右键,选择最后一项Modify Memory ,输入被加数;在窗口Address 栏键入D:30H;点击鼠标右键,选择最后一项Modify Memory ,输入加数。

4.调试和运行程序并记录存储器Memory 1窗口实验结果。

四.实验程序:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV A,20H
ADD A,30H
DA A
MOV 22H,A
MOV A,21H
ADDC A,31H
DA A
MOV 21H,A
CLR A
MOV R3,00H
ADDC A,R3
MOV 20H,A
END
五.实验截图:。

实验四无符号多字节加法

实验四无符号多字节加法

实验四无符号多字节加法一.实验目的1.掌握MCS-51汇编语言程序设计和调试方法;2.掌握ME-5103在线仿真器的程序设计和调试方法;3.熟悉用IBM-PC交叉汇编和调试软件MBUG机器汇编及调试。

二.实验设备1.ME-5103在线仿真器1台;2.IBM-PC微机1台;3.直流稳压电源1台。

三.实验内容1.编写三字节无符号加法程序,加数693B68H放在52H,51H,50H,被加数3AE409H 放在42H,41H,40H,“和”放在42H,41H,40H。

2.程序结构采用主程序和子程序结构主程序用R0,R1作指针,R7作为加法字节计数值N,本实验N=3;子程序完成一个字节的加法。

3.用文本编辑软件如EDIT编写源程序,用IBM-PC交叉汇编和调试软件MBUG对程序进行汇编,产生目标代码文件,文件的类别为HEX及调试。

4.参考程序主程序地址机器码源程序注释ORG 0000H0000 0130 START: AJMP MAIN ;转入程序… …ORG 0030H0030 7840 MAIN: MOV R0,#40H ;指向低字节0032 7950 MOV R1,#50H0034 7F03 MOV R7,#03HCLR C ;清进位位LOOP: ACALL ADDSUB ;调用字节加法子程序DJNZ R7,LOOPHERE: AJMP HERE ;程序结束子程序ADDSUB:MOV A,@R0 ;取被加数ADDC A,@R1 ;A和加数相加MOV @R0,A ;保存和INC R0 ;指针加1INC R1RET ;返回5.用IBM-PC软件MBUG和仿真机联机调试用单步执行或断点连续执行,记下执行指令后表格中相应寄存器的数值:一.实验报告1.写出本程序调试过程和运行结果.2.本程序如修改为无符号十进制数相加,增加DAA指令,在何地方?修改后用BCD 码135790和246801相加,写出调试过程和运行结果.。

汇编实验——精选推荐

汇编实验——精选推荐

实验一二进制加、减法编程实验(设计性实验)一、实验要求和目的1.熟悉汇编语言二进制多字节加法基本指令的使用方法;2.熟悉汇编语言二进制多字节减法基本指令的使用方法;3.掌握汇编语言编程的一般结构。

四、实验内容与步骤1、实验内容(1)编写程序,实现长度为2字的两个多精度数相减。

(2)编写程序,实现一个长度为3字的多精度数和一个长度为2字的多精度数相加减。

2、实验步骤(1)预习多精度数加减法基本知识,根据实验内容,画出流程图;(2)利用EDIT或其他编辑软件,编写汇编源程序,取名为“ch2ex1.ASM”、“ch2ex2.ASM”。

(3)汇编、连接该源程序,产生“ch2ex1.EXE”、“ch2ex2.EXE”文件;(4)对“ch2ex1.EXE”和“ch2ex2.EXE”文件进行调试运行:利用DEBUG的T命令或G 命令和D命令查看数据区的加减法结果是否正确。

流程图实验程序:DA TA SEGMENT ;数据段开始DA TA1 DW 5311H,8A13HDA TA2 DW 4783H,9526HRESULT DW 2 DUP(?) ;存放多字减法的结果DA TA ENDS ;数据段结束CODE SEGMENT ;代码段开始ASSUME CS:CODE,DS:DA TASTART:MOV AX,DA TA;DA TA地址存入DSMOV DS,AXMOV AX,DA TA1+2 ;高八位MOV DX,DA TA1 ;低八位SUB DX,DA TA2 ;低字相减SBB AX,DA TA2+2 ;高字借位相减MOV RESULT+2,AX ;存结果MOV RESULT,DXCODE ENDS ;代码段结束END START实验流程图:实验程序:DA TA SEGMENTDA TA1 DW 7123H,7311H,8A13H ;表示数据8al73117123h DA TA2 DW 9783H,9526H ;表示数据95269783hRESULT2 DW 3 DUP(?) ;存放多字节减法的结果DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DA TA;DA TA地址存在DS中MOV DS,AXMOV AX,DA TA1 ;低字MOV DX,DA TA1+2 ;高字MOV DX,DA TA1+4MOV AX,DA TA1MOV DX,DA TA1+2SUB AX,DA TA2SBB DX,DA TA2+2MOV RESULT2,AXMOV RESULT2+2,DXMOV DX,DA TA1+4SBB DX,0MOV RESULT2+4,DXCODE ENDSEND START实验二十进制数的BCD加、减法编程实验一、实验要求和目的1.熟悉BCD码的基本知识2.熟悉汇编语言BCD码多字节加减法基本指令的使用方法;3.掌握BCD码调整指令的使用方法。

实验七 无符号多字节加减法

实验七 无符号多字节加减法

实验七无符号多字节加/减法一、实验目的1、掌握多字节加减运算的设计方法;2、进一步熟悉调试程序的方法。

二、实验仪器1、DVCC-598JH单片开发机一台;2、WD-5型直流稳压源一台。

三、实验预习1、认真阅读实验指导书有关内容,明确实验目的、内容和操作步骤;2、对实验中的程序和指令进行手工汇编;3、复习实验中相关指令的功能。

四、实验内容程序一:多字节无符号数加法已知被加数首地址由R0指出,加数首地址由R1指出,字节数由R2指出,数据的存放方式以低位字节在前,高位字节在后。

参考程序:ORG 4000HCLR CLOOP:MOV A,@R0ADDC A,@R1MOV @R0,AINC R0INC R1DJNZ R2,LOOPJNC NEXTMOV @R0,#01HSJMP $NEXT:MOV @R0,#00HSJMP $END程序二:多字节无符号减法在片内RAM40H~42H单元存入3字节的被减数(低位在前),在50H~52H 单元存入3字节的减数(低位在前),求这两个数的差,并将结果存入片外RAM 5000H为起始地址的单元中(低位在前)。

参考程序:ORG 2000HMOV R0,#40HMOV R1,#50HMOV DPTR,#5000HMOV R7,#03HCLR CLOOP:MOV A,@R0SUBB A,@R1MOVX @DPTR,AINC R0INC R1INC DPTRDJNZ R7,LOOPSJMP $END五、实验步骤1、认真阅读实验参考程序并分析程序运行后的理论结果;2、输入程序并检查输入是否正确;3、根据已知条件输入程序执行前的原始数据;4、执行程序,检查并记录结果六、练习1、如何将程序一改成多字节的十进制加法程序。

2、设三字节BCD码的被减数及减数由高位到低位存放在片内RAM中,它们的首地址分别为10H和20H,要求将其差值存放到30H为首地址的单元中。

试编写该程序。

七、实验报告1、整理记录结果,并与理论结果进行比较;2、调试过程及体会;3、总结多字节加/减法程序设计思想;4、试说明DA A指令进行十进制调整的过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档