汇编 多字节加法
;************************************************** ********************; 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。
汇编语言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”进行十进制调整,调整后产生进位。
汇编语言 加法指令
例题
计算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_多字节整数加减法
实验二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,与实际结果⼀致,故程序正确:。
