这是计组的课设,实现的是原码定点一位乘法,代码的结构设计并不是很好,代码复用做的不是很到位,给大家提供下思路,仅供学习交流使用,实验要好好自己做啊,代码有一些小问题,大家直接抄是跑不通的。
利用以下指令完成八位二进制乘法算法的设计,并翻译成机器码
程序思路大致如下:
(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时,因此处理完进位后,要对进位标志位清零。