20155212 2017-2018-1 《信息安全系统设计》第8周课下作业

题目1

  1. 完成家庭作业4.47,4.48,4.49
  2. 相应代码反汇编成X86-64汇编
  3. 把上述X86-64汇编翻译成Y86汇编,并给出相应机器码
  4. 发操作过程、测试、问题解决过程博客链接

4.47

A. 书写并测试一个C版本,用指针引用数组元素,而不是用数组索引。

  • 用指针引用数组元素:
#include <stdio.h>
/*Bubble sorts:Pointer version*/
void bubble_p(long *data,int count){long i, last, t;for(last = count-1; last > 0; last--){ for(i = 0; i < last; i++){if(*(data+i+1)<*(data+i)){t = *(data+i+1);*(data+i+1) = *(data+i);*(data+i) = t;}}}
}void main(){int i;long data[5]={4, 1, 0, 2, 3};bubble_p(data, 5);for(i=0; i<5; i++){printf("%ld\t", *(data+i));}printf("\n");
}
  • 运行结果

B. 书写并测试这个函数和测试代码组成的Y86-64程序。

  • 使用gcc -E Bubble.c -Og -o Bubble1.igcc -S Bubble.c -Og -o Bubble1.s编译代码,这样生成符合原始C代码整体结构的机器代码的优化等级,便于理解。
  • X86-64汇编代码
bubble_p:leal    -1(%rsi), %r9dmovslq  %r9d, %r9jmp .L2
.L4:leaq    8(%rdi,%rax,8), %rsimovq    (%rsi), %rcxleaq    (%rdi,%rax,8), %rdxmovq    (%rdx), %r8cmpq    %r8, %rcxjge .L3movq    %r8, (%rsi)movq    %rcx, (%rdx)
.L3:addq    $1, %raxjmp .L5
.L6:movl    $0, %eax
.L5:cmpq    %r9, %raxjl  .L4subq    $1, %r9
.L2:testq   %r9, %r9jg  .L6rep ret
.LC0:
main:pushq   %rbxsubq    $48, %rspmovq    %fs:40, %raxmovq    %rax, 40(%rsp)xorl    %eax, %eaxmovq    $4, (%rsp)movq    $1, 8(%rsp)movq    $0, 16(%rsp)movq    $2, 24(%rsp)movq    $3, 32(%rsp)movl    $5, %esimovq    %rsp, %rdicall    bubble_pmovl    $0, %ebxjmp .L8
.L9:movslq  %ebx, %raxmovq    (%rsp,%rax,8), %rdxmovl    $.LC0, %esimovl    $1, %edimovl    $0, %eaxcall    __printf_chkaddl    $1, %ebx
.L8:cmpl    $4, %ebxjle .L9movl    $10, %edicall    putcharmovq    40(%rsp), %raxxorq    %fs:40, %raxje  .L10call    __stack_chk_fail
.L10:addq    $48, %rsppopq    %rbxret
  • Y86-64代码

