汇编 多字节加法

合集下载

汇编语言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

实验二无符号数多字节十进制数加法实验

实验二无符号数多字节十进制数加法实验

实验二无符号数多字节十进制数加法实验一、实验目的1.进一步掌握51系列单片机的仿真调试软件伟福V2.50软件模拟器的使用方法。

2.进一步练习程序的录入修改编译方法。

3.进一步练习程序的调试方法。

4.对程序进行仿真运行。

二、实验设备1.PC机(WINDOWS操作系统)。

2.HF-MC01实验实训开发综合装置。

3.伟福6000软件模拟器。

三、实验内容1.用汇编语言编写4字节无符号十进制数加法程序,被加数36101985放入(43H)--(40H)单元中。

加数12663459放入(53H)--(50H)单元。

2.编写主程序,分别用R0和R1作数区指针,R0指向被加数,并兼作"和"的指针。

R1指向加数,字节数存放到R2中作计数初值。

3.编写加法子程序,子程序适用于n字节的加法,只要在主程序中改变R2的初值即可。

四、实验步骤1.编写源程序按实验内容要求编写源程序(可参考实程序SY2.ASM)。

2.录入源程序录入步骤为:运行WAVE- 文件- 新建文件-录入程序- 保存-SY2.ASM(或关闭窗口- SY2.ASM- 保存)(注意:保存文件时必须加上扩展名.ASM)。

3.对编写的文件(SY2.ASM)进行编译编译步骤为:项目- 全部编译此时,系统将弹出‘信息窗口’;若编译完成,将显示生成的两个文件SY2.HEX和SY2.BIN,关闭‘信息窗口’。

若编译有错误,则在‘信息窗口’中出现错误提示;修改后再行编译。

4.执行及调试程序a. 点击执行- 复位:使程序执行指针指向第一条指令(CPU窗口指向0000H)。

b.为执行加法计算,进行仿真调试;运行程序前要分别把被加数(36101985)写入(43H)(最高位), (42H),(41H), (40H)(最低位)单元,加数(12663459)写入(53H)(最高位),(52H),(51H),(50H)(最低位)单元中。

c.装入的方法步骤:点击窗口- 数据窗口- DATA: 可以观看片内RAM 00H 到 FFH 中的内容。

实验四无符号多字节加法

实验四无符号多字节加法

实验四无符号多字节加法一.实验目的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相加,写出调试过程和运行结果.。

单片机实验多字节加减法

单片机实验多字节加减法

实验二实现多字节加(减)法一、 实验目的: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进行单步运行。

多字节、多进制加法运算实验报告

多字节、多进制加法运算实验报告

多字节、多进制加减运算学生:何绍金学号:201203870408专业班级:自动化1202指导老师:杨东勇2014年12月一、实验目的1.学习多字节压缩 BCD 码加减法运算的程序设计;2.学习单字节有符号数加减运算的程序设计。

二、实验设备统一电子开发平台三、实验要求1.编写通用 4 字节压缩 BCD 码的加、减法运算程序;2.编写通用单字节有符号二进制数加、减法运算程序;四、实验原理(单字节带符号数加法运算)对于简单的8 位加减可以直接调用指令就可以了。

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

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

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

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

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

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

示例程序如下:;多字节无符号压缩BCD 码加法运算rlen data 30h; 存放计算结果字节数len data 31h; 存放相加字节数; r0 定位40h,r1 定位50h; 此处的程序的问题是前面字节的进位没有处理,; 只是对最后字节相加处理了进位ORG 0000h;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”进行十进制调整,调整后产生进位。

汇编语言 加法指令

