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\n",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\n"
.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

posted on 2017-11-12 20:57  吕宇轩  阅读(550)  评论(0编辑  收藏  举报