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


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

    教材学习内容总结

    1. ISA:指令集体系结构
    2. gcc -S xxx.c -o xxx.s 获得汇编代码
    3. objdump -d xxx 反汇编
    4. 64位机器要得到32代码:gcc -m32 -S xxx.c
    5. 二进制文件可以用od命令查看,输入内容过多,可使用more和less命令结合管道查看
    6. od code.o | more od code.o > code,txt (打印。o的二进制文件)
    7. 有效地址的计算方式: Imm(Eb,Ei,s)=Imm+R(Eb)+R(Ei)*s
    8. Imm:立即数偏移 Eb:基址寄存器 Ei:变址寄存器 S: 比例因子
    9. 栈顶元素的地址是所有元素地址中最低的

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

    (一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

    - 问题1:机器语言,汇编语言,c语言之间的关系?
    • 问题1解决方案:
    • 从硬件层到软件层:机器语言是.o文件 ——> 汇编语言 .s文件 ——> c语言
    - 问题2:.o的二进制文件如何查看?
    • 问题2解决方案:
    • 二进制文件可以用od命令查看,gcc-c xxx.c 编译成.o文件。
    • 输入内容过多,可使用more和less命令结合管道查看 od code.o | more od code.o > code,txt (打印。o的二进制文件)

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

    • 问题1:汇编后的文件嘈杂难懂?

    • 问题1解决方案:

    • gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读

    • RET指令是子程序的最后一条指令,即恢复断点,返回主程序。 没有要求RET指令非要和哪一条指令要配对使用。
        RET是子程序返回指令,放在子程序的结尾,当子程序执行完后,靠该指令返回主程序。就是return, 返回. 用于子程序的返回

    • 问题2:cmp与sub有什么区别?

    • 问题2解决方案:查看课本练习上学期学习的汇编cmp与sub类似,都是从目的操作数减去源操作数,但sub会将运算结果送至目的操作数,而cmp不会送至目的操作数,cmp用于检测标识符

    • ...

    • mybash编程博客

    Mybash实现

    知识储备:

    • feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。

    • 创建进程时经常会用到进程号的类型定义:pid_t。我们都知道这个类型定义实际上就是int型。

    • pid 是控制系统中的重要参数,指控制方式,

    • 我们编写1个普通的c程序, 运行这个程序直到程序结束, 系统只会分配1个pid给这个程序, 也就就说, 系统里只会有一条关于这个程序的进程.

    但是执行了fork() 这个函数就不同了.

        fork 这个英文单词在英文里是"分叉"意思,  fork() 这个函数作用也很符合这个意思.  它的作用是复制当前进程(包括进程在内存里的堆栈数据)为1个新的镜像. 然后这个新的镜像和旧的进程同时执行下去. 相当于本来1个进程, 遇到fork() 函数后就分叉成两个进程同时执行了. 而且这两个进程是互不影响
    

    eg:

    int main(){  
        printf("it's the main process step 1!!
    
    ");  
      
        fork();  
      
        printf("step2 after fork() 1!!
    
    ");  
       fork();  
      
        printf("step2 after fork() 2!!
    
    ");  
      
      
        int i; scanf("%d",&i);   //prevent exiting  
        return 0;  
    }
    
    • 从执行此程序可以看出来系统到底什么顺序执行主程序和子程序的
    int main(){  
        int childpid;  
        int i;  
      
        if (fork() == 0){  
            //child process  
            for (i=1; i<=8; i++){  
                printf("This is child process
    ");  
            }  
        }else{  
            //parent process  
            for(i=1; i<=8; i++){  
                printf("This is parent process
    ");  
            }  
        }  
      
        printf("step2 after fork() !!
    
    ");  
    }
    


    uploading-image-523862.png

    • 可以看出它们并不是规则交替输出的, 因为它们两条进程是互相平行影响的,谁快输入谁,每次结果可能不同。
      使用wait() 函数主程序等子程序执行完成(退出)后再执行

    • EXEC,函数族,顾名思义,就是一簇函数,他把当前进程映像替换成新的程序文件,而且该程序通常main函数开始执行。

      • EXEC的命名是有规律的:
    •    exec[l or v][p][e]
      
    •    exec函数里的参数可以分成3个部分,      执行文件部分,     命令参数部分,   环境变量部分.
        例如我要执行1个命令   ls -l /home/gateman  
       执行文件部分就是  "/usr/bin/ls"
       命令参赛部分就是 "ls","-l","/home/gateman",NULL              见到是以ls开头 每1个空格都必须分开成2个部分, 而且以NULL结尾的啊.
        环境变量部分, 这是1个数组,最后的元素必须是NULL 例如  char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};
      
    • 命名规则:
        e后续,  参数必须带环境变量部分,   环境变零部分参数会成为执行exec函数期间的环境变量, 比较少用
        l 后续,   命令参数部分必须以"," 相隔, 最后1个命令参数必须是NULL
         v 后续,   命令参数部分必须是1个以NULL结尾的字符串指针数组的头部指针.         例如char * pstr就是1个字符串的指针, char * pstr[] 就是数组了, 分别指向各个字符串.
        p后续,   执行文件部分可以不带路径, exec函数会在$PATH中找
      

    好了,接下来是产品代码:产品代码部分已经上传至码云:

    • 运行结果:

    代码托管

    参考博客: linux c语言 fork() 和 exec 函数的简介和用法

    代码托管

    其他(感悟、思考等,可选)

    这周学的是汇编语言,感慨操作系统小半页纸的书就讲了上学期汇编半本书,看来知识是按照金字塔来的,你塔底建的不好,终究一天量变产生质变,最终崩塌,所以好好学习,打实基础,尤为重要

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第五周 300/1300 7/9 30/90

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

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

    • 计划学习时间:15小时

    • 实际学习时间:20小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    LeetCode子集问题
    面试题-求最大字典区间
    链表快速排序
    树的非递归遍历
    快速排序非递归实现
    leetcode217 python3 72ms 存在重复元素
    leetcode121 C++ 12ms 买股票的最佳时机 只能买卖一次
    leetcode1 python3 76ms twoSum 360面试题
    leetcode485 python3 88ms 最大连续1的个数
    leetcode119 C++ 0ms 杨辉三角2
  • 原文地址:https://www.cnblogs.com/zx20155202/p/7710451.html
Copyright © 2020-2023  润新知