计算系统基础的实验报告 实验2

计算机系统基础:实验2 定点数加减法运算的机器级表示

提示:根据《计算机系统基础》 中给出的解释来解决更容易,看一下p64页能更简单理解

题目要求:
1、 能够用C语言仿真加法器的运算过程
2、 能够用C语言仿真加法器的运算EFLAGS中4个牵涉到计算的标志位的计算方法,并且能够根据EFLAGS判定是否计算溢出。


  #include <stdio.h>
#include <stdlib.h>

int addsub(char int1[],char int2[],int flag,int m,int n);
int intNum(char int1[]);
int main(int argc, char *argv[]) {
    char int1[5];
     char int2[5];
     char s;
     int flag = 0;
     int i,j,n,m;
     for(i=0;i<4;i++){
     scanf("%c",&int1[i]);
     }
    scanf("%c",&s);
    for(j=0;j<4;j++){
        scanf("%c",&int2[j]);
    }
    if(s =='-'){
    flag = 1;
    }
    m = intNum(int1);
    n = intNum(int2);
//    printf("int1=%d int2=%d\n",m,n);
//    printf("运算符为=%d\n",flag);
    addsub(int1,int2,flag,m,n);
    return 0;
}
int addsub(char int1[],char int2[],int flag,int m,int n){
    //ZF、OF、SF、CF
    char s[4];
    s[3] = '0';//默认是加法
    if(flag){
         s[3] = '1';
        //减法运算转换成加法
        int i;
        int count = 0;
    //求出减数的补码
     for(i=3;i>=0;i--){
         if(count){
             int2[i] = int2[i]=='1' ? '0':'1';
         }
         if(int2[i]!='0'&& count == 0){
            count++;
        }
        
}
        }
    
   //加法运算
    int j,count_0=0;
    char carr='0',result[4];
    for(j=3;j>=0;j--){
        if(int1[j] == '1'&&int2[j] == '1'){
//            printf("%c %c \n",int1[j],int2[j]);
            if(carr=='1'){
                result[j]='1';
            }else{
                result[j]='0';
            }
            carr='1';
        }else if (int1[j] == '0'&&int2[j] == '0'){
//            printf("%c %c \n",int1[j],int2[j]);
            if(carr=='1'){
                result[j]='1';
            }else{
                result[j]='0';
            }
            carr='0';
        }else {
//            printf("%c %c \n",int1[j],int2[j]);
            if(carr=='1'){
                result[j]='0';
            }else{
                result[j]='1';
            }
        }
        if(result[j]=='0'){
            count_0++;
        }
//        printf("%c",result[j]);
    }
    

    s[0] = count_0 == 4 ? '1':'0';//判断ZF
    s[1] = int1[0] == int2[0] && result[0] != int1[0] ? '1':'0';//判断OF
    s[2] = result[0];//判断SF
    s[3] = s[3]==carr ? '0':'1';//判断CF
    printf("结果:");
    for (j=0; j<4; j++) {
        printf("%c",result[j]);
    }
//    ZF=1,SF=0,CF=0,OF=0
    printf("\nZF=%c,SF=%c,CF=%c,OF=%c\n",s[0],s[2],s[3],s[1]);
    
    return 0;
}
   
//2进制转换到10进制
int intNum(char int1[]){
    int i,sum = 0;
    for(i=1;i<4;i++){
    if(int1[i] != '0'){
        sum = sum + (1<<(4-i-1));
    }
}
    if(int1[0] == '1'){
        return -sum;
    }
    return sum;
}

   

本方法最后一个测试会出现一点问题,就是OF计算时,由于我使用的结果只有4位,如果使用5位的话,就可计算出OF为1,但是根据书本上的解释,我这样写的问题也不大。

测试举例:

测试用例1
测试用例2
测试用例3
测试用例4
测试用例5

总结:

秘诀:一定要看书,一定要看书!!
一点点C语言的水平,加上计算机系统基础中所说的一步一步来,可以轻松解决,我使用的三元运算符比较多,可以使用相应的ifelse来轻松解决,加油加油!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机组成原理存储实验是一种常见的实验,通过该实验可以让学生了解计算机存储的原理和实现方法,掌握存储的读写操作和存储管理方法。以下是计算机组成原理存储实验的具体步骤: 1. 确定实验目标和实验要求 在进行实验之前,需要明确实验目标和实验要求,确定实验所需要实现的功能和实验数据的测试方法。 2. 设计存储电路 根据实验要求,设计存储电路,包括存储单元、地址译码、读写控制电路等,确定存储的存储容量和存储单元的位数。 3. 确定测试程序 根据实验要求,编写测试程序,通过测试程序来验证存储的读写操作和存储管理方法。 4. 实现存储电路 根据设计的存储电路图,实现存储电路,包括硬件电路和软件控制电路。 5. 进行实验测试 将测试程序加载到存储中,通过测试程序来验证存储的读写操作和存储管理方法。测试过程中需要记录测试数据和测试结果,以供实验报告的分析和总结。 6. 总结与分析 完成实验后,需要对实验结果进行总结和分析,从实验数据和测试结果中发现问题并对其进行解决。同时还需要对实验过程中出现的问题进行分析和总结,为下一次实验的顺利进行提供参考。 总之,计算机组成原理存储实验是一种非常重要的实验,通过实验可以让学生深入了解计算机存储的原理和实现方法,掌握存储的读写操作和存储管理方法,为学习计算机系统和进行计算机编程奠定基础

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值