八位二进制乘法在复杂模型机上的实现

这是计组的课设,实现的是原码定点一位乘法,代码的结构设计并不是很好,代码复用做的不是很到位,给大家提供下思路,仅供学习交流使用,实验要好好自己做啊,代码有一些小问题,大家直接抄是跑不通的。

利用以下指令完成八位二进制乘法算法的设计,并翻译成机器码
指令及对应机器码

程序思路大致如下:

(1)从地址为00H的端口得到两个乘数分别送入寄存器R0和R1,设为X,Y;
(2)将R0寄存器的乘数X送到内存的F0H单元;
(3)利用寄存器R2和R3初始化计数器和部分积,初始化进位标志存入F4H单元;
(4)寄存器R2中计数次数加1,并与09H比较判断乘数Y右移循环是否结束(即乘法是否结束),若是,跳转至输出单元,否则利用乘数Y与01H进行AND操作判断乘数Y最低位,进行跳转至乘数最最低位为1或者跳转至乘数最最低位为0的情况;
(5)乘数最最低位为0时,将计数值存入内存F1H单元,将部分积和乘数循环右移1位,再判断R3中部分积的最高位,跳转至将部分积的最低位存入乘数Y的最高位的程序段;
(6)乘数最最低位为1时, 从F0H单元取出乘数X,将之与部分积相加,如果有进位则记录进位标志,然后将计数值存入内存F1H单元,将部分积和乘数循环右移1位,再判断R3中部分积的最高位,跳转至将部分积的最低位存入乘数的最高位的程序段;
(7)将部分积的最低位0存入乘数的最高位时,将R1和7FH进行AND操作,将乘数Y最高位置0,再从F4H单元中取出进位标志位,如有进位需将部分积最高位置1并清空进位标志位,否则置0,返回步骤4;
(8)将部分积的最低位1存入乘数的最高位时,将R1和80H进行OR操作,将乘数Y最高位置1,再从F4H单元中取出进位标志位,如有进位需将部分积最高位置1并清空进位标志位,否则置0,返回步骤4。
(9)最后将乘积高位和低位分别存入R3和R1寄存器中,在数码管上显示,并存入内存中的F2和F3地址所对应的单元中。
在这里插入图片描述

代码放这儿了

$P 00 20  ;IN R0, 00H  ;X
$P 01 00  ;
$P 02 21  ;IN R1, 00H  ;Y
$P 03 00  ;
$P 04 62  ;LDI R2, 00H  ;计数
$P 05 00  ;
$P 06 63  ;LDI R3, 00H  ;部分积
$P 07 00  ;  
$P 08 D0  ;STA 00, F0H, R0   
$P 09 F0  ;
$P 0A 60  ;LDI R0, 00H        ;初始化进位标志位为0 
$P 0B 00  ;
$P 0C D0  ;STA 00H, F4H, R0
$P 0D F4  ;

;Right:
$P 0E 72 ;INC R2
$P 0F 60 ;LDI R0, 09H
$P 10 09 ;
$P 11 88 ;SUB R0, R2      ;比较循环次数
$P 12 F0 ;BZC Output    
$P 13 4C ;
$P 14 60   ;LDI R0,01H
$P 15 01
$P 16 14   ;AND RO,R1
$P 17 F0   ;BZC Preser0  
$P 18 1B
$P 19 E0   ;JMP Preser1   
$P 1A 3A

;Preser0
$P 1B 60   ;LDI R0,01H;
$P 1C 01
$P 1D D2   ;STA 00H, F1H, R2
$P 1E F1
$P 1F A1   ;RR R1,R0

$P 21 62   ;LDI R2, 80H
$P 22 80
$P 23 1E   ;AND R2,R3
$P 24 F0   ;BZC 乘数最高位置0
$P 25 28
$P 26 E0   ;JMP 乘数最高位置1
$P 27 31

;乘数最高位置0:
$P 28 66   ;LDI R2, 7FH
$P 29 7F
$P 2A 19   ;AND R1,R2	;置0操作
$P 2B E0   ;JMP  A0                       #############
$P 2C 5C   ;
;部分积最高位置完,跳回A1
$P 2D C2    ;LAD 00H, F1H, R2	;取出计数值   ;A1
$P 2E F1
$P 2F E0     ;JMP Right 
$P 30 0E


;乘数最高位置1:
$P 31 62    ;LDI R2, 80H
$P 32 80
$P 33 99    ;OR R1,R2
$P 34 E0    ;JMP  B0                       #############
$P 35 71   ;
;部分积最高位置完,跳回B1
$P 36 C2    ;LAD 00H, F1H, R2    ;B1:
$P 37 F1
$P 38 E0    ;JMP Right 
$P 39 0E

