csapp2e 家庭作业 4.46

时间:2022-02-06 21:59:04

修改在.L5

修改后的IA32代码

 .file "54.c"
 .text
.globl bubble_a
 .type bubble_a, @function
bubble_a:
 pushl %ebp
 movl %esp, %ebp
 subl $16, %esp
 movl $1, -8(%ebp)
 jmp .L2
.L6:
 movl -8(%ebp), %eax
 subl $1, %eax
 movl %eax, -12(%ebp)
 jmp .L3
.L5:
 movl -12(%ebp), %eax
 addl $1, %eax
 sall $2, %eax
 addl 8(%ebp), %eax
 movl %eax,%ebx
 movl (%eax), %edx
 
 movl -12(%ebp), %eax
 sall $2, %eax
 addl 8(%ebp), %eax
 movl %eax,%ecx
 movl (%eax), %eax
 
 cmpl %eax, %edx
 cmovl %ebx,%esi
 cmovl %ecx,%ebx
 cmovl %esi,%ecx
 
 movl %edx,(%ebx)
 movl %eax,(%ecx)

 subl $1, -12(%ebp)
.L3:
 cmpl $0, -12(%ebp)
 jns .L5
 addl $1, -8(%ebp)
.L2:
 movl -8(%ebp), %eax
 cmpl 12(%ebp), %eax
 jl .L6
 leave
 ret
 .size bubble_a, .-bubble_a
 .section .rodata
.LC0:
 .string "%d "
 .text
.globl main
 .type main, @function
main:
 pushl %ebp
 movl %esp, %ebp
 andl $-16, %esp
 subl $64, %esp
 movl $54, 20(%esp)
 movl $63, 24(%esp)
 movl $0, 28(%esp)
 movl $-12, 32(%esp)
 movl $45, 36(%esp)
 movl $34523, 40(%esp)
 movl $34, 44(%esp)
 movl $-4, 48(%esp)
 movl $0, 52(%esp)
 movl $345, 56(%esp)
 movl $10, 4(%esp)
 leal 20(%esp), %eax
 movl %eax, (%esp)
 call bubble_a
 movl $0, 60(%esp)
 jmp .L9
.L10:
 movl 60(%esp), %eax
 leal 0(,%eax,4), %edx
 leal 20(%esp), %eax
 addl %edx, %eax
 movl (%eax), %edx
 movl $.LC0, %eax
 movl %edx, 4(%esp)
 movl %eax, (%esp)
 call printf
 addl $1, 60(%esp)
.L9:
 cmpl $9, 60(%esp)
 jle .L10
 leave
 ret
 .size main, .-main
 .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
 .section .note.GNU-stack,"",@progbits


修改后的Y86代码

	.file	"54.c"
.text
.globl bubble_a
.type bubble_a, @function
bubble_a:
pushl %ebp
rrmovl %esp, %ebp
irmovl $16,%esi
subl %esi, %esp
irmovl $1,%esi
rmmovl %esi, -8(%ebp)
jmp .L2
.L6:
mrmovl -8(%ebp), %eax
irmovl $1,%esi
subl %esi, %eax
rmmovl %eax, -12(%ebp)
jmp .L3
.L5:
mrmovl -12(%ebp), %eax
irmovl $1,%esi
addl %esi, %eax
addl %eax,%eax
addl %eax,%eax
mrmovl 8(%ebp),%esi
addl %esi, %eax
rrmovl %eax,%ebx
mrmovl (%eax), %edx

mrmovl -12(%ebp), %eax
addl %eax,%eax
addl %eax,%eax
mrmovl 8(%ebp),%esi
addl %esi, %eax
rrmovl %eax,%ecx
mrmovl (%eax), %eax

rrmovl %eax,%esi
rrmovl %edx,%edi
subl %esi,%edi

cmovl %ebx,%esi
cmovl %ecx,%ebx
cmovl %esi,%ecx

rmmovl %edx,(%ebx)
rmmovl %eax,(%ecx)


irmovl $1,%esi
mrmovl -12(%ebp),%edi
subl %esi,%edi
rmmovl %edi, -12(%ebp)
.L3:
irmovl $0,%esi
mrmovl -12(%ebp),%edi
subl %esi,%edi
jns .L5
irmovl $1,%esi
mrmovl -8(%ebp),%edi
addl %esi,%edi
rmmovl %edi, -8(%ebp)
.L2:
mrmovl -8(%ebp), %eax
mrmovl 12(%ebp),%esi
rrmovl %eax,%edi
subl %esi, %edi
jl .L6
rrmovl %ebp,%esp
popl %ebp
ret
.size bubble_a, .-bubble_a
.section .rodata
.LC0:
.string "%d "
.text
.globl main
.type main, @function
main:
pushl %ebp
rrmovl %esp, %ebp
irmovl $-16,%esi
andl %esi, %esp
irmovl $64,%esi
subl %esi, %esp
irmovl $54,%esi
rmmovl %esi, 20(%esp)
irmovl $63,%esi
rmmovl %esi, 24(%esp)
irmovl $0,%esi
rmmovl %esi, 28(%esp)
irmovl $-12,%esi
rmmovl %esi, 32(%esp)
irmovl $45,%esi
rmmovl %esi, 36(%esp)
irmovl $34523,%esi
rmmovl %esi, 40(%esp)
irmovl $34,%esi
rmmovl %esi, 44(%esp)
irmovl $-4,%esi
rmmovl %esi, 48(%esp)
irmovl $0,%esi
rmmovl %esi, 52(%esp)
irmovl $345,%esi
rmmovl %esi, 56(%esp)
irmovl $10,%esi
rmmovl %esi, 4(%esp)
rrmovl %esp,%eax
irmovl $20,%esi
addl %esi,%eax
rmmovl %eax, (%esp)
call bubble_a
irmovl $0,%esi
rmmovl %esi, 60(%esp)
jmp .L9
.L10:
mrmovl 60(%esp), %eax
rrmovl %eax,%edx
addl %edx,%edx
addl %edx,%edx
rrmovl %esp,%eax
irmovl $20,%esi
addl %esi,%eax
addl %edx, %eax
mrmovl (%eax), %edx
rmmovl $.LC0, %eax
rmmovl %edx, 4(%esp)
rmmovl %eax, (%esp)
call printf
irmovl $1,%esi
mrmovl 60(%esp),%edi
addl %esi,%edi
rmmovl %edi,60(%esp);
.L9:
irmovl $9,%esi
mrmovl 60(%esp),%edi
subl %esi,%edi
jle .L10
rrmovl %ebp,%esp
popl %ebp
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
.section .note.GNU-stack,"",@progbits