机器码运算 | Personal Blog

机器码运算

基本公式

补码加法

定点整数:[x+y]=[x]+ [y] (mod 2n+1)

定点小数:[x+y]=[x]+ [y] (mod 2)

  • 判断溢出:符号位产生的进位与最高有效位(“.”后的那位)产生的进位异或,结果为1表示溢出

  • 溢出时结果的符号位为0表示下溢

原码一位乘法

乘法可以由加法运算和移位操作完成

被乘数和乘数均取绝对值,符号位另行运算

被乘数取双符号位,部分积的长度和被乘数长度相等,初值为0

具体步骤:

  • 若最低位Yn=1,则部分积加上被乘数,然后右移一位

  • 若Yn=0,则部分积加上0,然后右移一位

  • 重复判断n次

例:|X|=00.1101,|Y|=0,1011

部分积       乘数

 00.0000     0. 1 0 1 1
+ 00.1101
-————
 00.1101
> 00.0110 1     0. 1 0 1
+ 00.1101
-————
 01.0011 1
> 00.1001 1 1     0. 1 0
+ 00.0000
-————
 00.1001 1 1
> 00.0100 1 1 1      0. 1
+00.11.01
-————
 01.0001 1 1 1
> 00.1000 1 1 1 1      0

[XY]=1.100001111

原码两位乘法

符号位单独运算

部分积和被乘数均采用三位符号位

乘数末位增加一位C 初值为0

若乘数除符号位外字长n为偶数,最多做n/2+1次加法,n/2次移位,最后一步不移位

若尾数除符号位外字长n为奇数,增加一位符号0最多做n/2+1次加法,n/2+1次移位,最后一步右移一位

Yn-1 Yn C 操作
0 0 0 加0,右移两位,C=0
0 1 0 加|X|,右移两位,C=0
1 0 0 加2|X|,右移两位,C=0
1 1 0 减0,右移两位,C=1
0 0 1 加|X|,右移两位,C=0
0 1 1 加2|X|,右移两位,C=0
1 0 1 减|X|,右移两位,C=1
1 1 1 加0,右移两位,C=1

C=1表示该步操作不准确

补码一位乘法

[xy][x](0.y1y2…yn)-[x]*y0

符号位单独运算

部分积和被乘数均采用三位符号位,乘数采用双符号位

末位增加一位Yn+1 初值为0

Yn-1 Yn Yn+1 操作
0 0 0 加0,右移两位
0 1 0 加[X],右移两位
1 0 0 加2[-X],右移两位
1 1 0 加[-X],右移两位
0 0 1 加[X],右移两位
0 1 1 加2[X],右移两位
1 0 1 加[-X],右移两位
1 1 1 加0,右移两位

阵列乘法器

  • 无符号的阵列乘法器

设有两个不带符号的二进制整数A,B

A=am-1…a1a0
B=bn-1…b1b0

数值分别为a,b

逐项遍历进行与操作

  • 带符号的阵列乘法器

在无符号的阵列乘法器的基础上添加三个求补器

两个算前求补器(输入为乘数的补码):将乘数真值的绝对值送入运算器 一个算后求补器:将负的乘积的真值求出补码

原码除法

符号位不参与运算,取双符号位

用被除数减去除数:

余数为正时,商1,余数左移一位,减去除数(加上除数负值的补码) 余数为负时,商0,余数左移一位,加上除数(加上除数正值的补码)

最后一步操作后,若余数为负,须加上除数(加上除数正值的补码)