您的位置:首页 > 其它

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

2017-11-12 20:57 681 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: