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


    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	", *(data+i));
    	}
    	printf("
    ");
    }
    
    • 运行结果

    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), %r9d
    	movslq	%r9d, %r9
    	jmp	.L2
    .L4:
    	leaq	8(%rdi,%rax,8), %rsi
    	movq	(%rsi), %rcx
    	leaq	(%rdi,%rax,8), %rdx
    	movq	(%rdx), %r8
    	cmpq	%r8, %rcx
    	jge	.L3
    	movq	%r8, (%rsi)
    	movq	%rcx, (%rdx)
    .L3:
    	addq	$1, %rax
    	jmp	.L5
    .L6:
    	movl	$0, %eax
    .L5:
    	cmpq	%r9, %rax
    	jl	.L4
    	subq	$1, %r9
    .L2:
    	testq	%r9, %r9
    	jg	.L6
    	rep ret
    .LC0:
    main:
    	pushq	%rbx
    	subq	$48, %rsp
    	movq	%fs:40, %rax
    	movq	%rax, 40(%rsp)
    	xorl	%eax, %eax
    	movq	$4, (%rsp)
    	movq	$1, 8(%rsp)
    	movq	$0, 16(%rsp)
    	movq	$2, 24(%rsp)
    	movq	$3, 32(%rsp)
    	movl	$5, %esi
    	movq	%rsp, %rdi
    	call	bubble_p
    	movl	$0, %ebx
    	jmp	.L8
    .L9:
    	movslq	%ebx, %rax
    	movq	(%rsp,%rax,8), %rdx
    	movl	$.LC0, %esi
    	movl	$1, %edi
    	movl	$0, %eax
    	call	__printf_chk
    	addl	$1, %ebx
    .L8:
    	cmpl	$4, %ebx
    	jle	.L9
    	movl	$10, %edi
    	call	putchar
    	movq	40(%rsp), %rax
    	xorq	%fs:40, %rax
    	je	.L10
    	call	__stack_chk_fail
    .L10:
    	addq	$48, %rsp
    	popq	%rbx
    	ret
    
    • Y86-64代码
    
    .pos 0
    	irmovq stack,%rsp
    	call main
    	halt
    bubble_p:
    	irmovq $1, %r8
    	subq %r8, %rsi
    	rrmovq %rsi, %r9
    	rrmovq %r9, %r9
    	jmp .L2
    .L4:
    	addq %rax, %rax
    	addq %rax, %rax
    	addq %rax, %rax
    	addq %rdi, %rax
    	irmovq $8, %r10
    	addq %r10, %rax
    	rrmovq %rax, %rsi
    	mrmovq (%rsi), %rcx
    	rrmovq %rax, %r8
    	addq %r8, %r8
    	addq %r8, %r8
    	addq %r8, %r8
    	addq %rdi, %r8
    	rrmovq %r8, %rdx
    	mrmovq (%rdx), %r8
    	rrmovq %rcx, %r10
    	subq %r8, %r10
    	jge .L3
    	rmmovq %r8, (%rsi)
    	rmmovq %rcx, (%rdx)
    .L3:
    	irmovq $1, %r8
    	addq %r8, %rax
    	jmp .L5
    .L6:
    	irmovq $0, %r8
    	rrmovq %r8, %rax
    .L5:
    	rrmovq %rax, %r10
    	subq	%r9, %r10
    .L2:
    	jg .L6
    	ret
    main:
    	pushq %rbp
    	irmovq $48, %r8
    	rrmovq %r8, %rsp
    	xorq %rax, %rax
    	irmovq $4, %r8
    	rmmovq %r8, (%rbp)
    	irmovq $1, %r8
    	rmmovq %r8, 8(%rbp)
    	irmovq $0, %r8
    	rmmovq %r8, 16(%rbp)
    	irmovq $2, %r8
    	rmmovq %r8, 24(%rbp)
    	irmovq $3, %r8
    	rmmovq %r8, 32(%rbp)
    	irmovq $5, %r8
    	rrmovq %r8, %rsi
    	rrmovq %rsp, %rdi
    	call bubble_p
    	irmovq $0, %r9
    	rrmovq %r9 ,%rbx
    	jmp .L8
    .L9:
    	rrmovq %rbx, %rax
    	rrmovq %rax, %r8
    	addq %r8, %r8
    	addq %r8, %r8
    	addq %r8, %r8
    	addq %rsp, %r8
    	rrmovq %r8, %rdx
    	irmovq $1, %r10
    	rrmovq %r10, %rdi
    	irmovq $0, %r8
    	rrmovq %r8, %rax
    	call _printf_chk
    	rrmovq %r10, %rbx
    .L8:
    	irmovq $4, %rbx
    	jle .L9
    	irmovq $10, %rdi
    	call putchar
    	mrmovq 40(%rsp), %rax
    	je .L10
    	call _stack_chk_fail
    .L10:
    	irmovq $48, %r8
    	addq %r8, %rsp
    	popq %rbx
    	ret
    
    .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	", *(data+i));
      	}
      	printf("
      ");
      }
      
      • 分析:通过“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	", *(data + i));
      	}
      	printf("
      ");
      }
      
      • 分析:使用栈。这里我调用了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结构体

      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 */
      };
      
    • 多线程结果

    • 多进程结果

  • 相关阅读:
    学好VC++的十大良好习惯
    VC6.0调试技巧
    匈牙利命名法
    VC中常用文件操作(三)
    VL_FEAT——图像处理函数库
    MATLAB——linspace
    (Your)((Term)((Project)))(字符串处理)
    Matrix Chain Multiplication(栈的简单应用)
    The Triangle(DP基础)
    MATLAB——polyfit
  • 原文地址:https://www.cnblogs.com/dky20155212/p/7823349.html
Copyright © 2020-2023  润新知