汇编语言 加法指令
时,要把进位标志CF的现行值加上去,结果送至目的操作数。 ADC指令影响所有标志位CF、DF、PF、SF、ZF和AF。 ADC指令主要用于多字节运算中。若有两个4字节的数,已 分别放在自FIRST和SECOND开始的存储区中,每个数占4 个存储单元。存放时,最低字节在地址最低处,则可用以下 程序段实现相加。
例题
计算13579BDF H+02468ACE H的值 MOV DX,1357 H MOV AX,9BDF H MOV AX,8ACE H CF=1,(AX)=26ADH MOV DX,0246 H (DX)=159H
3. 加1指令INC
格式:INC OPRD 功能: OPRDOPRD
说明:完成对指定的操作数OPRD加1,然后返回此 操作数。此指令主要用于在循环程序中修改地址指 针和循环次数等。INC指令执行的结果不影响CF位, 而对其他5个标志位AF、OF、PF、SF和ZF有影响。
1、加法指令ADD 2、加进位的加法指令ADC 3、加1指令INC
1. 加法指令ADD
格式:ADD OPRD1,OPRD2 功能:OPRD1OPRD1+OPRD2
说明:完成两个操作数的相加,结果送至目 的操作数OPRD1。其中目的操作数可以是 累加器,通用寄存器及存储器操作数。 ADD指令影响所有标志位CF、DF、PF、 SF、ZF和AF。
例题
MOV AL,-2 ADD AL,1 ADD AL,1 ADC AL,4 MOV AL,-2 ADD AL,1 INC AL ADC AL,4
(AL)=-2 (AL)=-1,CF=0 (AL)=0,CF=1 (AL)=5,CF=0 (AL)=-2 (AL)=-1,CF=0 (AL)=0,CF=0 (AL)=4,CF=0

多字节加法多字节乘法

多字节加法多字节乘法

多字节无符号数加法实验报告
通信二班张晓宇 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位无符号整数减法程序。

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

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

汇编语⾔程序设计之多字节加减法程序多字节加减法程序编写多字节加/减汇编程序,观察执⾏情况并分析结果,利⽤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,与实际结果⼀致,故程序正确:。

双字节十六进制数加法程序设计汇编

双字节十六进制数加法程序设计汇编

双字节十六进制数加法程序设计汇编在计算机科学中,汇编语言是一种低级编程语言,用于将机器指令直接翻译为计算机可以执行的指令。

而双字节十六进制数加法程序设计是汇编语言中的一个常见问题,本文将介绍如何使用汇编语言来实现这个功能。

我们需要了解一些基本概念。

在计算机系统中,数据存储以字节为单位,每个字节由8个二进制位组成。

十六进制数是一种表示二进制数的方式,每个十六进制数位对应于4个二进制位。

双字节表示两个字节,即16个二进制位,可以用4个十六进制数表示。

在进行双字节十六进制数加法时,我们需要将两个双字节数的每个对应位进行相加,并处理进位。

具体的实现步骤如下:1. 首先,我们需要定义两个双字节数的存储位置。

可以使用寄存器或内存来存储这些数据。

在汇编语言中,我们可以使用MOV指令将数据加载到寄存器中。

2. 然后,我们可以使用ADD指令将两个双字节数的对应位相加,并将结果保存到一个新的存储位置。

在这个过程中,我们需要处理进位。

可以使用ADC指令来处理进位,该指令会将前一次运算的进位结果作为输入。

3. 最后,我们可以将结果存储到指定的位置,并进行后续的处理。

可以使用MOV指令将结果存储到寄存器或内存中。

下面是一个使用汇编语言实现双字节十六进制数加法的示例代码:```assemblysection .datanum1 dw 0x1234 ; 第一个双字节数num2 dw 0x5678 ; 第二个双字节数result dw 0 ; 结果存储位置section .textglobal _start_start:; 将第一个双字节数加载到寄存器中mov ax, [num1]; 将第二个双字节数加载到寄存器中mov bx, [num2]; 将两个双字节数相加,并处理进位add ax, bxadc dx, 0; 将结果存储到指定位置mov [result], ax; 结束程序mov eax, 1xor ebx, ebxint 0x80```在上述示例代码中,我们使用了汇编语言的一些常见指令,如MOV、ADD、ADC等。

微机原理及其接口实验报告--两个多字节数相加

微机原理及其接口实验报告--两个多字节数相加

两个多字节数相加一.实验目的1.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。

2.熟悉和掌握用DEBUG调试程序的方法。

二.实验内容将两个多字节数相加,要求加数和被加数分别存放在num1和num2为首的内存单元中。

结果送回num1处。

三.实验步骤1.生成可执行文件。

