关于在指令集中整数求余数运算要不要单独设置一条指令的思考
(1)以实现计算表达式“W = ( X % Y ) / Z”为例。
(2)对于8位变量用8051指令集(80351-L0指令集)计算上面的表达式: MOV A, X; MOV B, Y; DIV AB; // 求余数只有用除法指令 MOV A,B; // 转移操作数 MOV B, Z; DIV AB; MOV W,A;
(3)对于8位变量如果用80351-L1指令集计算上面的表达式: LDD BR7, X; LDD BR3, Y; MODU BR7, BR3; //专门求余数指令,计算结果在左操作数 LDD BR3, Z; DIVU BR7, BR3; STD W, BR7;
(4)对于32位变量如果用80351-L1指令集计算上面的表达式: LDD EAX, X; LDD EBX, Y; MODU EAX, EBX; //专门求余数指令,计算结果在左操作数 LDD EBX, Z; DIVU EAX, EBX; STD W, EAX; (5)数学上的基本运算分为无操作数、单操作数和双操作数运算三种,加减乘除以及求余数这5种算术运算(不是4种)属于双操作数。由于除法和求余数这两种运算是不对称操作(A/B不等于B/A),因此如果一个指令集中只有一条除法指令,那么在需要连续运算的表达式计算中就必须由人工或者编译器插入操作数转移指令。
(6)在笔者多年前的理论研究中认为,对于“数学计算完备的指令集”,每一种运算都应该对应一条独立的指令,无需编译器或者人工的干预。因此80351-L1指令集里面就有了求余的“MOD”指令。
(7)但是实际的CPU指令集中的指令数目由设计者的理念和制造者的目的决定。 比如RISC精简指令集认为指令集越小越好,其余的交给编译器去实现。而笔者认为: 在芯片的设计与制造技术高度发达的今天, 目前的RISC过于精简了,应该适当的增加一些才好。
|