• 2017-2018-1 20155201 《信息安全系统设计基础》第八周课下作业


    2017-2018-1 20155201 《信息安全系统设计基础》第八周课下作业

    补充课上测试:

    sum.c

    #include <stdio.h>
    
    
    int main(int argc,char *argv[]){
    		int a,b;
    		int i=0;
    		int sum=0;
    		for(i=1;i<100;i++){
    				if(argv[i]==''){
    						break;
    				}
    				sum+=atoi(argv[i]);
    		}
    		printf("%d
    ",sum);
    	
    		return 0;
    
    }
    
    

    sum.s

    
    _main:                                  ## @main
    	
    
    	pushq	%rbp
    Ltmp0:
    
    Ltmp1:
    
    	movq	%rsp, %rbp
    Ltmp2:
    
    	subq	$48, %rsp
    	movl	$0, -4(%rbp)
    	movl	%edi, -8(%rbp)
    	movq	%rsi, -16(%rbp)
    	movl	$0, -28(%rbp)
    	movl	$0, -32(%rbp)
    	movl	$1, -28(%rbp)
    LBB0_1:
    	cmpl	$100, -28(%rbp)
    	jge	LBB0_6
    
    	movslq	-28(%rbp), %rax
    	movq	-16(%rbp), %rcx
    	cmpq	$0, (%rcx,%rax,8)
    	jne	LBB0_4
    	jmp	LBB0_6
    LBB0_4:
    	movslq	-28(%rbp), %rax
    	movq	-16(%rbp), %rcx
    	movq	(%rcx,%rax,8), %rdi
    	movb	$0, %al
    	callq	_atoi
    	addl	-32(%rbp), %eax
    	movl	%eax, -32(%rbp)
    	movl	-28(%rbp), %eax
    	addl	$1, %eax
    	movl	%eax, -28(%rbp)
    	jmp	LBB0_1
    LBB0_6:
    	leaq	L_.str(%rip), %rdi
    	movl	-32(%rbp), %esi
    	movb	$0, %al
    	callq	_printf
    	xorl	%esi, %esi
    	movl	%eax, -36(%rbp)
    	movl	%esi, %eax
    	addq	$48, %rsp
    	popq	%rbp
    	retq
    	
    L_.str:                         
    
    

    反汇编代码:

    objdump -d sum.o
    

    y86代码:

    课下作业

    之前用成了第二版的教材。。发现两个版本的家庭作业不一样 又找时间重新做了下,以下是课下作业:
    修改后的bubble sort:

    void bubble_p(long* data, long count) {
        long *i, *last;
        for (last = data+count-1; last > data; last--) {
            for (i = data; i < last; i++) {
                if ( *(i+1) < *i) {
                    long t = *(i+1);
                    *(i+1) = *i;
                    *i = t;
                }
            }
        }
    }
    
    

    测试代码

    void bubble_p(long* data, long count) {
        long *i, *last;
        for (last = data+count-1; last > data; last--) {
            for (i = data; i < last; i++) {
                if (*(i+1) < *i) {
                    long t = *(i+1);
                    *(i+1) = *i;
                    *i = t;
                }
            }
        }
    }
    
    int main(){
    		long i;
    		long data[]={1,0,3,5,2,6,8,9,7,4};
    		printf("待排序序列:");
    		for(i=0;i<10;i++){
    				printf("%ld ",*(data+i));
    		}
    		bubble_p(data,10);
    		printf("
    排序后序列:");
    		for(i=0;i<10;i++){
    				printf("%ld ",*(data+i));
    		}
    }
    
    

    测试结果:

    objdump -d sort.o
    

    sort.o:	file format Mach-O 64-bit x86-64
    
    Disassembly of section __TEXT,__text:
    _bubble_p:
           0:	55 	pushq	%rbp
           1:	48 89 e5 	movq	%rsp, %rbp
           4:	48 89 7d f8 	movq	%rdi, -8(%rbp)
           8:	48 89 75 f0 	movq	%rsi, -16(%rbp)
           c:	48 8b 75 f8 	movq	-8(%rbp), %rsi
          10:	48 8b 7d f0 	movq	-16(%rbp), %rdi
          14:	48 c1 e7 03 	shlq	$3, %rdi
          18:	48 01 fe 	addq	%rdi, %rsi
          1b:	48 83 c6 f8 	addq	$-8, %rsi
          1f:	48 89 75 e0 	movq	%rsi, -32(%rbp)
          23:	48 8b 45 e0 	movq	-32(%rbp), %rax
          27:	48 3b 45 f8 	cmpq	-8(%rbp), %rax
          2b:	0f 86 7d 00 00 00 	jbe	125 <_bubble_p+0xAE>
          31:	48 8b 45 f8 	movq	-8(%rbp), %rax
          35:	48 89 45 e8 	movq	%rax, -24(%rbp)
          39:	48 8b 45 e8 	movq	-24(%rbp), %rax
          3d:	48 3b 45 e0 	cmpq	-32(%rbp), %rax
          41:	0f 83 51 00 00 00 	jae	81 <_bubble_p+0x98>
          47:	48 8b 45 e8 	movq	-24(%rbp), %rax
          4b:	48 8b 40 08 	movq	8(%rax), %rax
          4f:	48 8b 4d e8 	movq	-24(%rbp), %rcx
          53:	48 3b 01 	cmpq	(%rcx), %rax
          56:	0f 8d 26 00 00 00 	jge	38 <_bubble_p+0x82>
          5c:	48 8b 45 e8 	movq	-24(%rbp), %rax
          60:	48 8b 40 08 	movq	8(%rax), %rax
          64:	48 89 45 d8 	movq	%rax, -40(%rbp)
          68:	48 8b 45 e8 	movq	-24(%rbp), %rax
          6c:	48 8b 00 	movq	(%rax), %rax
          6f:	48 8b 4d e8 	movq	-24(%rbp), %rcx
          73:	48 89 41 08 	movq	%rax, 8(%rcx)
          77:	48 8b 45 d8 	movq	-40(%rbp), %rax
          7b:	48 8b 4d e8 	movq	-24(%rbp), %rcx
          7f:	48 89 01 	movq	%rax, (%rcx)
          82:	e9 00 00 00 00 	jmp	0 <_bubble_p+0x87>
          87:	48 8b 45 e8 	movq	-24(%rbp), %rax
          8b:	48 83 c0 08 	addq	$8, %rax
          8f:	48 89 45 e8 	movq	%rax, -24(%rbp)
          93:	e9 a1 ff ff ff 	jmp	-95 <_bubble_p+0x39>
          98:	e9 00 00 00 00 	jmp	0 <_bubble_p+0x9D>
          9d:	48 8b 45 e0 	movq	-32(%rbp), %rax
          a1:	48 83 c0 f8 	addq	$-8, %rax
          a5:	48 89 45 e0 	movq	%rax, -32(%rbp)
          a9:	e9 75 ff ff ff 	jmp	-139 <_bubble_p+0x23>
          ae:	5d 	popq	%rbp
          af:	c3 	retq
    
    _main:
          b0:	55 	pushq	%rbp
          b1:	48 89 e5 	movq	%rsp, %rbp
          b4:	48 81 ec 90 00 00 00 	subq	$144, %rsp
          bb:	48 8d 3d 6e 01 00 00 	leaq	366(%rip), %rdi
          c2:	48 8d 05 00 00 00 00 	leaq	(%rip), %rax
          c9:	b9 50 00 00 00 	movl	$80, %ecx
          ce:	89 ca 	movl	%ecx, %edx
          d0:	48 8d 75 a0 	leaq	-96(%rbp), %rsi
          d4:	4c 8b 05 00 00 00 00 	movq	(%rip), %r8
          db:	4d 8b 00 	movq	(%r8), %r8
          de:	4c 89 45 f8 	movq	%r8, -8(%rbp)
          e2:	c7 45 9c 00 00 00 00 	movl	$0, -100(%rbp)
          e9:	48 89 7d 88 	movq	%rdi, -120(%rbp)
          ed:	48 89 f7 	movq	%rsi, %rdi
          f0:	48 89 c6 	movq	%rax, %rsi
          f3:	e8 00 00 00 00 	callq	0 <_main+0x48>
          f8:	48 8b 7d 88 	movq	-120(%rbp), %rdi
          fc:	b0 00 	movb	$0, %al
          fe:	e8 00 00 00 00 	callq	0 <_main+0x53>
         103:	48 c7 45 90 00 00 00 00 	movq	$0, -112(%rbp)
         10b:	89 45 84 	movl	%eax, -124(%rbp)
         10e:	48 83 7d 90 0a 	cmpq	$10, -112(%rbp)
         113:	0f 8d 2b 00 00 00 	jge	43 <_main+0x94>
         119:	48 8d 3d 21 01 00 00 	leaq	289(%rip), %rdi
         120:	48 8b 45 90 	movq	-112(%rbp), %rax
         124:	48 8b 74 c5 a0 	movq	-96(%rbp,%rax,8), %rsi
         129:	b0 00 	movb	$0, %al
         12b:	e8 00 00 00 00 	callq	0 <_main+0x80>
         130:	89 45 80 	movl	%eax, -128(%rbp)
         133:	48 8b 45 90 	movq	-112(%rbp), %rax
         137:	48 83 c0 01 	addq	$1, %rax
         13b:	48 89 45 90 	movq	%rax, -112(%rbp)
         13f:	e9 ca ff ff ff 	jmp	-54 <_main+0x5E>
         144:	b8 0a 00 00 00 	movl	$10, %eax
         149:	89 c6 	movl	%eax, %esi
         14b:	48 8d 7d a0 	leaq	-96(%rbp), %rdi
         14f:	e8 00 00 00 00 	callq	0 <_main+0xA4>
         154:	48 8d 3d eb 00 00 00 	leaq	235(%rip), %rdi
         15b:	b0 00 	movb	$0, %al
         15d:	e8 00 00 00 00 	callq	0 <_main+0xB2>
         162:	48 c7 45 90 00 00 00 00 	movq	$0, -112(%rbp)
         16a:	89 85 7c ff ff ff 	movl	%eax, -132(%rbp)
         170:	48 83 7d 90 0a 	cmpq	$10, -112(%rbp)
         175:	0f 8d 2e 00 00 00 	jge	46 <_main+0xF9>
         17b:	48 8d 3d bf 00 00 00 	leaq	191(%rip), %rdi
         182:	48 8b 45 90 	movq	-112(%rbp), %rax
         186:	48 8b 74 c5 a0 	movq	-96(%rbp,%rax,8), %rsi
         18b:	b0 00 	movb	$0, %al
         18d:	e8 00 00 00 00 	callq	0 <_main+0xE2>
         192:	89 85 78 ff ff ff 	movl	%eax, -136(%rbp)
         198:	48 8b 45 90 	movq	-112(%rbp), %rax
         19c:	48 83 c0 01 	addq	$1, %rax
         1a0:	48 89 45 90 	movq	%rax, -112(%rbp)
         1a4:	e9 c7 ff ff ff 	jmp	-57 <_main+0xC0>
         1a9:	8b 45 9c 	movl	-100(%rbp), %eax
         1ac:	48 8b 0d 00 00 00 00 	movq	(%rip), %rcx
         1b3:	48 8b 09 	movq	(%rcx), %rcx
         1b6:	48 8b 55 f8 	movq	-8(%rbp), %rdx
         1ba:	48 39 d1 	cmpq	%rdx, %rcx
         1bd:	89 85 74 ff ff ff 	movl	%eax, -140(%rbp)
         1c3:	0f 85 0f 00 00 00 	jne	15 <_main+0x128>
         1c9:	8b 85 74 ff ff ff 	movl	-140(%rbp), %eax
         1cf:	48 81 c4 90 00 00 00 	addq	$144, %rsp
         1d6:	5d 	popq	%rbp
         1d7:	c3 	retq
         1d8:	e8 00 00 00 00 	callq	0 <_main+0x12D>
    

    Y86程序:

    • 首先完成mov指令的对应翻译,irmovq,rrmovq,mrmovq,rmmovq。立即数i,寄存器r,内存m,指令的第一个字母表明了源的类型。目的可以是寄存器或内存。
    • 四个整数操作指令:addq,subq,andq,xorq,只对寄存器数据进行操作。
    • 七个跳转指令jmp,jle,jl,je,jne,jge,jg分支条件和x86_64一样
    • 六个条件传送指令:cmovle,cmovl,cmove,cmovne,cmovge,cmovq
    • call,ret,pushq,popq同x86_64一样
    • halt指令停止指令的执行。
    
    main:
        irmovq data,%rdi
        irmovq data_end,%rsi
        call BubbleP
        ret
    
    
    BubbleP:
      jmp L2
    L4:
      rrmovq 8(%rax), %r9
      rrmovq (%rax), %r10
      rrmovq %r9, %r8
      subq %r10, %r8
      jge L3
      rmmovq %r10, 8(%rax)
      rmmovq %r9, (%rax)
    L3:
      rrmovq $8, %r8
      addq %r8, %rax
      jmp L5
    L6:
      rrmovq %rdi, %rax
    L5:
      rrmovq %rsi, %r8
      subq %rax, %r8
      jg L4
      irmovq $8, %r8
      subq %r8, %rsi
    L2:
      rrmovq %rsi, %r8
      subq %rdi, %r8
      jg L6
        ret
    
    
  • 相关阅读:
    IDEA 现有项目连接SVN
    图片预加载,懒加载
    element-ui table中排序 取消表格默认排序问题
    Linux vim编辑命令
    linux mount 硬盘挂载和卸载
    Linux mke2fs 硬盘格式化
    Linux rm 删除文件
    linux 创建和删除目录
    linux 配置IP
    kickstart自动化安装--tftp+nfs+dhcp
  • 原文地址:https://www.cnblogs.com/zhuohua/p/7820492.html
Copyright © 2020-2023  润新知