一。试验目的: a。 掌握ALU的结构原理和数据流; b。 掌握ALU的算术逻辑指令用法; c。 理解饱和和舍入的含义; 二。 试验代码: .section program ;
.global _main ; _main : // 16bit operation ;
// 16bit ALU, Addition ; r0.h = 0xa5a5 ; r7.l = 0x5a5a ; r6.h = r0.h + r7.l (ns) ; // 16bit ALU with AC ; R0.L = 0x6000 ; R5.H = 0X3000 ; R7.L = R5.H + R0.L ( NS) ; // 不饱和操作; R7.H = R5.H + R0.L ( S ) ; // 饱和操作,比较结果; // 两个负数相加后的结果; R0.L = 0XE5A4 ; R4.H = 0X8A5A ; R5.L = R0.L + R4.H (S) ; R5.H = R0.L + R4.H (NS) ; // 对比结果看异同; // 两个负数相加后不溢出的情况; R6.H = R0.H + R0.L (S) ; R6.L = R0.H + R0.L (NS) ; // 对比结果看异同; // 32bit opertation ; R0.H = 0X5555; R0.L = 0X5555; R2.H = 0XAAAA; R2.L = 0XAAAA; R4 = R0 + R2 (NS) ; // 32bit 带饱和操作; R2.H = 0X5555; R2.L = 0X5555 ; R5 = R0 + R2 (S) ; // 16bit 实例; // 16bit ALU operation ; R0.H = 0XFFFE ; R0.L = 0XFF00 ; R2.H = 0X1; R2.L = 0X1; R6 = R0 +|+ R2 ; // 没有进位产生,对位相加,对应存储; R0.H = 0X7FFF ; R6 = R0 +|+ R2 ; // 有进位产生,不带饱和操作; R6 = R0 +|+ R0 ( S) ; // 带饱和操作 ; R7 = R0 -|+ R2 ; // 16bit 双ALU操作 ; R0.H = 0XFFFF; R0.L = 0XFF00; R2.H = 0X1; R2.L = 0X1 ; R6 = R0 +|- R2 , R7 = R0 -|+ R2 ; R6 = R0 +|+ R2 ,R7 = R0 -|- R2 ; // 32bit 双ALU 操作; R0.H = 0X7FFF; R0.L = 0XFFFF; R2.H = 0; R2.L = 1; R6 = R0 + R2 , R5 = R0 - R2 ; R0.H = 0X7FFF ; R4.H = 0X8000 ; R4.L = 0 ; R6 = R4 + R2, R5 = R4 - R2 ( S ) ; // 带有选项(co)的操作 ; R0.H = 0XFFFF ; R0.L = 0XFF00 ; R2.H = 1 ; R2.L = 1 ; R6 = R0 +|- R2,R7 = R0 -|+ R2 (CO) ; // 计算的结果进行交叉再存储; R6 = R0+|-R2 ,R7 = R0-|+R2(S); // 预增比例的加法 ; R6.H = R0 + R7 ( RND12 ) ; l, // 预减比例的加法 ; R6.H = R0 + R7 (RND20 ) ; // 绝对值指令 ; R1 = ABS R6 ; //最大最小指令; R4 = MAX ( R6, R7 ) ; R3 = MIN ( R6, R7 ) ; // 逻辑指令; R4 = R4 & R3 ; R4 = R4 | R3 ; R4 = ~ R4 ; R4 = R4 ^ R3 ; // 位方式异或指令 ; A0 = R6 ; A1 = R2 ; R4.L = CC = BXORSHIFT ( A0 , R1 ) ; R7.L = CC = BXOR ( A0, R1 ) ; A0 = BXORSHIFT (A0, A1, CC ) ; R5.L = CC = BXOR (A0, A1, CC ) ; // 指数检测指令; R1.H = 0X0010 ; R1.L = 0X0800 ; R7.L = 7 ; R2.L = EXPADJ ( R1, R7.L ) ; R2.L = EXPADJ ( R1, R7.L ) (V) ; // 带有选项的指令; //符号位指令; R0.L = SIGNBITS R3 ; // 求R3 符号位数; R3.L = 0XE711 ; R0.L = SIGNBITS R3.L ; // 简单除法指令; // 计算两个带符号的整数的商 ; P0 = 15 ; // 计算商到16bit ; R0 = -130 ; R1 = 5 ; R0 <<= 1 ; DIVS ( R0 , R1 ) ; LOOP .DIV_PRIM LC0 = P0 ; LOOP_BEGIN .DIV_PRIM ; DIVQ (R0, R1 ) ; LOOP_END .DIV_PRIM ; R0 = R0.L (X) ; NOP ; _main.end : |