zoukankan      html  css  js  c++  java
  • 20155216 2017-2018-1 第八周课下作业1

    20155216 2017-2018-1 第八周课下作业1

    作业内容:

    1、完成家庭作业4.47,4.48,4.49。

    2、相应代码反汇编成X86-64汇编。

    3、把上述X68-64汇编翻译成Y86-64汇编,并给出相应机器码。

    作业4.47

    A 编写一个排序代码

    #include<stdio.h>
    void bubble_a(int *data, int count){  
      int i,next;  
       for(next = 1; next < count; next++){  
        for(i = next - 1; i >= 0; i--)  
            if(*(data + i + 1) < *(data + i)){  
                int t = *(data + i + 1);  
                *(data + i + 1) = *(data + i);  
                *(data + i) = t;  
            }  
        }  
    } 
    void main()
    {
    int data[5]={4,3,2,1,0};
    int i;
    bubble_a(data,5);
    for(i=0;i<5;i++)
    {
        printf("%2d
    ",data[i]);
      }
    }
    

    运行结果:

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

    .file	"sort.c"
    .text
    .globl	bubble_a
    .type	bubble_a, @function
    bubble_a:
    .LFB0:
    .cfi_startproc
    pushq	%rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq	%rsp, %rbp
    .cfi_def_cfa_register 6
    movq	%rdi, -24(%rbp)
    movl	%esi, -28(%rbp)
    movl	$1, -8(%rbp)
    jmp	.L2
    .L6:
    movl	-8(%rbp), %eax
    subl	$1, %eax
    movl	%eax, -12(%rbp)
    jmp	.L3
    .L5:
    movl	-12(%rbp), %eax
    cltq
    addq	$1, %rax
    leaq	0(,%rax,4), %rdx
    movq	-24(%rbp), %rax
    addq	%rdx, %rax
    movl	(%rax), %edx
    movl	-12(%rbp), %eax
    cltq
    leaq	0(,%rax,4), %rcx
    movq	-24(%rbp), %rax
    addq	%rcx, %rax
    movl	(%rax), %eax
    cmpl	%eax, %edx
    jge	.L4
    movl	-12(%rbp), %eax
    cltq
    addq	$1, %rax
    leaq	0(,%rax,4), %rdx
    movq	-24(%rbp), %rax
    addq	%rdx, %rax
    movl	(%rax), %eax
    movl	%eax, -4(%rbp)
    movl	-12(%rbp), %eax
    cltq
    addq	$1, %rax
    leaq	0(,%rax,4), %rdx
    movq	-24(%rbp), %rax
    addq	%rax, %rdx
    movl	-12(%rbp), %eax
    cltq
    leaq	0(,%rax,4), %rcx
    movq	-24(%rbp), %rax
    addq	%rcx, %rax
    movl	(%rax), %eax
    movl	%eax, (%rdx)
    movl	-12(%rbp), %eax
    cltq
    leaq	0(,%rax,4), %rdx
    movq	-24(%rbp), %rax
    addq	%rax, %rdx
    movl	-4(%rbp), %eax
    movl	%eax, (%rdx)
    .L4:
    subl	$1, -12(%rbp)
    .L3:
    cmpl	$0, -12(%rbp)
    jns	.L5
    addl	$1, -8(%rbp)
    .L2:
    movl	-8(%rbp), %eax
    cmpl	-28(%rbp), %eax
    jl	.L6
    nop
    popq	%rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
    .LFE0:
    .size	bubble_a, .-bubble_a
    .section	.rodata
    .LC0:
    .string	"%2d
    "
    .text
    .globl	main
    .type	main, @function
    main:
    .LFB1:
    .cfi_startproc
    pushq	%rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq	%rsp, %rbp
    .cfi_def_cfa_register 6
    subq	$48, %rsp
    movq	%fs:40, %rax
    movq	%rax, -8(%rbp)
    xorl	%eax, %eax
    movl	$4, -32(%rbp)
    movl	$3, -28(%rbp)
    movl	$2, -24(%rbp)
    movl	$1, -20(%rbp)
    movl	$0, -16(%rbp)
    leaq	-32(%rbp), %rax
    movl	$5, %esi
    movq	%rax, %rdi
    call	bubble_a
    movl	$0, -36(%rbp)
    jmp	.L8
    .L9:
    movl	-36(%rbp), %eax
    cltq
    movl	-32(%rbp,%rax,4), %eax
    movl	%eax, %esi
    movl	$.LC0, %edi
    movl	$0, %eax
    call	printf
    addl	$1, -36(%rbp)
    .L8:
    cmpl	$4, -36(%rbp)
    jle	.L9
    nop
    movq	-8(%rbp), %rax
    xorq	%fs:40, %rax
    je	.L10
    call	__stack_chk_fail
    .L10:
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
    .LFE1:
    .size	main, .-main
    .ident	"GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
    .section	.note.GNU-stack,"",@progbits
    

    X86-64机器码:

    Y86-64

    bubble_c:  
    .LFB22:  
    .cfi_startproc  
    pushl   %edi  
    .cfi_def_cfa_offset 8  
    .cfi_offset 7, -8  
    pushl   %esi  
    .cfi_def_cfa_offset 12  
    .cfi_offset 6, -12  
    pushl   %ebx  
    .cfi_def_cfa_offset 16  
    .cfi_offset 3, -16  
    mrmovl   16(%esp), %edx  
    mrmovl   20(%esp), %edi  
    irmovl   $1, %eax  
    subl     %eax, %edi  
    jle      .L1  
    subl     $1, %edi  
    irmovl   $0, %esi  
    .L6:  
    rrmovl   %esi, %eax  
    irmovl   $0 , ebx   
    subl     %ebx, %esi  
    jl       .L3  
    .L7:  
    rrmovl   %eax, %ecx  
    addl     %ecx, %ecx  
    addl     %ecx, %ecx  
    addl     %edx, %ecx  
    mrmovl   4(%ecx), %ecx  
    rrmovl   %eax, %ebx  
    addl     %ecx, %ebx  
    addl     %ecx, %ebx  
    addl     %edx, %ebx  
    mrmovl   (%ebx), %ebx  
    subl     %ebx, %ecx  
    jge     .L4  
    addl     %eax, %eax  
    addl     %eax, %eax  
    addl     %edx, %eax  
    rmmovl   %ebx, 4(%eax)  
    addl     %eax, %eax  
    addl     %eax, %eax  
    addl     %edx, %eax  
    rmmovl   %ecx, 4(%eax)  
    .L4:  
    subl    $1, %eax  
    irmovl  $-1, %edx  
    subl    %edx, %eax  
    jne .L7  
    .L3:  
    addl    $1, %esi  
    subl    %edi, %esi  
    jne .L6  
    .L1:  
    popl    %ebx  
    .cfi_def_cfa_offset 12  
    .cfi_restore 3  
    popl    %esi  
    .cfi_def_cfa_offset 8  
    .cfi_restore 6  
    popl    %edi  
    
    .cfi_def_cfa_offset 4  
    .cfi_restore 7  
    ret  
    .cfi_endproc  
    .LFE22:  
    .size   bubble_c, .-bubble_c  
    .section    .rodata.str1.1,"aMS",@progbits,1
    

    4.48

    实现排序,3次条件传送。

    void bubble_c(int *data,int count)
    {
    int i , next;
    int pre_ele,next_ele;
    for(next = 1;next < count;next++)
    {
        for(i = next -1;i >= 0;i--)
        {
            pre_ele = *(data + i);
            next_ele = *(data + i + 1);
            *(data + i) = next_ele < pre_ele ? next_ele : pre_ele;//三目运算符号
            *(data + i + 1) = next_ele < pre_ele ? pre_ele : next_ele;//使用两次条件传送
        }
      }
    }
    

    X86-64汇编:

    X86-64机器码:

    **Y86-64汇编:

    bubble_b:
    .LFB22:
    .cfi_startproc
    pushl %edi
    .cfi_def_cfa_offset 8
    .cfi_offset 7, -8
    pushl %esi
    .cfi_def_cfa_offset 12
    .cfi_offset 6, -12
    pushl %ebx
    .cfi_def_cfa_offset 16
    .cfi_offset 3, -16
    mrmovl 16(%esp), %edx
    mrmovl 20(%esp), %edi
    irmovl $1, %eax
    subl %eax, %edi
    jle .L1
    subl $1, %edi
    irmovl $0, %esi
    .L6:
    movl (%ebx,%eax,4), %edx
    movl 4(%ebx,%eax,4), %ecx
    cmpl %edx, %ecx
    movl %edx, %ebp
    cmovle %ecx, %ebp
    movl %ebp, (%ebx,%eax,4)
    cmovge %ecx, %edx
    movl %edx, 4(%ebx,%eax,4)
    subl $1, %eax
    cmpl $-1, %eax
    jne .L6
    .L7:
    rrmovl %eax, %ecx
    addl %ecx, %ecx
    addl %ecx, %ecx
    addl %edx, %ecx
    mrmovl 4(%ecx), %ecx
    rrmovl %eax, %ebx
    addl %ecx, %ebx
    addl %ecx, %ebx
    addl %edx, %ebx
    mrmovl (%ebx), %ebx
    subl %ebx, %ecx
    jge .L4
    addl %eax, %eax
    addl %eax, %eax
    addl %edx, %eax
    rmmovl %ebx, 4(%eax)
    addl %eax, %eax
    addl %eax, %eax
    addl %edx, %eax
    rmmovl %ecx, 4(%eax)
    .L4:
    subl $1, %eax
    irmovl $-1, %edx
    subl %edx, %eax
    jne .L7
    .L3:
    addl $1, %esi
    subl %edi, %esi
    jne .L6
    .L1:
    popl %ebx
    .cfi_def_cfa_offset 12
    .cfi_restore 3
    popl %esi
    .cfi_def_cfa_offset 8
    .cfi_restore 6
    popl %edi

    .cfi_def_cfa_offset 4  
    .cfi_restore 7  
    ret  
    .cfi_endproc  
    

    .LFE22:
    .size bubble_b, .-bubble_b

    4.49

    实现冒泡排序,要求不使用跳转,且最多使用1次条件传送。

    void bubble_c(int *data,int count)
    {
    int i , next;
    int pre_ele,next_ele;
    for(next = 1;next < count;next++)
    {
        for(i = next -1;i >= 0;i--)
        {
            pre_ele = *(data + i);
            next_ele = *(data + i + 1);
            *(data + i) = next_ele < pre_ele ? next_ele : pre_ele;
            *(data + i + 1) = pre_ele;
        }
      }
    }
    

    X86-64汇编:

    X86-64机器码:

    **Y86-64汇编:

    bubble_b:
    .LFB22:
    .cfi_startproc
    pushl %edi
    .cfi_def_cfa_offset 8
    .cfi_offset 7, -8
    pushl %esi
    .cfi_def_cfa_offset 12
    .cfi_offset 6, -12
    pushl %ebx
    .cfi_def_cfa_offset 16
    .cfi_offset 3, -16
    mrmovl 16(%esp), %edx
    mrmovl 20(%esp), %edi
    irmovl $1, %eax
    subl %eax, %edi
    jle .L1
    subl $1, %edi
    irmovl $0, %esi
    .L6:
    movl (%ebx,%eax,4), %edx
    movl 4(%ebx,%eax,4), %ecx
    cmpl %edx, %ecx
    movl %edx, %ebp
    cmovle %ecx, %ebp
    movl %edx, 4(%ebx,%eax,4)
    subl $1, %eax
    cmpl $-1, %eax
    jne .L6
    .L7:
    rrmovl %eax, %ecx
    addl %ecx, %ecx
    addl %ecx, %ecx
    addl %edx, %ecx
    mrmovl 4(%ecx), %ecx
    rrmovl %eax, %ebx
    addl %ecx, %ebx
    addl %ecx, %ebx
    addl %edx, %ebx
    mrmovl (%ebx), %ebx
    subl %ebx, %ecx
    jge .L4
    addl %eax, %eax
    addl %eax, %eax
    addl %edx, %eax
    rmmovl %ebx, 4(%eax)
    addl %eax, %eax
    addl %eax, %eax
    addl %edx, %eax
    rmmovl %ecx, 4(%eax)
    .L4:
    subl $1, %eax
    irmovl $-1, %edx
    subl %edx, %eax
    jne .L7
    .L3:
    addl $1, %esi
    subl %edi, %esi
    jne .L6
    .L1:
    popl %ebx
    .cfi_def_cfa_offset 12
    .cfi_restore 3
    popl %esi
    .cfi_def_cfa_offset 8
    .cfi_restore 6
    popl %edi

    .cfi_def_cfa_offset 4  
    .cfi_restore 7  
    ret  
    .cfi_endproc  
    

    .LFE22:
    .size bubble_b, .-bubble_b
    .section .rodata.str1.1,"aMS",@progbits,1

  • 相关阅读:
    一个微信小程序跳转到另一个微信小程序
    微信小程序 canIUse
    微信小程序 点击事件 传递参数
    jquery 在将对象作为参数传递的时候要转换成 JSON
    微擎后台进行GET提交
    微信小程序添加底部导航栏
    jquery 中 html与text函数的区别
    C++ int与char[]的相互转换
    Qt error: LNK1158 无法运行rc.exe解决办法
    Qt error C3615: constexpr 函数 "qCountLeadingZeroBits" 不会生成常数表达式
  • 原文地址:https://www.cnblogs.com/lyx1996/p/7822876.html
Copyright © 2011-2022 走看看