2017-2018-1 20155314 《信息安全系统设计基础》第7周学习总结

2017-2018-1 20155314 《信息安全系统设计基础》第7周学习总结

教材学习内容总结

学习目标

  • 了解ISA抽象的作用
  • 掌握ISA,并能举一反三学习其他体系结构
  • 了解流水线和实现方式

教材内容提炼

第2章 信息的表示和处理

  • 三种最重要的数字表示
    • 无符号编码:表示大于或等于零的数字
    • 补码编码:表示有符号整数的最常见方式
    • 浮点数编码:表示实数的科学记数法的以2为基数的版本
  • 信息存储
    • 虚拟内存:机器级程序将内存视为一个非常大的字节数组,称为虚拟内存
    • 十六进制表示法
    • 字数据大小
      • 一个字长为w位的机器,虚拟地址的范围为0~2w-1,程序最多访问2w个字节
      • 向后兼容:大多数64位机器也可以运行为32位机器编译的程序
      • ISO C99引入一类数据类型,其数据大小是固定的,不随编译器和机器设置而变化
        • int32_t:4字节
        • int64_t:8字节
      • 对关键字的顺序以及包括还是省略可选关键字来说,C语言允许存在多种形式:如 unsigned longunsigned long intlong unsignedlong unsigned int均等价
    • 寻址和字节顺序
      • 小端法:最低有效字节在最前面
      • 大端法:最高有效字节在最前面
    • 表示字符串
    • 表示代码
    • 布尔代数简介
      • 布尔环中加法运算是,每个元素的加法逆元都是它自己本身,即对于任何值a,**aa=0**
    • C语言中的位级运算(按位布尔运算)
      • |
      • &
      • ~
      • ^
    • C语言中的逻辑运算(逻辑运算认为所有非零的参数都表示TRUE(返回1),而参数0表示FALSE(返回0))
      • ||
      • &&
      • !
    • C语言中的移位运算
      • 左移
      • 右移
        • 逻辑右移:在左端补k个0
        • 算术右移:在左端补k个最高有效位的值
  • 整数表示
    • 整型数据类型
    • 无符号数的编码
    • 补码编码
    • 有符号数和无符号数之间的转换
    • C语言中的有符号数与无符号数
    • 扩展一个数字的位表示
    • 截断数字
    • 关于有符号数与无符号数的建议
  • 整数运算
    • 无符号加法
    • 补码加法
    • 补码的非
    • 无符号乘法
    • 补码乘法
    • 乘以常数
    • 除以2的幂
    • 关于整数运算的最后思考
  • 浮点数
    • 二进制小数
    • IEEE浮点表示
    • 数字示例
    • 舍入
    • 浮点运算
    • C语言中的浮点数
      • int转成float:数字不会溢出,但可能被舍入
      • intfloat转成double:能保留精确的数值
      • double转成float:值可能溢出成+∞或-∞,还可能被舍入
      • floatdouble转成int:值将会向零舍入

课后实践:mybash

实践要求

加分题-mybash的实现

  • 使用fork,exec,wait实现mybash
  • 写出伪代码,产品代码和测试代码
  • 发表知识理解,实现过程和问题解决的博客(包含代码托管链接)

我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#define MAXARGS 20              
#define ARGLEN 100             

int mybash20155314(char *arglist[])
{ 
    int pc,pr;
    pc=fork();
    pr=wait(NULL);
    if(pc==0) execute(arglist);
    else return 0;
}

int execute(char *arglist[])
{
    execvp(arglist[0],arglist);        
    perror("execvp failed");
    exit(1);
}

char *makestring(char *buf)
{
    char  *cp;
    buf[strlen(buf)-1] = '\0';      
    cp = malloc( strlen(buf)+1 );       
    if ( cp == NULL ){          
        fprintf(stderr,"no memory\n");
        exit(1);
    }
    strcpy(cp, buf);        
    return cp;          
}

int main() {
    char *arglist[MAXARGS + 1];
    int numargs;
    char argbuf[ARGLEN];

    numargs = 0;
    while (numargs < MAXARGS) {
        printf("Arg[%d]? ", numargs);
        if (fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n')
            arglist[numargs++] = makestring(argbuf);
        else {
            if (numargs > 0) {
                arglist[numargs] = NULL;
                mybash20155314(arglist);
                numargs = 0;
            }
        }
    }
    return 0;
}

运行截图

Nypwt.png

教材学习中的问题和解决过程

  • 问题1:什么是GCC?
    • GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。
  • 问题2:什么是汇编和反汇编?
    • 汇编(Assembly):把汇编语言翻译成机器语言的过程
    • 反汇编(Disassembly):把目标代码转为汇编代码的过程
  • 问题3:什么是GUI?
    • 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。

代码调试中的问题和解决过程

macOS High Sierra下终端man命令中文显示问题

NsxOA.png

解决方法

NySeI.png

代码托管

N6kAx.png

上周考试错题总结

  1. main.c 调用了静态库libmath.a中的函数,编译main.c的命令是()

    A. gcc -static main.c ./libmath.a -o main

    B. gcc -static main.c -L. -lmath -o main

    C. gcc -static main.c -L. -llibmath.a -o main

    D. gcc -static main.o ./libmath.a -o main

    【错选】B D

    【答案】A B

  2. dll,so文件的链接是运行在()

    A. 编译时

    B. 加载时

    C. 运行时

    D. 链接时

    【错选】D

    【答案】C

结对及互评

本周结对学习情况

  • 20155323
  • 结对学习内容
    • 教材第1章 计算机系统漫游

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:5小时

  • 实际学习时间:2小时

参考资料

posted @ 2017-11-05 22:20  20155314刘子健  阅读(165)  评论(0编辑  收藏  举报
Live2D