四字节除以三字节无符号数除法程序
第三章 80C51单片机汇编语言程序设计(本科)
ORG START: CLR MOV MOVX MOV INC MOVX SUBB JNC XCH SJMP BIG1: MOVX BIGO: INC MOVX END
8000H C;进位清0 DPTR, #ST1; 设数据指针 A, @DPTR; A←((ST1)),取N1 R2, A; 暂存N1 DPTR; DPTR← ST2(指向N2单元) A, @DPTR; 取N2存于A中 A, R2;N1,N2比较(N2-N1,差在A中) BIG1;N2≥N1,转BIG1,N2<N1,顺序执行 A, R2;N1,N2互换,A ←N1 BIG0 A, @DPTR;A ←N2 DPTR; DPTR← ST3(指向N3单元) @DPTR, A;ST3 ←大数 返回
等、不相等等各种条件判断。
例:两个8位无符号二进制数比较大小。假设在外部RAM中有 ST1、ST2和ST3共3个连续单元(单元地址从小到大),其中ST1
、ST2单元中存放着两个8位无符号二进制数N1,N2,要求找出其
中的大数并存入ST3单元中。
解:(1)分析任务:比较两个数的大小
(2)算法:算术运算、控制转移 (3)程序结构:单分支 (4)数据类型:单字节、二进制、无符号数 (5)数据结构:单元地址升序排列
思考题
3) ORG MOV MOV MOVX ADD MOVX DEC DEC MOVX ADDC 1000H RO, R1, A, A, @R1, R0; R1; A, A, #52H;加数N1的低字节地址送地址指针R0 #55H;加数N2的低字节地址送地址指针R1 @R1; 取N2的低字节 @R0; N1、N2低字节相加 A; 保存N1、N2低字节和 修改加数N1的地址指针内容 修改加数N2的地址指针内容 @R1; 取N2的中间字节 @R0; N1、N2中间字节带低字节和进位相加
实现两个三字节无符号数DATA1和DATA2的相加
(1)目的与要求通过对一个简单程序的编辑、汇编、连接及调试,学习汇编语言程序设计上机操作的基本方法,以及简单分支程序设计的方法,为以后各项实验和实际的程序设计建立基础。
(2)实验内容或题目1验证题对例1给出的程序进行编辑、汇编、连接和调试。
要求通过DEBUG工具检查每一条算术运算指令执行后相关寄存器的内容,检查程序执行前后各变量的内容。
以下程序段用以显示信息“Press any key when you ready.”。
在用户按下任一键后,另起一行显示信息“Input your password:”。
NAME EXAMPLE1_1DSEG SEGMENT use16MESS1 DB ‘Press any key when you ready’,0AH,0DH,‘$’MESS2 DB ‘Input your password:’DSEG ENDS;SSEG SEGMENT STACK use16DB 80H DUP(0)SSEG ENDS;CSEG SEGMENT use16ASSUME DS:DSEG,SS:SSEG,CS:CSEGSTART:MOV AX,DSEGMOV DS,AXMOV DX,OFFSET MESS1MOV AH,09HINT 21H ;显示“press any key when you ready.”MOV AH,08HINT 21H ;等待用户按任一键MOV DX,OFFSET MESS2MOV AH,09HINT 21H ;显示“Input your password:”CSEG ENDSEND START2设计题(1)编写一程序,实现两个三字节无符号数DATA1和DATA2的相加,结果送四字节变量ANS。
上机调试程序,检查执行结果。
(3)实验步骤与源程序两个三字节无符号数DATA1和DATA2的相加,结果送四字节变量ANS:data segmentdata1 db 12h,34h,56hdata2 db 0abh,0cdh,0efhans db 4 dup(?)data endsSSEG SEGMENT STACKDB 80H DUP(0)SSEG ENDScode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov bx,offset ansmov di,offset data1mov si,offset data2mov ax,[di]add ax,[si]mov [bx],axmov ax,[di+2]adc ax,[si+2]mov [bx+2],axmov [bx+3],axmov ax,0adc ax,0mov [bx+3],axmov ah,4chint 21hcode endsend start(4)测试数据与实验结果(可以抓图粘贴)程序运行技术后,进入debug模式下:分别把ans,data1,data2的首地址送给bx,di,si:进行数字相加:最高位有进位:相加的结果为:014601BD《微机原理与接口技术》实验报告- 1 -。
汇编中有符号与无符号数的区分
汇编中有符号与无符号数的区分一、只有一个标准!在汇编语言层面,声明变量的时候,没有signed 和unsignde 之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分有符号还是无符号然后用两个标准来处理,它统统当作有符号的!并且统统汇编成补码!也就是说,db -20 汇编后为:EC ,而db 236 汇编后也为EC 。
这里有一个小问题,思考深入的朋友会发现,db 是分配一个字节,那么一个字节能表示的有符号整数范围是:-128 ~ +127 ,那么db 236 超过了这一范围,怎么可以?是的,+236 的补码的确超出了一个字节的表示范围,那么拿两个字节(当然更多的字节更好了)是可以装下的,应为:00 EC,也就是说+236的补码应该是00 EC,一个字节装不下,但是,别忘了“截断”这个概念,就是说最后的结果被截断了,00 EC 是两个字节,被截断成EC ,所以,这是个“美丽的错误”,为什么这么说?因为,当你把236 当作无符号数时,它汇编后的结果正好也是EC ,这下皆大欢喜了,虽然汇编器只用一个标准来处理,但是借用了“截断”这个美丽的错误后,得到的结果是符合两个标准的!也就是说,给你一个字节,你想输入有符号的数,比如-20 那么汇编后的结果是正确的;如果你输入236 那么你肯定当作无符号数来处理了(因为236不在一个字节能表示的有符号数的范围内啊),得到的结果也是正确的。
于是给大家一个错觉:汇编器有两套标准,会区分有符号和无符号,然后分别汇编。
其实,你们被骗了。
:-)二、存在两套指令!第一点说明汇编器只用一个方法把整数字面量汇编成真正的机器数。
但并不是说计算机不区分有符号数和无符号数,相反,计算机对有符号和无符号数区分的十分清晰,因为计算机进行某些同样功能的处理时有两套指令作为后备,这就是分别为有符号和无符号数准备的。
但是,这里要强调一点,一个数到底是有符号数还是无符号数,计算机并不知道,这是由你来决定的,当你认为你要处理的数是有符号的,那么你就用那一套处理有符号数的指令,当你认为你要处理的数是无符号的,那就用处理无符号数的那一套指令。
c语言32位除以16位无符号除法
c语言32位除以16位无符号除法(原创版)目录1.题目背景及要求2.32 位和 16 位无符号整数的表示方法3.32 位除以 16 位无符号除法的计算过程4.编程实例5.总结正文一、题目背景及要求在 C 语言编程中,有时需要进行 32 位整数除以 16 位无符号整数的运算。
由于无符号整数的范围较大,不能直接使用常见的整数除法方法,需要通过特定的计算方式来实现。
本文将详细介绍 32 位除以 16 位无符号除法的计算过程及编程实例。
二、32 位和 16 位无符号整数的表示方法在 C 语言中,无符号整数是用于表示非负整数的一种数据类型。
32 位无符号整数占用 4 个字节(32 位),其取值范围为 0 到 4294967295。
16 位无符号整数占用 2 个字节(16 位),其取值范围为 0 到 65535。
三、32 位除以 16 位无符号除法的计算过程为了实现 32 位除以 16 位无符号除法,我们需要先将 32 位整数转换为 16 位整数,然后进行除法运算。
具体步骤如下:1.将 32 位整数的高 16 位与低 16 位分开,分别存储在两个 16 位整数变量中。
2.对这两个 16 位整数进行无符号除法运算,得到商和余数。
3.将商和余数合并成一个 32 位整数,即为最终结果。
四、编程实例下面是一个实现 32 位除以 16 位无符号除法的 C 语言程序示例:```c#include <stdio.h>// 32 位整数转换为 16 位整数unsigned int convert_to_16bit(unsigned int num, int *high, int *low) {*high = num >> 16;*low = num & 0xFFFF;}// 16 位无符号除法unsigned int unsigned_divide_16bit(unsigned int dividend, unsigned int divisor) {unsigned int quotient = 0;unsigned int remainder = dividend;while (remainder >= divisor) {remainder -= divisor;quotient++;}return quotient;}// 32 位除以 16 位无符号除法unsigned int divide_32bit_by_16bit(unsigned int dividend, unsigned int divisor) {int high, low;convert_to_16bit(dividend, &high, &low);unsigned int quotient_high = unsigned_divide_16bit(high, divisor);unsigned int quotient_low = unsigned_divide_16bit(low, divisor);return (quotient_high << 16) | quotient_low;}int main() {unsigned int dividend = 0x12345678; // 32 位整数unsigned int divisor = 0x1234; // 16 位无符号整数unsigned int result = divide_32bit_by_16bit(dividend, divisor);printf("Result: 0x%08X", result);return 0;}```五、总结本文详细介绍了 32 位除以 16 位无符号除法的计算过程及编程实例。
单片机@双字节无符号数加法程序设计与调试实验
单⽚机@双字节⽆符号数加法程序设计与调试实验⼀、实验内容与要求编写并调试⼀双字节⽆符号⼗进制数加法程序。
要求:先将被加数写⼊41H、40H单元,加数写⼊51H、50H单元,相加的和存⼊52H、51H、50H单元。
按⾼位在前的顺序写⼊。
即实现:(41H)(40H)+(51H)(50H)=(52H)(51H)(50H)⼆、实验⽅法与步骤①建⽴⼀个新项⽬⽂件,将程序加⼊这个项⽬⽂件中,②编译、连接(有错的话先纠错);③将程序下载到C8051F020中;④打开RAM观察窗⼝,运⾏程序。
★运⾏程序时,可单步执⾏或在送数指令后设断点观察RAM的变化及运算三、程序清单D1L EQU 12H ;定义被加数的低8位D1H EQU 34H ;定义被加数的⾼8位D2L EQU 56H ;定义加数的低8位D2H EQU 78H ;定义加数的⾼8位ORG 0000H ;复位⼊⼝地址MOV 40H,#D1L ;被加数的低8位存⼊40H单元MOV 41H,#D1H ;被加数的⾼8位存⼊41H单元MOV 50H,#D2L ;加数的低8位存⼊50H单元MOV 51H,#D2H ;加数的⾼8位存⼊51H单元CLR CMOV A,40H ;取被加数的低8位到AADD A,50H ;低位相加DA A ;⼗进制调整MOV 50H,A ;存⼊和的低8位MOV A,41H ;取被加数的⾼8位到AADDC A,51H ;⾼8位相加DA A ;⼗进制调整MOV 51H,A ;存⼊和的⾼8位MOV 52H,#00H ;清零52H单元MOV A,#00H ;A=0ADDC A,52H ;加进位位MOV 52H,A ;存⼊进位位SJMP $END。
51单片机经典流水灯程序
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#11101111BLCALL DELAYMOV P1,#11110111BLCALL DELAYMOV P1,#11111011BLCALL DELAYMOV P1,#11111101BLCALL DELAYMOV P1,#11111110BLCALL DELAYMOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯org 00h ;程序上电从00h开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成11111110loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
双字节除法
51单片机只是8位的,但有时候需要实现双字节除法,里面的指令只支持8位。
想来想去,只好用减法来实现了。
下面这个子程序是双字节除以双字节,商、余数结果都是双字节保存,可能有点消耗资源,但这样可以整合在一块。
;****************************************;函数名称:Div2Byte;功能描述:无符号数双字节除法;传入参数:R0R1被除数 R2R3除数;返回数据:R4R5商 R6R7余数;其他说明:比如双字节数R0R1,R0高字节 R1低字节;****************************************Div2Byte:mov R4,#0mov R5,#0 ;商赋初值零mov A,R0mov R6,Amov A,R1mov R7,A ;余数赋初值,保证商为零时余数正常Div2Byte_1:mov A,R1clr csubb A,R3 ;低字节相减mov R1,Amov A,R0subb A,R2 ;高位相减mov R0,Ajc Div2Byte_3 ;如果高字节都需要借位则退出循环clr cmov A,R5;为什么这里不直接使用INCR5add A,#1mov R5,Ajnc Div2Byte_2inc R4 ;商加一Div2Byte_2:mov A,R1mov R7,Amov A,R0mov R6,A ;更新余数LJMP Div2Byte_1Div2Byte_3:RET使用示范:16进制双字节数字 05D2H 除以 0105H,商是0005H,余数是00D2Hmov R0,#5Hmov R1,#0D2Hmov R2,#1Hmov R3,#5Hlcall Div2Byte则结果是R4:00H R5:05H R6:0 R7:D2H整体感觉这个程序有问题!!可能在计算简单的除法是可以得出结果,但是..... 下面这个更是让我........8051单片机双字节除法ORG 0000H;8051单片机双字节除法 071205MOV R7,#08H;初始化数据,r7和r6为被除数,r7为高位MOV R6,#05H;r5和r4为除数,r5为高位MOV R5,#03HMOV R4,#03HMOV R0,#00H;本次计算为用减法实现除法,r0为商的存储器LOOP: CLR CMOV A,R6MOV R2,A;暂存余数低位r2SUBB A,R4MOV R6,AMOV A,R7MOV R3,A;暂存余数高位r3SUBB A,R5MOV R7,AJC OVER;如果r7r6小于r5r4则跳转到结束INC R0AJMP LOOPOVER: NOP;r3和r2为余数r3为高位END有破绽!!下面这个只能说貌似正确;=================================================; Division for three-byte data;; 2008_05_08;================================================= ORG 0000HAJMP MAINORG 0030HMAIN:MOV 77H,#0FHMOV 78H,#42HMOV 79H,#40HMOV 7AH,#00HMOV 7BH,#03HMOV 7CH,#0E8HLCALL DIV_MBSJMP MAIN;================================================= ; DIVISION FOR THREE-BYTE DATA; DIVIDEND FROM 77H&78H&79H; DIVISOR FROM 7AH&7BH&7CH; QUOTIENT TO 77H&78H&79H; 2008_05_08 BY SZCKIC;================================================= DIV_MB: MOV 7DH,#00HMOV 7EH,#00HMOV 7FH,#00HMOV R7,#18HNEXTBIT:CLR CMOV A,79HRLC AMOV 79H,AMOV A,78HRLC AMOV 78H,AMOV A,77HRLC AMOV 77H,A;Arithmetical complimentMOV A,7FHRLC AMOV 7FH,AMOV A,7EHRLC AMOV 7EH,AMOV A,7DHRLC AMOV 7DH,AMOV 5AH,7DHMOV 5BH,7EHMOV 5CH,7FHMOV 5DH,7AHMOV 5EH,7BHMOV 5FH,7CHLCALL TDECJNC UPDATEDJNZ R7,NEXTBITTMPRETUPDATE: INC 79HMOV 7FH,5CHMOV 7EH,5BHMOV 7DH,5AHDJNZ R7,NEXTBITTMPRETNEXTBITTMP:LJMP NEXTBIT;================================================= ; Subtracter for three-byte data;================================================= TDEC: CLR CMOV A,5CHSUBB A,5FHMOV 5CH,AMOV A,5BHSUBB A,5EHMOV 5BH,AMOV A,5AHSUBB A,5DHMOV 5AH,ARET。
单片机多字节加减乘除法程序
单片机多字节加减乘除法程序文章长度[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时判为不够减,其余情况均视为够减。
微机原理与接口技术除法指令3-7
1 2 3 4 5 加法指令 减法指令 乘法指令 除法指令 十进制调整指令
ห้องสมุดไป่ตู้
除法指令
• 无符号数除法(DIV) • 有符号数除法(IDIV)
进行除法时:16位/8位→8位商,8位余数 32位/16位→16位商,16位余数
对被除数、商及余数存放有如下规定:
16位/8位 32位/16位
例:将十进制数8762用压缩型BCD码表示,则为: 1000 0111 0110 0010 非压缩型BCD码: 00001000 00000111 00000110 00000010
5.1 压缩BCD码调整指令
格式: –DAA –DAS ;调整AL中的和为压缩BCD码 ;调整AL中的差为压缩BCD码
0111 0001
AF=1
加6调整
0000 0110
0111 0111
5.2 非压缩BCD码调整指令
AAA AAS AAM ; 调整AL中的和为非压缩BCD码 ; 调整AL中的差为非压缩BCD码 ; AH = AX div 10,AL = AX mod 10 跟在MUL运算之后 AAD ; AL = AH × 10 + AL,AH = 0 跟在DIV运算之前
2 循环移位指令
不含进位位的循环左移指令 ROL
不含进位位的循环右移指令 ROR
含进位位的循环左移指令 RCL 含进位位的循环右移指令 RCR
循环移位指令功能示意图
最高位 最低位 最高位
CF
(a) ROL
CF
(c) RCL
最高位
CF
最低位
CF
最高位
(b) ROR
(d) RCR
X*Y,结果在DX:AX中
程序集说明书
P821.ASM 自变量为双字节规则量(函数值为单字节)
P822.ASM 自变量为双字节规则量(函数值为双字节)
P823.ASM 自变量为双字规则量(函数值为多字节)
P831.ASM 函数值为单字节规则量(自变量为单字节)
P623.ASM 模-数转换(单路12位A/D芯片AD574)
P624.ASM 模-数转换(单路3 1/2位A/D芯片5G14433)
P625.ASM 模-数转换(单路4 1/2位A/D芯片5G7135)
P631.ASM 数-模转换(单路8位D/A芯片AD1408)
P632.ASM 数-模转换(单路8路D/A芯片DAC0832)
P242.ASM BCD码求补(双字节)
P243.ASM BCD码求补(多字节)
P251.ASM 二进制浮点数左规(双字节无符号数)
P252.ASM 二进制浮点数左规(多字节无符号数)
P253.ASM 二进制浮点数左规(双字节有符号数)
P254.ASM 二进制浮点数左规(多字节有符号数)
P261.ASM 二进制浮点数对阶(多字节无符号数)
P262.ASM 二进制浮点数对阶(多字节无符号数)
P263.ASM 二进制浮点数对阶(多字节有符号数)
P264.ASM 二进制浮点数对阶(多字节有符号数)
第三部分:二进制定点数运算
P311.ASM 加法(多字节无符号数)
P223.ASM BCD码移位(多字节循环左移一位)
P224.ASM BCD码移位(多字节循环右移一位)
P231.ASM 二进制定点数求补(单字节)
一种实用的单片机多字节除法程序
一种实用的单片机多字节除法程序在单片机的实际应用中,除法运算是以比较常见的运算。
以MCS-51单片机为例,虽然提供了除法指令,但只能进行单字节的运算。
如果要进行多字节的除法运算,就得自己设计算法。
目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二字节大于除数时,不能进行运算;3.商只有两个字节。
例如,被除数是0FFFFFFFFH,除数是0004H时,商数应该是3FFFFFFFH,余数是0003H。
但是,用以前的算法是无法进行运算的。
在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。
为了满足实际运用中的需要,有一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。
下面以MCS-51汇编语言为例进行说明。
该算法增加了两字节的余数单元,并把被除数单元用来存放商数。
运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。
若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。
再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位,共移位32次。
每移位一次,余数单元都和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。
判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。
仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。
这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为两个字节,存放在余数单元中。
例如,被除数是0FFFFFFFFH,除数是0004H时,运行新的算法,商数是3FFFFFFFH,存放在被除数单元中,余数是0003H,存放在余数单元中。
实验二 无符号十进制数加
实验二无符号十进制数加、减法实验一、实验目的1.掌握MCS-51汇编语言程序设计和调试方法。
2.熟悉KeilC的使用。
二、实验原理51单片机具有强的加、减、乘、除四种基本的数学运算功能,这些运算均是直接对8位无符号二进制数而言。
利用溢出标志,可以把加、减法操作于有符号的运算;利用十进制调整指令,又可以使运算直接用十进制数(BCD码)来运算。
1.加法有下列四种指令形式:1)ADD:完成A寄存器和第二数之间的加法,结果送A寄存器中。
2)ADDC:带进位加,同上操作,只是要加上前一次运算的进位CY的值。
以上指令均影响到标志位AC、CY、OV,P。
3)DA:十进制调整。
若A寄存器低4位的值(和数的低四位)大于9,或辅助进位标志AC=1(即第三位向第四位产生进位),则和数加6,以产生低四位正确的BCD码值。
同样,如果A寄存器的高四位的值大于9或CY=1,则高四位加6调整产生正确的高4位BCD码值。
加6调整后产生最高进位时,则置位CY。
注意:本指令只能紧跟加法指令(ADD或ADDC)的后面,其它无效。
4)INC:将源操作数加1,结果送回操作单元,不影响标志位。
加法指令有如下几条:ADD A,RnADD A,directADD A,@RiADD A,#dataADDC A,RnADDC A,directADDC A,@RiADDC A,#dataDA AINC AINC RnINC DPTRINC @RiINC direct2.51的减法指令只有两类:1.SUBB:带借位减。
从累加器A减去指定的变量进位标志,结果送回累加器A,它要考虑前一次运算操作对CY的影响。
因此,在做多字节减法时,第一次使用SUBB之前应将CY清尽。
2.DEC:将操作数减一,不影响标志。
归纳起来,减法指令有如下几条:SUBB A,Rn DEC RnSUBB A,direct DEC @RSUBB A,@Ri DEC ASUBB A,#data DEC direct由于没有十进制减法指令,为了用十进制加法调整,必须采用补码相加的办法,用9AH减去减数,即得出十为模的减数的补码。
8086汇编语言指令表(按字母顺序)
CLI ;置IF=0,CPU禁止响应外部中断
STI ;置IF=1,使CPU允许向应外部中断
功能: 完成对标志位的置位、复位等操作.
说明: 例如串操作中的程序,经常用CLD指令清方向标志使DF=0,在串操作指令执行时,按增量的方式修改吕指针.
CLD
处理器控制指令-标志位操作指令
格式:
3. 在8088/8086指令系统中,专门提供了一组根据带符号数比较大小后,实现条件转移的指令.
CMPS
字符串比较指令
格式: CMPS OPRD1,OPRD2
CMPSB
CMPSW
功能: 由SI寻址的源串中数据与由DI寻址的目的串中数据进行比较,比较结果送标志位,而不改变操作数本身.
同时SI,DI将自动调整.
CMC
处理器控制指令-标志位操作指令
格式:
CLC ;置CF=0
STC ;置CF=1
CMC ;置CF=(Not CF)进位标志求反
CLD ;置DF=0
STD ;置DF=1
CLI ;置IF=0,CPU禁止响应外部中断
STI ;置IF=1,使CPU允许向应外部中断
功能: 完成对标志位的置位、复位等操作.
说明: 例如串操作中的程序,经常用CLD指令清方向标志使DF=0,在串操作指令执行时,按增量的方式修改吕指针.
说明:
1. 实际上是两个未组合的十进制数字节相乘,一个0~9的数与另一个0~9的数相乘其积最大为81.为了得到正确的结果,应进行如下调整:
乘积: (AH)<--(AL)/10
(AL)<--(AL)MOD10
2. 本指令应跟在MUL指令后使用,乘积的两位十进制结果,高位放在AH中,低位放在AL中.AH内容是MUL指令的结果被10除的商,即(AL)/10,而最后的AL内容是乘积被10整除的余数(即个位数).
双字节乘法实验报告
一、实验目的本次实验旨在通过编写程序实现两个双字节无符号整数相乘的功能,加深对计算机中整数运算原理的理解,并提高编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019三、实验原理双字节乘法是指将两个8位无符号整数相乘,其结果为16位无符号整数。
在计算机中,无符号整数的乘法可以通过移位和加法运算实现。
具体步骤如下:1. 将其中一个操作数左移8位,相当于将其乘以256。
2. 将两个操作数相加,得到中间结果。
3. 将中间结果左移8位,得到最终结果。
四、实验步骤1. 定义两个双字节无符号整数变量`a`和`b`。
2. 定义一个双字节无符号整数变量`result`用于存储乘法结果。
3. 将`a`左移8位,并存储到`result`中。
4. 将`a`和`b`相加,得到中间结果,并存储到`result`中。
5. 将`result`左移8位,得到最终结果。
6. 输出最终结果。
五、实验代码```c#include <stdio.h>unsigned char multiply(unsigned char a, unsigned char b) {unsigned char result = 0;result = (a << 8) + (a + b);result <<= 8;return result;}int main() {unsigned char a = 0x12;unsigned char b = 0x34;unsigned int result = multiply(a, b);printf("The result of multiplying %02X and %02X is %04X\n", a, b, result);return 0;}```六、实验结果与分析1. 当`a = 0x12`,`b = 0x34`时,程序输出结果为`The result of multiplying 12 and 34 is 0x8F4`,与预期结果相符。
4位数除以3位数的竖式
4位数除以3位数的竖式【原创实用版】目录1.引言:介绍 4 位数除以 3 位数的竖式2.竖式计算方法:详细解释如何进行 4 位数除以 3 位数的竖式计算3.举例说明:通过具体例子,展示如何使用竖式计算方法解决 4 位数除以 3 位数的问题4.结论:总结 4 位数除以 3 位数的竖式计算方法正文一、引言在数学运算中,除法是一种基本的运算方式。
当我们需要计算一个 4 位数除以一个 3 位数时,我们可以通过竖式计算方法来求解。
本文将详细介绍如何进行这种类型的竖式计算。
二、竖式计算方法4 位数除以 3 位数的竖式计算方法如下:1.首先,将被除数写在竖式的左边,除数写在竖式的右边。
```1234 | 567```2.然后,比较被除数的前四位和除数的三位数。
如果被除数的前四位小于除数的三位数,则需要将被除数的前四位和下一位一起作为被除数。
```1234 | 567```3.接下来,从左到右,将除数逐位除以被除数。
将商写在竖式下方,然后将商乘以除数,将结果写在被除数下方,并将被除数减去该结果。
```1234 | 567------567---6756---1```4.重复步骤 3,直到被除数小于除数。
```1234 | 567------567---6756--------219-178-----419381---38```5.最后,将所有商写在一起,即为答案。
```1234 | 567------567---6756---1-----219-----419381---38-----1234-1122-----122```三、举例说明假设我们需要计算 1234 除以 567,我们可以按照上述方法进行计算: ```1234 | 567------567---6756--------219-178-----419381---38```结果为 2.19,即 1234 除以 567 等于 2.19。
四、结论通过以上步骤,我们可以使用竖式计算方法解决 4 位数除以 3 位数的问题。
计算机组成原理--除法器原理及c代码
计算机组成原理--除法器原理及c代码除法器是计算机中的一种重要的算术逻辑单元,用于实现除法运算。
除法器的设计是计算机组成原理中的重要内容之一,本文将从除法器的原理和相关的C代码实现两个方面进行介绍。
一、除法器原理除法器的原理主要包括除法算法和硬件实现两个方面。
1.除法算法在计算机中,除法可以采用多种算法实现,其中最常用的算法是连续除法和恢复余数法。
连续除法是将除数逐位地与被除数相减,判断余数的大小来进行下一步的操作。
具体操作如下:1)将被除数置于一边,余数和商置于另一边;2)被除数减去除数,得到当前位上的余数;3)余数进行左移,并加上下一位的被除数;4)重复上述操作直到计算完所有位。
恢复余数法是将除法过程中的余数加上除数,然后与被除数进行比较,得到商和下一位的余数。
具体操作如下:1)将被除数放在寄存器的高位,余数和商放在低位;2)将寄存器与除数进行比较,若寄存器大于等于除数,说明商的该位为1,余数等于当前寄存器减去除数;3)将寄存器进行左移,并加上下一位的被除数;4)重复上述操作直到计算完所有位。
2.硬件实现硬件实现除法器可以采用著名的Restoring、Non-Restoring和SRT 等算法。
其中Restoring算法是最常用的硬件实现方式。
Restoring算法中,通过比较、左移、减法等操作进行计算。
具体操作如下:1)将除数和被除数放入寄存器的高位和低位,商和余数置零;2)将寄存器与除数进行比较,若寄存器大于等于除数,说明商的该位为1,余数等于当前寄存器减去除数;3)将寄存器逻辑左移一位;4)循环执行2-3步,直到计算完所有位。
二、C代码实现以下是C语言中使用Restoring算法实现的除法器代码:```c#include <stdio.h>unsigned int divide(unsigned int dividend, unsigned int divisor)unsigned int quotient = 0;unsigned int remainder = 0;//32位无符号整数除法for (int i = 31; i >= 0; i--)remainder = (remainder << 1) , ((dividend >> i) & 1); // 将被除数逻辑左移一位,并加上下一位的被除数if (remainder >= divisor) // 判断余数是否大于等于除数remainder -= divisor; // 余数减去除数quotient ,= (1u << i); // 商的该位为1}}return quotient;int mainunsigned int dividend = 53;unsigned int divisor = 5;unsigned int result = divide(dividend, divisor);printf("%u / %u = %u\n", dividend, divisor, result);return 0;```以上的代码实现了一个32位无符号整数的除法操作,通过Restoring算法将除法运算转化为逐位比较、逻辑左移和减法等操作,最终得到商。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四字节除以三字节无符号数除法程序
;看到网上有人求“四字节除以三字节”的子程序,随手把我以前写的程序改了改,发表在下面。
;自我感觉不错,自认为是一个能够完成该功能的,_最_简_短_的程序。
;程序如下,呵呵,献丑了。
;===============================================================O RG 00H
LJMP START
ORG 0030H ;主程序开始
START:
MOV R7, #05H ;设定一个32位的被除数
MOV R6, #0F5H ;05 F5 E0 FFH
MOV R5, #0E0H ;=99 999 999
MOV R4, #0FFH
; MOV R3, #69H
MOV R2, #98H ;设定一个24位的除数
MOV R1, #96H ;98 96 80H
MOV R0, #80H ;=10 000 000
CALL DIV_32_24 ;调用除法子程序
SJMP $ ;商,可以用计算器验证:00 00 00 09H;余数为:98 96 7FH = 9 999 999
;****************************************************
;*四字节/三字节无符号数除法程序*
;*已经测试通过*
;**************************************************** ; R7R6R5R4 / R2R1R0 --> R7R6R5R
4...32H31H30H;;被除数R7R6R5R4,除数R2R1R0
;商R7R6R5R4,余数32H31H30H
;因为数字较大,本程序使用了:
A、B、33H和32H 31H 30H
;对这些单元的保护工作,应该在主程序中进行
;-----------------------------------------------------------DIV_32_24:
CLR A
MOV 30H, A
MOV 31H, A
MOV 32H, A
MOV R3, #32 ;循环计数
;---------------------------------------------------
CLR C
DIV_LOOP:
CALL SL_R7_R4
CALL SL_32_30
;(32H31H30H <-- R7R6R5R4 <-- C)左移一位
MOV F0, C
;---------------------
CLR C ;IF (32H31H30H >= R2R1R0) 32H31H30H -= R2R1R0;MOV A, 30H SUBB A, R0
MOV 33H, A
MOV A, 31H
SUBB A, R1
MOV B, A
MOV A, 32H
SUBB A, R2
JNC DIV_2
JNB F0, CPL_C ;不够减就不保存差
CPL C
DIV_2:
MOV 30H, 33H
MOV 31H, B
MOV 32H, A
CPL_C:
CPL C
DJNZ R3, DIV_LOOP
;---------------------------------------------------
SL_R7_R4: MOV A, R4 RLC A
MOV R4, A MOV A, R5 RLC A
MOV R5, A MOV A, R6 RLC A
MOV R6, A MOV A, R7 RLC A
MOV R7, A RET
;--------------------- SL_32_30: MOV A, 30H RLC A
MOV 30H, A MOV A, 31H RLC A
MOV 31H, A
MOV A, 32H
RLC A
MOV 32H, A
RET
;--------------------------------------------------- END。