输入 SUM.ASM SUM.OBJ SUM.EXEedit MASM LINK DEBUG2.汇编源程序DATA SEGMENTNUM1 DB 1H,2H,3H,0NUM2 DB 4H,5H,6HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXCLCLEA BX,NUM1LEA SI,NUM2MOV CX,3LL:MOV AL,[SI]ADC [BX],ALINC BXINC SILOOP LLMOV AL,0ADC AL,0MOV [BX],ALMOV AH,4CHINT 21HCODE ENDSEND START3.在DEBUG下使用DEBUG命令调试程序。

-N SUM.EXE (指定sum.exe文件)-L (从磁盘读sum.exe)-U (反汇编)记录源程序的首地址为0BC6:0000,NUM1和NUM2的首地址分别为0BC5:0000, 0BC5:0004。

如图所示:-G=0BC6:0000 0BC6:001F (使用G命令执行程序)-D OBC5:0000 (显示内存单元的内容)四.心得体会在做实验之前,尽量把源程序看懂,结合书去看。

在实验进行时,对于一些数据作修改,进行调试能够更好的理解程序所执行的内容。

经过这次试验,自己对运用MASM软件进行简单的debug指令操作有了进一步的理解和认识。

汇编语言多字节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:。

汇编中 ADD 和ADDC 的理解

汇编中 ADD 和ADDC 的理解

汇编中ADD 和ADDC 的理解书上讲到ADDC 指令会加上进位标志位CY,可以方便的进行多字节数连加运算。

我想想,比如两个数用ADDC 相加有溢出,CY 置1 了,最后岂不是比正确的结果多了1?百思不得其解终于在百度上看到一个很好的回答(复制自百度知道):ADD 两数相加,不加进位位。

ADDC 两数相加,同时再加个进位位。

进位当时为1 就加1 为0 就加0 相当于不加一般用在多字节数相加中。

最低位相加,用ADD ,加完后,可能产生进位,高字节相加就用ADDC 这样,低字节相加产生的进位就会被加进来。

比如0080H + 0180H 低字节相加用ADD 80H+80H=100H 用ADD 指令得到00H 并溢出产生进位C=1 高字节相加用ADDC 00H+01H=01H 用ADDC 指令两数相加结果01H 会再加上进位位 1 得到02H 0080H+0180H = 02 00H 再比如0080H + 0101H 80H+01H = 81H 没有溢出进位为C=0 00H+01H =01H 用ADDC 指令会再加进位位C=0 得到01H 结果0080H+0101H = 0181H 原来ADDC 指令用于8 位以上的数相加,而且要把低8 位先分解出来,用ADD 先进行运算,这时候的CY 会影响高于8 位的运算,要考虑进去,此时再用ADDC,把CY 也考虑进去,算出高位的结果,再组合起来。

原来如此。

不过据自己了解,16 位数据的操作,只能用DPTR,难倒结果要存在这里?噢,忘了可拆分保存在Rn 里面了还有关于ADD 对OV 标志位的影响,我也不大明白。

书中说的是,和第六,第七位成异或关系(最低位是0),这两位同时有、无进位,则OV 清0;若这两位一个有进位,一个没有,则OV 置1。

我也想了很久:发现这个问题,貌似挺复杂的:首先假定最高位作为符号位,那么能够表示数字的剩下7 位,也就是2 的7 次方:正负128。

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

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

实验一认识实验及多字节加减法程序一、任务与目的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为组号。

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

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

实验一多字节十进制加法程序设计
一.实验目的:
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
五.实验截图:。

多字节加法

多字节加法