.pos 0irmovq stack,%rspcall mainhalt
bubble_p:irmovq $1, %r8subq %r8, %rsirrmovq %rsi, %r9rrmovq %r9, %r9jmp .L2
.L4:addq %rax, %raxaddq %rax, %raxaddq %rax, %raxaddq %rdi, %raxirmovq $8, %r10addq %r10, %raxrrmovq %rax, %rsimrmovq (%rsi), %rcxrrmovq %rax, %r8addq %r8, %r8addq %r8, %r8addq %r8, %r8addq %rdi, %r8rrmovq %r8, %rdxmrmovq (%rdx), %r8rrmovq %rcx, %r10subq %r8, %r10jge .L3rmmovq %r8, (%rsi)rmmovq %rcx, (%rdx)
.L3:irmovq $1, %r8addq %r8, %raxjmp .L5
.L6:irmovq $0, %r8rrmovq %r8, %rax
.L5:rrmovq %rax, %r10subq    %r9, %r10
.L2:jg .L6ret
main:pushq %rbpirmovq $48, %r8rrmovq %r8, %rspxorq %rax, %raxirmovq $4, %r8rmmovq %r8, (%rbp)irmovq $1, %r8rmmovq %r8, 8(%rbp)irmovq $0, %r8rmmovq %r8, 16(%rbp)irmovq $2, %r8rmmovq %r8, 24(%rbp)irmovq $3, %r8rmmovq %r8, 32(%rbp)irmovq $5, %r8rrmovq %r8, %rsirrmovq %rsp, %rdicall bubble_pirmovq $0, %r9rrmovq %r9 ,%rbxjmp .L8
.L9:rrmovq %rbx, %raxrrmovq %rax, %r8addq %r8, %r8addq %r8, %r8addq %r8, %r8addq %rsp, %r8rrmovq %r8, %rdxirmovq $1, %r10rrmovq %r10, %rdiirmovq $0, %r8rrmovq %r8, %raxcall _printf_chkrrmovq %r10, %rbx
.L8:irmovq $4, %rbxjle .L9irmovq $10, %rdicall putcharmrmovq 40(%rsp), %raxje .L10call _stack_chk_fail
.L10:irmovq $48, %r8addq %r8, %rsppopq %rbxret.pos 0x200
stack:


  • 主要修改内容

    • leaq:要与``movq```类区分开
    • movq:要根据源和目的的类型划分为不同的四种命令
    • addq类:必须是寄存器之间才能操作
    • cmpq:将第二操作数放到新寄存器,然后subq

4.48

  • 不使用跳转,最多使用3次条件传送
    - 代码
    ```
    #include <stdio.h>
    /Bubble sorts:Pointer version/
    void bubble_p(long data,int count){
    long i, last, t;
    for(last = count-1; last > 0; last--){
    for(i = 0; i < last; i++){
    if(
    (data+i+1)<(data+i)){
    t =
    (data+i)-(data+i+1);
    if(t>0){
    t =
    (data+i);
    (data+i) = (data+i+1);
    *(data+i+1) = t;
    }
    }
    }
    }
    }

    void main(){
    int i;
    long data[5]={4, 1, 0, 2, 3};
    bubble_p(data, 5);
    for(i=0; i<5; i++)
    {
    printf("%ld\t", *(data+i));
    }
    printf("\n");
    }
    ```

    • 分析:通过“t=(data+i)-(data+i+1)”来设置条件码,通过comvg条件传送指令实现if(t>0)中的三个赋值语句

4.48

  • 不使用跳转,最多使用1次条件传送

    • 代码
    #include <stdio.h>
    #include <stack>
    using namespace std;/*Bubble sorts:Pointer version*/
    void bubble_p(long *data, int count) {long i, last, t;stack <long> S;for (last = count - 1; last > 0; last--) {for (i = 0; i < last; i++) {if (*(data + i + 1)<*(data + i)) {t = *(data + i) - *(data + i + 1);if (t>0) {S.push(*(data+i+1));*(data + i + 1) = *(data+i);*(data + i) = S.top();S.pop();}}}}
    }void main() {int i;long data[5] = { 4, 1, 0, 2, 3 };bubble_p(data, 5);for (i = 0; i<5; i++){printf("%ld\t", *(data + i));}printf("\n");
    }
    • 分析:使用栈。这里我调用了stack库。

      题目2

      把课上练习3的daytime服务器分别用多进程和多线程实现成并发服务器并测试

基于socket 使用教材的csapp.h, csapp.c

实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
服务器响应消息格式是

客户端IP:XXXX
服务器实现者学号:XXXXXXXX
当前时间: XX:XX:XX

提交一个客户端至少查询三次时间的截图测试截图
提交至少两个客户端查询时间的截图测试截图

  • Daytime

    DAYTIME协议是基于TCP的应用,是一种有用的调试工具,它的作用是返回当前时间和日期,格式是字符串格式。

    • 基于TCP的daytime服务:daytime服务是基于TCP的应用,服务器在TCP端口13侦听,一旦有连接建立就返回ASCII形式的日期和时间,在传送完后关闭连接。接收到的数据被忽略。
    • 基于UDP的daytime服务:daytime服务也可以使用UDP协议,它的端口也是13,不过UDP是用数据报传送当前时间的。接收到的数据被忽略。
    • Daytime格式:Weekday, Month Day, Year Time-Zone
  • 使用man -k time | grep 2查看系统调用
  • 使用man 2 time查看time()
  • 查看localtime()
  • tm结构体
    c struct tm { int tm_sec; /* Seconds (0-60) */ int tm_min; /* Minutes (0-59) */ int tm_hour; /* Hours (0-23) */ int tm_mday; /* Day of the month (1-31) */ int tm_mon; /* Month (0-11) */ int tm_year; /* Year - 1900 */ int tm_wday; /* Day of the week (0-6, Sunday = 0) */ int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */ int tm_isdst; /* Daylight saving time */ };

  • 多线程结果
  • 多进程结果

转载于:https://www.cnblogs.com/dky20155212/p/7823349.html

20155212 2017-2018-1 《信息安全系统设计》第8周课下作业相关推荐

  1. 2017~2018学年《信息安全》考试试题(A2卷)

    北京信息科技大学,2017~2018 学年第二学期<信息安全>考试试题(A 卷) 适用专业班级:计科15级 重修课程所在学院:计算机学院 考试形式:闭卷 一.单选题(本题满分20分,共含1 ...

  2. 2017~2018学年《信息安全》考试试题(A3卷)

    北京信息科技大学 2017 ~2018 学年第一学期 <信息安全>考试试题 (A3 卷) 课程所在学院:计算机学院 适用专业班级: - 考试形式:闭卷 一.单选题(本题满分 20 分,共含 ...

  3. 2017~2018学年《信息安全》考试试题(A1卷)

    北京信息科技大学 2017 ~2018 学年第二学期<信息安全>考试试题 (A 卷) 课程所在学院:计算机学院 适用专业班级:计科 1504-6.重修 考试形式:闭卷 一.单选题(本题满分 ...

  4. 2018上半年信息安全工程师真题含答案(下午题)

    2018上半年信息安全工程师真题含答案(下午题) 试题一 阅读下列说明,回答问题1至问题4,将解答填入答题纸的对应栏内. [说明]恶意代码是指为达到恶意目的专门设计的程序或者代码.常见的恶意代码类型 ...

  5. 20145223《信息安全系统设计》 实验四 驱动程序设计

    20145223杨梦云<信息安全系统设计>实验四实验报告 一.配置开发环境(同实验一) 二.阅读和理解源代码 进入/arm2410cl/exp/drivers/01_demo,使用vi编辑 ...

  6. 20155335俞昆 2017-2018-1 《信息安全系统设计》第9周学习总结

    20155335 2017-2018-1 <信息安全系统设计>第9周学习总结 本周的学习目标 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部 ...

  7. 20145326蔡馨熠《信息安全系统设计》第2周学习总结

    20145326蔡馨熠<信息安全系统设计>第2周学习总结 教材学习内容总结 一.计算机系统与链接 信息就是位+上下文,都是由一串位表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时 ...

  8. 游戏安全报告(2017 - 2018全年)

    2017年,黑客针对游戏行业的攻击,逐渐往多元化.精准化.智能化的方向演进. 阿里云安全团队通过分析游戏行业的全年安全态势,发现:虽然DDoS攻击仍为主流,但预计2年之内,业务层的CC攻击和有针对性的 ...

  9. 安徽大学java期末_安微大学2017~2018年度期末考试题卷

    原标题:安微大学2017~2018年度期末考试题卷 备考备考备考! 六月来啦,期末考还会远吗? 别人家的形势与政策课试题又一次刷新三观 你会做这样的题吗 怎么判断自己是不是个合格的AHUer? 锵锵锵 ...

最新文章

  1. 揭晓你所不了解的第三代测序技术
  2. CloudStack API编程指南
  3. 【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )
  4. informix报错244_关于informix的配置问题
  5. Eltwise_layer简介
  6. 不可变的基础架构,热部署和JVM
  7. ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL
  8. python shelve模块
  9. 【目标检测】单阶段算法--YOLOv1详解
  10. angular 关闭当前页_Angular刷新当前页面的实现方法
  11. php加密解密函数,PHP加密解密的函数
  12. openai-gpt_为什么GPT-3感觉像是编程
  13. 持续集成并不能消除 Bug,而是让它们非常容易发现和改正(转)
  14. 安装matlab 2016a win10 64bit系统
  15. 关闭笔记本电脑计算机键盘,笔记本电脑键盘怎么关_笔记本电脑键盘关闭步骤-win7之家...
  16. datagird无法deleteRow
  17. 单片机原理及应用之AT89S52
  18. 想分享给马云和李开复的一篇文章
  19. 文末送书|用Pandas分析了75w多条数据,揭秘美国选民的总统喜好!
  20. Dev C++切换到32位无法调试问题及解决

热门文章

  1. 编写css让一个已知宽高的div元素水平居中?垂直居中
  2. 遨游3.0 RC 版公布
  3. Tornado報錯AttributeError: Unrecognized option 'port'
  4. 通俗地讲清楚fit_transform()和transform()的区别
  5. c++趣味小程序_工具类小程序10天增长103万全复盘
  6. java akiba,Map集合的遍历(java)
  7. vivo9.0系统设备最简单激活XPOSED框架的步骤
  8. 一次经典的tcp三次握手
  9. 试解析Tomcat运行原理(一)--- socket通讯(转)
  10. 一个亿万富翁和一个陌生人的换钱计划