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
相关文章推荐
- 20155216 2017-2018-1 第八周课下作业1
- 20155216 2017-2018-1 第八周课下作业2
- 20155216 2017-2018-1 第八周课下作业2
- 2017-2018-1 20155318 《信息安全系统设计基础》第十周课上测试及课下作业
- 2017-2018-1 JaWorld 团队作业--冲刺1
- 20155325 2017-2018 1 课上测试、课下作业、实验——码云&博客链接汇总 《信息安全系统设计基础》
- 2017-2018-1 20155216 《信息安全系统设计基础》第七周学习总结
- 2017-2018-1 20155339 第八周课下作业
- 2017-2018-1 20155239 《信息安全系统设计基础》第八周课下作业
- 2017-2018-1 20155216 《信息安全系统设计基础》第四周学习总结
- 2017-2018-1 20155216 《信息安全系统设计基础》 实现mypwd
- 2017-2018-1 20155216 《信息安全系统设计基础》课程总结
- 2017-2018-1 20155307 《信息安全系统设计基础》第十周课上未完成补充以及课下IPC作业
- 2017-2018-1 JAVA实验站 第八周作业
- 2017-2018 第一学期201623班《程序设计与数据结构》-第5&6周作业问题总结
- 2017-2018-1 20155216 实验五:通讯协议设计
- 20155212 2017-2018-1 《信息安全系统设计》第8周课下作业
- 2017-2018-1 20155216 《信息安全系统设计基础》第八周学习总结
- 2017-2018-1 20155313 《信息安全系统设计基础》第八周课下作业
- 2017-2018-1 Java演绎法 第三周 作业