;Preser1:
$P 3A C0    ;LAD 00, F0H, R0	;取出X  
$P 3B F0
$P 3C 03    ;ADD R3,R0	 ;加一个X
$P 3D F0    ;BZC 相加有进位C0                         #############
$P 3E 55    ;                         #############
;相加有进位返回此处C1
$P 3F D2    ;STA 00H, F1H, R2	 ;存储计数值
$P 40 F1    
$P 41 62    ;LDI R2, 80H
$P 42 80
$P 43 60    ;LDI R0,01H 
$P 44 01
$P 45 A1    ;RR R1,R0            
$P 46 A3    ;RR R3,R0             
$P 47 1E    ;AND R2,R3
$P 48 F0    ;BZC 乘数最高位置0;
$P 49 28
$P 4A E0    ;JMP 乘数最高位置1
$P 4B 31

;Output:
$P 4C 3C    ;OUT 40H, R3
$P 4D 40;
$P 4E 34    ;OUT 40H, R1
$P 4F 40    
$P 50 D3    ;STA 00H, F2H, R3
$P 51 F2
$P 52 D1    ;STA 00H, F3H, R1
$P 53 F3
$P 54 50    ;HALT

;相加有进位,置标志位:
;C0
$P 55 60      ;LDI R0 01H
$P 56 01      ;
$P 57 D0      ;STA 00H, F4H, R0	 ;存储进位标志
$P 58 F4
$P 59 80      ;SUB R0,R0     ;&&&&&&&&&&&&&清空进位标志位!!!!!!!!!!!
$P 5A E0      ;JMP     C1  ;相加有进位返回此处
$P 5B 3F


;判断进位标志位,置部分积最高位0  
;A0:
$P 5C C0   ;LAD 00H, F4H, R0  ;取出进位标志位
$P 5D F4   ;
$P 5E 62   ;LDI R2,01H
$P 5F 01   ;
$P 60 82   ;SUB R2,R0
$P 61 F0   ;BZC A2
$P 62 68   ;
$P 63 62   ;LDI R2, 7FH
$P 64 7F   ;
$P 65 1B   ;AND R3,R2    ;部分积最高位置0
$P 66 E0   ;JMP A1
$P 67 2D   ;
;A2:
$P 68 62   ;LDI R2, 80H
$P 69 80   ;
$P 6A 9B   ;OR R3, R2   ;部分积最高位置1
$P 6B 60   ;LDI R0, 00H        ;重置标志位为0/
$P 6C 00   ;
$P 6D D0   ;STA 00H, F4H, R0
$P 6E F4   ;
$P 6F E0   ;JMP A1
$P 70 2D   ;

;判断进位标志位,置部分积最高位0  
;B0
$P 71 C0   ;LAD 00H, F4H, R0  ;取出进位标志位
$P 72 F4   ;
$P 73 62   ;LDI R2,01H
$P 74 01   ;
$P 75 82   ;SUB R2,R0
$P 76 F0   ;BZC B2
$P 77 7D   ;
$P 78 62   ;LDI R2, 7FH
$P 79 7F   ;
$P 7A 1B   ;AND R3,R2    ;部分积最高位置0
$P 7B E0   ;JMP B1
$P 7C 36   ;
;B2:
$P 7D 62   ;LDI R2, 80H
$P 7E 80   ;
$P 7F 9B   ;OR R3, R2   ;部分积最高位置1
$P 80 60   ;LDI R0, 00H        ;重置标志位为0 
$P 81 00   ;
$P 82 D0   ;STA 00H, F4H, R0
$P 83 F4   ;
$P 84 E1   ;JMP B1
$P 85 36   ;

请添加图片描述

程序设计中遇到的几个问题

1.部分积的进位问题,由于使用的RR指令右移循环,在有进位时,如果有进位要特殊考虑,右移回来的最高位不一定是符号位0。
2.条件判断指令BZC的触发条件是FC=1或FZ=1时,因此处理完进位后,要对进位标志位清零。

  • 9
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Logisim是一款数字电路模拟软件,可以用来设计和模拟各种逻辑电路。八位二进制加法器在计算机中扮演着非常重要的角色,它可以将两个八位二进制数相加,并产生一个八位二进制结果。 在Logisim中,我们可以通过组合逻辑电路来实现八位二进制加法器。首先,我们需要为每一位二进制数准备输入引脚,并连接到相应的开关或输入按钮上。然后,我们可以使用逻辑门(如XOR门、AND门等)来进行每一位的相加运算。 具体来说,我们可以使用八个全加器来实现八位二进制数的相加。每个全加器有三个输入和两个输出。前两个输入分别对应两个要相加的二进制数的对应位,第三个输入为进位标志。输出分为两部分,一部分是当前位的计算结果,另一部分是进位标志。 将每个全加器按照顺序连接起来,将前一个全加器的进位标志与后一个全加器的进位标志相连。最后,我们需要将每一位的计算结果和进位标志输出到相应的显示器或输出按钮上,以便观察结果。 通过这样的设计,我们就可以在Logisim中实现一个八位二进制加法器。只需提供两个八位二进制数作为输入,然后观察输出结果。这个加法器可以用于计算机中的各种二进制数相加运算,如整数加法、浮点数加法等。 总之,Logisim是一个非常强大的数字电路模拟软件,可以帮助我们设计和模拟各种逻辑电路。通过组合逻辑电路的设计,我们可以在Logisim中实现八位二进制加法器,用于计算机中的二进制数相加运算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值