一、源程序及注释DATA SEGMENT ;“DATA”逻辑段开始DATA1 DB 0F8H,60H,0ACH,74H,3BH ;将被加数存入DATA1单元DATA2 DB 0C1H,36H,9EH,0D5H,20H ;将加数存入DATA2单元 DATA3 DB 5 DUP(??) ;DATA3预留5个字节的存储空间DATA ENDS ;“DATA”逻辑段结束CODE SEGMENT ;“CODE”逻辑段开始ASSUME DS:DATA,CS:CODE ;定义"CODE"代码段,"DATA"数据段START: MOV AX,DATAMOV DS,AX ;将“DATA”的地址传给DS段寄存器MOV CX,5 ;设置循环次数为5MOV SI,0 ;置位移量初值为0CLC ;清进位LOOPER: MOV AL,DATA2[SI] ;取一个加数存入ALMOV BL,DATA1[SI] ;取一个被加数存入BLADC BL,AL ;两数相加结果存入BLMOV DATA3[SI],BL ;将结果存入DATA3INC SI ;位移量加1DEC CX ;循环次数减1JNZ LOOPER;加完否,若没完,跳转到LOPPER,继续相加 MOV AH,4CHINT 21H ;返回DOS操作系统CODE ENDS ;段名为"CODE"的逻辑段结束END START ;源程序结束二、单步运行1、循环前将被加数、加数由低位到高位分别存入DATA1、DATA2单元2、第一次循环将加数的最低的一个字节存入AL将被加数最低的一个字节存入BL将AL与BL中的数据相加,结果存入BL中将结果存入DATA3的第一个单元中CX=04H即剩余循环次数为4,不等于0,跳转到LOOPER处继续执行,即进入第二次循环。

重复以上循环,直到CX=00H,跳出循环,直接执行下一条指令最终结果为5C4A4A97B9H。

汇编多位数相加

汇编多位数相加

汇编多位数相加上⼀次汇编写到,只是个位数的简单相加,只需要判断两者相加有⽆进位,进位即进⼀,在输出窗⼝输出⼀先。

遇到多位数后,会变复杂很多,事实上汇编⾥⾯可以实现相加,难题在于需要把和转成ASCII码显⽰在dos窗⼝。

所以需要把和⼀个⼀个数提取,转成ASCII。

程序如下:DATAS SEGMENTOP1 DW 255OP2 DW 366RESULT DW 10 DUP(?) 定义⼀个RESULT数组,长度为10个字节DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,OP1ADD AX,OP2 OP1和OP2相加后附加到AXMOV BX,0MOV CL,10 将10附加到CLSS1:DIV CL AX除以10ADD AH,30H 余数转为ASCII码,MOV SI, OFFSET RESULT 保存到RESULT数组。

MOV [SI+BX],AH 商取代结果INC BX BX递增MOV AH,0 将AH清空,以便将下⼀次的商附加进去CMP AL,0 ⽐较余数是否零,是则跳出循环JNZ SS1SS2:DEC BX BX递减MOV DX,[SI+BX] 将RESULT数组从最⾼位开始附加到DXMOV AH,2 字符串输出INT 21HCMP BX,0 判断BX是否为零,是则跳出JNZ SS2MOV AH,4CHINT 21HCODES ENDSEND START 正常结束程序程序的思想有点像进制转换,要把数字⼀个⼀个从和中提取,由于是⼗进制,可以将和除以10,所得的余数依次为个位开始的数字,最后,只需要把数字存⼊数组,⽤栈式的读取,最后存的先读,为最⾼位,转成ASCII码,输出。

个位数相加当然也可以⽤这种⽅法,但是没必要这么复杂。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;************************************************** ********************; input beijianshu: TempRam1, TempRam2 TempRam3 ; jiashu: TempRam4,TempRam5,TempRam6; output:; TempRam1, TempRam2 TempRam3;************************************************** ********************_Sub3_3:clr cmov A,TempRam3s ubb A,TempRam6m ov TempRam3,Amov A,TempRam2subb A,TempRam5mov TempRam2,Am ov A,TempRam1subb A,TempRam4mov TempRam1,Aret;************************************************** ********************; input TempRam2, TempRam3 TempRam4, TempRam5, TempRam6; TempRam11,TempRam12,TempRam13; output:; yushu: TempRam1, TempRam2, TempRam3; shan: TempRam4, TempRam5, TempRam6; Need: buffer0,buffer1,buffer2,buffer3;************************************************** ********************_Div6_3:m ov TempRam1,#00Hm ov Buffer3,#24J mp _Div6_3Loop_Div4_2:m ov TempRam1,#00Hm ov TempRam2,#00Hm ov TempRam11,#00Hm ov Buffer3,#24_Div6_3Loop:c lr Cmov A,TempRam6rlc Amov TempRam6,Amov A,TempRam5rlc Amov TempRam5,Amov A,TempRam4 rlc Amov TempRam4,Amov A,TempRam3rlc Amov TempRam3,Amov A,TempRam2rlc Amov TempRam2,Amov A,TempRam1rlc Amov TempRam1,Aclr cmov A,TempRam3subb A,TempRam13mov Buffer2,Amov A,TempRam2subb A,TempRam12mov Buffer1,Amov A,TempRam1subb A,TempRam11mov Buffer0,Ajc_Div6_3Loop1mov TempRam1,Buffer0mov TempRam2,Buffer1mov TempRam3,Buffer2inc TempRam6_Div6_3Loop1:djnz Buffer3,_Div6_3Loopret;**********************************************************************;input : TempRam4,TempRam5, TempRam6; TempRam12,TempRam13;output:TempRam1,TempRam2,TempRam3,TempRam4,TempRam5,TempRam6;Need : buffer0 ,buffer1 ,buffer2,buffer3,buffer4,buffer5,B uffer6;************************************************** ********************_Mul3_2:mov Buffer0,#00Hmov Buffer1,#00Hmov Buffer2,#00Hmov Buffer3,TempRam4mov Buffer4,TempRam5mov Buffer5,TempRam6mov TempRam1,#00Hmov TempRam2,#00Hmov TempRam3,#00Hmov TempRam4,#00Hmov TempRam5,#00Hmov TempRam6,#00Hmov Buffer6,#16_Mul3_2Loop:mov A,TempRam12rrc Amov TempRam12,Amov A,TempRam13rrc Amov TempRam13,Ajnc _Mul3_2Loop1mov A,Buffer5add A,TempRam6 mov TempRam6,Amov A,Buffer4addc A,TempRam5 mov TempRam5,Amov A,Buffer3addc A,TempRam4 mov TempRam4,Amov A,Buffer2addc A,TempRam3 mov TempRam3,Amov A,Buffer1addc A,TempRam2 mov TempRam2,Amov A,Buffer0addc A,TempRam1 mov TempRam1,A_Mul3_2Loop1:clr cmov A,Buffer5rlc Amov Buffer5,Amov A,Buffer4rlc Amov Buffer4,Amov A,Buffer3rlc Amov Buffer3,Amov A,Buffer2rlc Amov Buffer2,Amov A,Buffer1rlc Amov Buffer1,Amov A,Buffer0rlc Amov Buffer0,Adjnz Buffer6,_Mul3_2Loopret;************************************************** ********************; change to BCD code; input : TempRam11,TempRam12 ,TempRam13; Output:TempRam1,TempRam2, TempRam3 ,TempRam4 ,TempRam5 ,TempRam6; need: Buffer0,Buffer1,Buffer2 Buffer4 Buffer5;**********************************************************************_Ftob:mov TempRam1,#00Hmov TempRam2,#00Hmov TempRam3,#00Hmov TempRam4,#00Hmov TempRam5,#00Hmov TempRam6,#00Hmov Buffer0,#01Hmov Buffer1,#86Hmov Buffer2,#0A0HSub100KLoop:clr cmov A,TempRam13subb A,Buffer2mov Buffer5,Amov A,TempRam12subb A,Buffer1mov Buffer4,Amov A,TempRam11subb A,Buffer0jc Sub10Kmov TempRam11,Amov TempRam12,Buffer4mov TempRam13,Buffer5inc TempRam1JMP Sub100KLoopSub10K:mov Buffer0,#00hmov Buffer1,#27hmov Buffer2,#10hSub10kLoop:clr cmov A,TempRam13subb A,Buffer2mov Buffer5,Amov A,TempRam12subb A,Buffer1mov Buffer4,Amov A,TempRam11subb A,Buffer0jc Sub1Kmov TempRam11,Amov TempRam12,Buffer4mov TempRam13,Buffer5inc TempRam2Jmp Sub10kLoopSub1k:mov Buffer0,#03Hmov B uffer1,#0E8HSub1kLoop:clr cmov A,TempRam13subb A,Buffer1mov Buffer2,Amov A,TempRam12subb A,Buffer0jc Sub100mov TempRam12,Amov TempRam13,Buffer2inc TempRam3Jmp Sub1kLoopSub100:mov Buffer0,#00hmov Buffer1,#64hSub100Loop:clr cmov A,TempRam13subb A,Buffer1mov Buffer2,Amov A,TempRam12subb A,Buffer0jc Sub10mov TempRam12,Amov TempRam13,Buffer2inc TempRam4Jmp Sub100Loopsub10:mov Buffer1,#10sub10Loop:clr cmov A,TempRam13subb A,Buffer1jc Sub1mov TempRam13,Ainc TempRam5Jmp Sub10Loopsub1:mov TempRam6,TempRam13ret;************************************************** ********************; Beiqushu:TempRam6 qushu:TempRam13; shan:TempRam6 yushu:TempRam5; temp:Buffer0;************************************************** ********************_Div:mov TempRam5,#00Hmov Buffer0,#8_Div_loop:clr Cmov A,TempRam6rlc Amov TempRam6,Amov A,TempRam5rlc Amov TempRam5,Aclr cmov A,TempRam5subb A,TempRam13jc_Div_Loop1mov TempRam5,Ainc TempRam6_Div_Loop1:djnz Buffer0,_Div_Loopret;************************************************** ********************; BCD code change to; input: BtoFH BtoFL;output: BtoFH BtoFL;************************************************** ********************_BtoF:mov TempRam6,BtoFLmov TempRam13,#16call_Divmov BtoFL,TempRam5 ;余数为低4bit,表示个位mov TempRam4,#00Hmov TempRam5,#00Hmov TempRam12,#00Hmov TempRam13,#10 ;商为高4bit,表示十位call_Mul3_2mov A,TempRam6add A,BtoFLmov BtoFL,Amov TempRam6,BtoFH ;先将高字节转为16进制mov TempRam13,#16call_Divmov BtoFH,TempRam5mov TempRam4,#00Hmov TempRam5,#00Hmov TempRam12,#00Hmov TempRam13,#10call_Mul3_2mov A,BtoFHadd A,TempRam6mov TempRam6,Amov TempRam4,#00H ;因高字节表示有多少个"100"mov TempRam5,#00Hmov TempRam12,#00Hmov TempRam13,#100call_Mul3_2mov BtoFH,TempRam5mov A,TempRam6add A,BtoFLmov BtoFL,Amov A,#0addc A,BtoFHmov BtoFH,Aret;**********************************************************************; input beichushu: TempRam1,TempRam2, TempRam3 TempRam4, TempRam5,; TempRam6,TempRam7,TempRam8; chushu: TempRam10,TempRam11,TempRam12,TempRam13; output yushu: TempRam1, TempRam2,TempRam3 ,TempRam4; shang: TempRam5, TempRam6,TempRam7,TempRam8; Need: buffer0,buffer1,buffer2,buffer3,Buffer4;**********************************************************************_Div8_4:mov TempRam1,#00Hmov TempRam2,#00Hmov Buffer4,#32_Div8_4Loop:clr Cmov A,TempRam8rlc Amov TempRam8,Amov A,TempRam7 rlc Amov TempRam7,Amov A,TempRam6 rlc Amov TempRam6,Amov A,TempRam5 rlc Amov TempRam5,Amov A,TempRam4 rlc Amov TempRam4,Amov A,TempRam3 rlc Amov TempRam3,Amov A,TempRam2 rlc Amov TempRam2,Amov A,TempRam1 rlc Amov TempRam1,Aclr cmov A,TempRam4subb A,TempRam13mov Buffer3,Amov A,TempRam3subb A,TempRam12mov Buffer2,Amov A,TempRam2subb A,TempRam11mov Buffer1,Amov A,TempRam1subb A,TempRam10mov Buffer0,Ajc_Div8_4Loop1mov TempRam1,Buffer0mov TempRam2, Buffer1mov TempRam3, Buffer2mov TempRam4, Buffer3inc TempRam8_Div8_4Loop1:djnz Buffer4,_Div8_4Loopret;************************************************** *******************************_Neg3:jnc _Neg3_Loopmov A,TempRam3cpl Aadd A,#1mov TempRam3,Amov A,TempRam2cpl Aaddc A,#0mov TempRam2,Amov A,TempRam1cpl Aaddc A,#0mov TempRam1,A_Neg3_Loop:ret。

相关文档
最新文档