• 20155231 第八周 课下作业1


    第八周课下作业1

    1. 完成家庭作业4.47,4.48,4.49
    2. 相应代码反汇编成X86-64汇编
    3. 把上述X86-64汇编翻译成Y86汇编,并给出相应机器码

    4.47

    • A、书写一个C版本的冒泡排序法,用指针引用数组元素,而不是数组索引。
    • B、书写并测试一个由这个函数和测试代码组成的Y86-64程序。

    汇编代码:

    	.file	"4.47.c"
    	.text
    	.globl	a
    	.type	a, @function
    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	a, .-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	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.3.1-14ubuntu2) 5.3.1 20160413"
    	.section	.note.GNU-stack,"",@progbits
    

    机器码:

    4.47.o:     文件格式 elf64-x86-64
    
    
    Disassembly of section .init:
    
    0000000000400428 <_init>:
      400428:	48 83 ec 08          	sub    $0x8,%rsp
      40042c:	48 8b 05 c5 0b 20 00 	mov    0x200bc5(%rip),%rax        # 600ff8 <_DYNAMIC+0x1d0>
      400433:	48 85 c0             	test   %rax,%rax
      400436:	74 05                	je     40043d <_init+0x15>
      400438:	e8 53 00 00 00       	callq  400490 <__libc_start_main@plt+0x10>
      40043d:	48 83 c4 08          	add    $0x8,%rsp
      400441:	c3                   	retq   
    
    Disassembly of section .plt:
    
    0000000000400450 <__stack_chk_fail@plt-0x10>:
      400450:	ff 35 b2 0b 20 00    	pushq  0x200bb2(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
      400456:	ff 25 b4 0b 20 00    	jmpq   *0x200bb4(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
      40045c:	0f 1f 40 00          	nopl   0x0(%rax)
    
    0000000000400460 <__stack_chk_fail@plt>:
      400460:	ff 25 b2 0b 20 00    	jmpq   *0x200bb2(%rip)        # 601018 <_GLOBAL_OFFSET_TABLE_+0x18>
      400466:	68 00 00 00 00       	pushq  $0x0
      40046b:	e9 e0 ff ff ff       	jmpq   400450 <_init+0x28>
    
    0000000000400470 <printf@plt>:
      400470:	ff 25 aa 0b 20 00    	jmpq   *0x200baa(%rip)        # 601020 <_GLOBAL_OFFSET_TABLE_+0x20>
      400476:	68 01 00 00 00       	pushq  $0x1
      40047b:	e9 d0 ff ff ff       	jmpq   400450 <_init+0x28>
    
    0000000000400480 <__libc_start_main@plt>:
      400480:	ff 25 a2 0b 20 00    	jmpq   *0x200ba2(%rip)        # 601028 <_GLOBAL_OFFSET_TABLE_+0x28>
      400486:	68 02 00 00 00       	pushq  $0x2
      40048b:	e9 c0 ff ff ff       	jmpq   400450 <_init+0x28>
    
    Disassembly of section .plt.got:
    
    0000000000400490 <.plt.got>:
      400490:	ff 25 62 0b 20 00    	jmpq   *0x200b62(%rip)        # 600ff8 <_DYNAMIC+0x1d0>
      400496:	66 90                	xchg   %ax,%ax
    
    Disassembly of section .text:
    
    00000000004004a0 <_start>:
      4004a0:	31 ed                	xor    %ebp,%ebp
      4004a2:	49 89 d1             	mov    %rdx,%r9
      4004a5:	5e                   	pop    %rsi
      4004a6:	48 89 e2             	mov    %rsp,%rdx
      4004a9:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp
      4004ad:	50                   	push   %rax
      4004ae:	54                   	push   %rsp
      4004af:	49 c7 c0 80 07 40 00 	mov    $0x400780,%r8
      4004b6:	48 c7 c1 10 07 40 00 	mov    $0x400710,%rcx
      4004bd:	48 c7 c7 76 06 40 00 	mov    $0x400676,%rdi
      4004c4:	e8 b7 ff ff ff       	callq  400480 <__libc_start_main@plt>
      4004c9:	f4                   	hlt    
      4004ca:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
    
    00000000004004d0 <deregister_tm_clones>:
      4004d0:	b8 47 10 60 00       	mov    $0x601047,%eax
      4004d5:	55                   	push   %rbp
      4004d6:	48 2d 40 10 60 00    	sub    $0x601040,%rax
      4004dc:	48 83 f8 0e          	cmp    $0xe,%rax
      4004e0:	48 89 e5             	mov    %rsp,%rbp
      4004e3:	76 1b                	jbe    400500 <deregister_tm_clones+0x30>
      4004e5:	b8 00 00 00 00       	mov    $0x0,%eax
      4004ea:	48 85 c0             	test   %rax,%rax
      4004ed:	74 11                	je     400500 <deregister_tm_clones+0x30>
      4004ef:	5d                   	pop    %rbp
      4004f0:	bf 40 10 60 00       	mov    $0x601040,%edi
      4004f5:	ff e0                	jmpq   *%rax
      4004f7:	66 0f 1f 84 00 00 00 	nopw   0x0(%rax,%rax,1)
      4004fe:	00 00 
      400500:	5d                   	pop    %rbp
      400501:	c3                   	retq   
      400502:	0f 1f 40 00          	nopl   0x0(%rax)
      400506:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
      40050d:	00 00 00 
    
    0000000000400510 <register_tm_clones>:
      400510:	be 40 10 60 00       	mov    $0x601040,%esi
      400515:	55                   	push   %rbp
      400516:	48 81 ee 40 10 60 00 	sub    $0x601040,%rsi
      40051d:	48 c1 fe 03          	sar    $0x3,%rsi
      400521:	48 89 e5             	mov    %rsp,%rbp
      400524:	48 89 f0             	mov    %rsi,%rax
      400527:	48 c1 e8 3f          	shr    $0x3f,%rax
      40052b:	48 01 c6             	add    %rax,%rsi
      40052e:	48 d1 fe             	sar    %rsi
      400531:	74 15                	je     400548 <register_tm_clones+0x38>
      400533:	b8 00 00 00 00       	mov    $0x0,%eax
      400538:	48 85 c0             	test   %rax,%rax
      40053b:	74 0b                	je     400548 <register_tm_clones+0x38>
      40053d:	5d                   	pop    %rbp
      40053e:	bf 40 10 60 00       	mov    $0x601040,%edi
      400543:	ff e0                	jmpq   *%rax
      400545:	0f 1f 00             	nopl   (%rax)
      400548:	5d                   	pop    %rbp
      400549:	c3                   	retq   
      40054a:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
    
    0000000000400550 <__do_global_dtors_aux>:
      400550:	80 3d e9 0a 20 00 00 	cmpb   $0x0,0x200ae9(%rip)        # 601040 <__TMC_END__>
      400557:	75 11                	jne    40056a <__do_global_dtors_aux+0x1a>
      400559:	55                   	push   %rbp
      40055a:	48 89 e5             	mov    %rsp,%rbp
      40055d:	e8 6e ff ff ff       	callq  4004d0 <deregister_tm_clones>
      400562:	5d                   	pop    %rbp
      400563:	c6 05 d6 0a 20 00 01 	movb   $0x1,0x200ad6(%rip)        # 601040 <__TMC_END__>
      40056a:	f3 c3                	repz retq 
      40056c:	0f 1f 40 00          	nopl   0x0(%rax)
    
    0000000000400570 <frame_dummy>:
      400570:	bf 20 0e 60 00       	mov    $0x600e20,%edi
      400575:	48 83 3f 00          	cmpq   $0x0,(%rdi)
      400579:	75 05                	jne    400580 <frame_dummy+0x10>
      40057b:	eb 93                	jmp    400510 <register_tm_clones>
      40057d:	0f 1f 00             	nopl   (%rax)
      400580:	b8 00 00 00 00       	mov    $0x0,%eax
      400585:	48 85 c0             	test   %rax,%rax
      400588:	74 f1                	je     40057b <frame_dummy+0xb>
      40058a:	55                   	push   %rbp
      40058b:	48 89 e5             	mov    %rsp,%rbp
      40058e:	ff d0                	callq  *%rax
      400590:	5d                   	pop    %rbp
      400591:	e9 7a ff ff ff       	jmpq   400510 <register_tm_clones>
    
    0000000000400596 <a>:
      400596:	55                   	push   %rbp
      400597:	48 89 e5             	mov    %rsp,%rbp
      40059a:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
      40059e:	89 75 e4             	mov    %esi,-0x1c(%rbp)
      4005a1:	c7 45 f8 01 00 00 00 	movl   $0x1,-0x8(%rbp)
      4005a8:	e9 ba 00 00 00       	jmpq   400667 <a+0xd1>
      4005ad:	8b 45 f8             	mov    -0x8(%rbp),%eax
      4005b0:	83 e8 01             	sub    $0x1,%eax
      4005b3:	89 45 f4             	mov    %eax,-0xc(%rbp)
      4005b6:	e9 9e 00 00 00       	jmpq   400659 <a+0xc3>
      4005bb:	8b 45 f4             	mov    -0xc(%rbp),%eax
      4005be:	48 98                	cltq   
      4005c0:	48 83 c0 01          	add    $0x1,%rax
      4005c4:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      4005cb:	00 
      4005cc:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      4005d0:	48 01 d0             	add    %rdx,%rax
      4005d3:	8b 10                	mov    (%rax),%edx
      4005d5:	8b 45 f4             	mov    -0xc(%rbp),%eax
      4005d8:	48 98                	cltq   
      4005da:	48 8d 0c 85 00 00 00 	lea    0x0(,%rax,4),%rcx
      4005e1:	00 
      4005e2:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      4005e6:	48 01 c8             	add    %rcx,%rax
      4005e9:	8b 00                	mov    (%rax),%eax
      4005eb:	39 c2                	cmp    %eax,%edx
      4005ed:	7d 66                	jge    400655 <a+0xbf>
      4005ef:	8b 45 f4             	mov    -0xc(%rbp),%eax
      4005f2:	48 98                	cltq   
      4005f4:	48 83 c0 01          	add    $0x1,%rax
      4005f8:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      4005ff:	00 
      400600:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      400604:	48 01 d0             	add    %rdx,%rax
      400607:	8b 00                	mov    (%rax),%eax
      400609:	89 45 fc             	mov    %eax,-0x4(%rbp)
      40060c:	8b 45 f4             	mov    -0xc(%rbp),%eax
      40060f:	48 98                	cltq   
      400611:	48 83 c0 01          	add    $0x1,%rax
      400615:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      40061c:	00 
      40061d:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      400621:	48 01 c2             	add    %rax,%rdx
      400624:	8b 45 f4             	mov    -0xc(%rbp),%eax
      400627:	48 98                	cltq   
      400629:	48 8d 0c 85 00 00 00 	lea    0x0(,%rax,4),%rcx
      400630:	00 
      400631:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      400635:	48 01 c8             	add    %rcx,%rax
      400638:	8b 00                	mov    (%rax),%eax
      40063a:	89 02                	mov    %eax,(%rdx)
      40063c:	8b 45 f4             	mov    -0xc(%rbp),%eax
      40063f:	48 98                	cltq   
      400641:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      400648:	00 
      400649:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      40064d:	48 01 c2             	add    %rax,%rdx
      400650:	8b 45 fc             	mov    -0x4(%rbp),%eax
      400653:	89 02                	mov    %eax,(%rdx)
      400655:	83 6d f4 01          	subl   $0x1,-0xc(%rbp)
      400659:	83 7d f4 00          	cmpl   $0x0,-0xc(%rbp)
      40065d:	0f 89 58 ff ff ff    	jns    4005bb <a+0x25>
      400663:	83 45 f8 01          	addl   $0x1,-0x8(%rbp)
      400667:	8b 45 f8             	mov    -0x8(%rbp),%eax
      40066a:	3b 45 e4             	cmp    -0x1c(%rbp),%eax
      40066d:	0f 8c 3a ff ff ff    	jl     4005ad <a+0x17>
      400673:	90                   	nop
      400674:	5d                   	pop    %rbp
      400675:	c3                   	retq   
    
    0000000000400676 <main>:
      400676:	55                   	push   %rbp
      400677:	48 89 e5             	mov    %rsp,%rbp
      40067a:	48 83 ec 30          	sub    $0x30,%rsp
      40067e:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
      400685:	00 00 
      400687:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
      40068b:	31 c0                	xor    %eax,%eax
      40068d:	c7 45 e0 04 00 00 00 	movl   $0x4,-0x20(%rbp)
      400694:	c7 45 e4 03 00 00 00 	movl   $0x3,-0x1c(%rbp)
      40069b:	c7 45 e8 02 00 00 00 	movl   $0x2,-0x18(%rbp)
      4006a2:	c7 45 ec 01 00 00 00 	movl   $0x1,-0x14(%rbp)
      4006a9:	c7 45 f0 00 00 00 00 	movl   $0x0,-0x10(%rbp)
      4006b0:	48 8d 45 e0          	lea    -0x20(%rbp),%rax
      4006b4:	be 05 00 00 00       	mov    $0x5,%esi
      4006b9:	48 89 c7             	mov    %rax,%rdi
      4006bc:	e8 d5 fe ff ff       	callq  400596 <a>
      4006c1:	c7 45 dc 00 00 00 00 	movl   $0x0,-0x24(%rbp)
      4006c8:	eb 1e                	jmp    4006e8 <main+0x72>
      4006ca:	8b 45 dc             	mov    -0x24(%rbp),%eax
      4006cd:	48 98                	cltq   
      4006cf:	8b 44 85 e0          	mov    -0x20(%rbp,%rax,4),%eax
      4006d3:	89 c6                	mov    %eax,%esi
      4006d5:	bf 94 07 40 00       	mov    $0x400794,%edi
      4006da:	b8 00 00 00 00       	mov    $0x0,%eax
      4006df:	e8 8c fd ff ff       	callq  400470 <printf@plt>
      4006e4:	83 45 dc 01          	addl   $0x1,-0x24(%rbp)
      4006e8:	83 7d dc 04          	cmpl   $0x4,-0x24(%rbp)
      4006ec:	7e dc                	jle    4006ca <main+0x54>
      4006ee:	90                   	nop
      4006ef:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
      4006f3:	64 48 33 04 25 28 00 	xor    %fs:0x28,%rax
      4006fa:	00 00 
      4006fc:	74 05                	je     400703 <main+0x8d>
      4006fe:	e8 5d fd ff ff       	callq  400460 <__stack_chk_fail@plt>
      400703:	c9                   	leaveq 
      400704:	c3                   	retq   
      400705:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
      40070c:	00 00 00 
      40070f:	90                   	nop
    
    0000000000400710 <__libc_csu_init>:
      400710:	41 57                	push   %r15
      400712:	41 56                	push   %r14
      400714:	41 89 ff             	mov    %edi,%r15d
      400717:	41 55                	push   %r13
      400719:	41 54                	push   %r12
      40071b:	4c 8d 25 ee 06 20 00 	lea    0x2006ee(%rip),%r12        # 600e10 <__frame_dummy_init_array_entry>
      400722:	55                   	push   %rbp
      400723:	48 8d 2d ee 06 20 00 	lea    0x2006ee(%rip),%rbp        # 600e18 <__init_array_end>
      40072a:	53                   	push   %rbx
      40072b:	49 89 f6             	mov    %rsi,%r14
      40072e:	49 89 d5             	mov    %rdx,%r13
      400731:	4c 29 e5             	sub    %r12,%rbp
      400734:	48 83 ec 08          	sub    $0x8,%rsp
      400738:	48 c1 fd 03          	sar    $0x3,%rbp
      40073c:	e8 e7 fc ff ff       	callq  400428 <_init>
      400741:	48 85 ed             	test   %rbp,%rbp
      400744:	74 20                	je     400766 <__libc_csu_init+0x56>
      400746:	31 db                	xor    %ebx,%ebx
      400748:	0f 1f 84 00 00 00 00 	nopl   0x0(%rax,%rax,1)
      40074f:	00 
      400750:	4c 89 ea             	mov    %r13,%rdx
      400753:	4c 89 f6             	mov    %r14,%rsi
      400756:	44 89 ff             	mov    %r15d,%edi
      400759:	41 ff 14 dc          	callq  *(%r12,%rbx,8)
      40075d:	48 83 c3 01          	add    $0x1,%rbx
      400761:	48 39 eb             	cmp    %rbp,%rbx
      400764:	75 ea                	jne    400750 <__libc_csu_init+0x40>
      400766:	48 83 c4 08          	add    $0x8,%rsp
      40076a:	5b                   	pop    %rbx
      40076b:	5d                   	pop    %rbp
      40076c:	41 5c                	pop    %r12
      40076e:	41 5d                	pop    %r13
      400770:	41 5e                	pop    %r14
      400772:	41 5f                	pop    %r15
      400774:	c3                   	retq   
      400775:	90                   	nop
      400776:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
      40077d:	00 00 00 
    
    0000000000400780 <__libc_csu_fini>:
      400780:	f3 c3                	repz retq 
    
    Disassembly of section .fini:
    
    0000000000400784 <_fini>:
      400784:	48 83 ec 08          	sub    $0x8,%rsp
      400788:	48 83 c4 08          	add    $0x8,%rsp
      40078c:	c3                   	retq  
    

    Y86:

    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次条件传送。

    汇编代码:

    	.file	"4.48.c"
    	.text
    	.globl	c
    	.type	c, @function
    c:
    .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, -12(%rbp)
    	jmp	.L2
    .L5:
    	movl	-12(%rbp), %eax
    	subl	$1, %eax
    	movl	%eax, -16(%rbp)
    	jmp	.L3
    .L4:
    	movl	-16(%rbp), %eax
    	cltq
    	leaq	0(,%rax,4), %rdx
    	movq	-24(%rbp), %rax
    	addq	%rdx, %rax
    	movl	(%rax), %eax
    	movl	%eax, -8(%rbp)
    	movl	-16(%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	-16(%rbp), %eax
    	cltq
    	leaq	0(,%rax,4), %rdx
    	movq	-24(%rbp), %rax
    	addq	%rax, %rdx
    	movl	-4(%rbp), %eax
    	cmpl	%eax, -8(%rbp)
    	cmovle	-8(%rbp), %eax
    	movl	%eax, (%rdx)
    	movl	-16(%rbp), %eax
    	cltq
    	addq	$1, %rax
    	leaq	0(,%rax,4), %rdx
    	movq	-24(%rbp), %rax
    	addq	%rax, %rdx
    	movl	-8(%rbp), %eax
    	cmpl	%eax, -4(%rbp)
    	cmovge	-4(%rbp), %eax
    	movl	%eax, (%rdx)
    	subl	$1, -16(%rbp)
    .L3:
    	cmpl	$0, -16(%rbp)
    	jns	.L4
    	addl	$1, -12(%rbp)
    .L2:
    	movl	-12(%rbp), %eax
    	cmpl	-28(%rbp), %eax
    	jl	.L5
    	nop
    	popq	%rbp
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	c, .-c
    	.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	c
    	movl	$0, -36(%rbp)
    	jmp	.L7
    .L8:
    	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)
    .L7:
    	cmpl	$4, -36(%rbp)
    	jle	.L8
    	nop
    	movq	-8(%rbp), %rax
    	xorq	%fs:40, %rax
    	je	.L9
    	call	__stack_chk_fail
    .L9:
    	leave
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE1:
    	.size	main, .-main
    	.ident	"GCC: (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413"
    	.section	.note.GNU-stack,"",@progbits
    

    反汇编代码:

    	.file	"4.48.c"
    
    	.text
    
    	.globl	c
    
    	.type	c, @function
    
    c:
    
    .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, -12(%rbp)
    
    	jmp	.L2
    
    .L5:
    
    	movl	-12(%rbp), %eax
    
    	subl	$1, %eax
    
    	movl	%eax, -16(%rbp)
    
    	jmp	.L3
    
    .L4:
    
    	movl	-16(%rbp), %eax
    
    	cltq
    
    	leaq	0(,%rax,4), %rdx
    
    	movq	-24(%rbp), %rax
    
    	addq	%rdx, %rax
    
    	movl	(%rax), %eax
    
    	movl	%eax, -8(%rbp)
    
    	movl	-16(%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	-16(%rbp), %eax
    
    	cltq
    
    	leaq	0(,%rax,4), %rdx
    
    	movq	-24(%rbp), %rax
    
    	addq	%rax, %rdx
    
    	movl	-4(%rbp), %eax
    
    	cmpl	%eax, -8(%rbp)
    
    	cmovle	-8(%rbp), %eax
    
    	movl	%eax, (%rdx)
    
    	movl	-16(%rbp), %eax
    
    	cltq
    
    	addq	$1, %rax
    
    	leaq	0(,%rax,4), %rdx
    
    	movq	-24(%rbp), %rax
    
    	addq	%rax, %rdx
    
    	movl	-8(%rbp), %eax
    
    	cmpl	%eax, -4(%rbp)
    
    	cmovge	-4(%rbp), %eax
    
    	movl	%eax, (%rdx)
    
    	subl	$1, -16(%rbp)
    
    .L3:
    
    	cmpl	$0, -16(%rbp)
    
    	jns	.L4
    
    	addl	$1, -12(%rbp)
    
    .L2:
    
    	movl	-12(%rbp), %eax
    
    	cmpl	-28(%rbp), %eax
    
    	jl	.L5
    
    	nop
    
    	popq	%rbp
    
    	.cfi_def_cfa 7, 8
    
    	ret
    
    	.cfi_endproc
    
    .LFE0:
    
    	.size	c, .-c
    
    	.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	c
    
    	movl	$0, -36(%rbp)
    
    	jmp	.L7
    
    .L8:
    
    	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)
    
    .L7:
    
    	cmpl	$4, -36(%rbp)
    
    	jle	.L8
    
    	nop
    
    	movq	-8(%rbp), %rax
    
    	xorq	%fs:40, %rax
    
    	je	.L9
    
    	call	__stack_chk_fail
    
    .L9:
    
    	leave
    
    	.cfi_def_cfa 7, 8
    
    	ret
    
    	.cfi_endproc
    
    .LFE1:
    
    	.size	main, .-main
    
    	.ident	"GCC: (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413"
    
    	.section	.note.GNU-stack,"",@progbits
    

    Y86:

    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  
        .section    .rodata.str1.1,"aMS",@progbits,1
    

    4.49

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

    汇编代码:

    	.file	"4.49.c"
    	.text
    	.globl	b
    	.type	b, @function
    b:
    .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, -12(%rbp)
    	jmp	.L2
    .L5:
    	movl	-12(%rbp), %eax
    	subl	$1, %eax
    	movl	%eax, -16(%rbp)
    	jmp	.L3
    .L4:
    	movl	-16(%rbp), %eax
    	cltq
    	leaq	0(,%rax,4), %rdx
    	movq	-24(%rbp), %rax
    	addq	%rdx, %rax
    	movl	(%rax), %eax
    	movl	%eax, -8(%rbp)
    	movl	-16(%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	-16(%rbp), %eax
    	cltq
    	leaq	0(,%rax,4), %rdx
    	movq	-24(%rbp), %rax
    	addq	%rax, %rdx
    	movl	-4(%rbp), %eax
    	cmpl	%eax, -8(%rbp)
    	cmovle	-8(%rbp), %eax
    	movl	%eax, (%rdx)
    	movl	-16(%rbp), %eax
    	cltq
    	addq	$1, %rax
    	leaq	0(,%rax,4), %rdx
    	movq	-24(%rbp), %rax
    	addq	%rax, %rdx
    	movl	-8(%rbp), %eax
    	movl	%eax, (%rdx)
    	subl	$1, -16(%rbp)
    .L3:
    	cmpl	$0, -16(%rbp)
    	jns	.L4
    	addl	$1, -12(%rbp)
    .L2:
    	movl	-12(%rbp), %eax
    	cmpl	-28(%rbp), %eax
    	jl	.L5
    	nop
    	popq	%rbp
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	b, .-b
    	.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	b
    	movl	$0, -36(%rbp)
    	jmp	.L7
    .L8:
    	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)
    .L7:
    	cmpl	$4, -36(%rbp)
    	jle	.L8
    	nop
    	movq	-8(%rbp), %rax
    	xorq	%fs:40, %rax
    	je	.L9
    	call	__stack_chk_fail
    .L9:
    	leave
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE1:
    	.size	main, .-main
    	.ident	"GCC: (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413"
    	.section	.note.GNU-stack,"",@progbits
    

    反汇编代码:

    4.49.o:     文件格式 elf64-x86-64
    
    
    Disassembly of section .init:
    
    0000000000400428 <_init>:
      400428:	48 83 ec 08          	sub    $0x8,%rsp
      40042c:	48 8b 05 c5 0b 20 00 	mov    0x200bc5(%rip),%rax        # 600ff8 <_DYNAMIC+0x1d0>
      400433:	48 85 c0             	test   %rax,%rax
      400436:	74 05                	je     40043d <_init+0x15>
      400438:	e8 53 00 00 00       	callq  400490 <__libc_start_main@plt+0x10>
      40043d:	48 83 c4 08          	add    $0x8,%rsp
      400441:	c3                   	retq   
    
    Disassembly of section .plt:
    
    0000000000400450 <__stack_chk_fail@plt-0x10>:
      400450:	ff 35 b2 0b 20 00    	pushq  0x200bb2(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
      400456:	ff 25 b4 0b 20 00    	jmpq   *0x200bb4(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
      40045c:	0f 1f 40 00          	nopl   0x0(%rax)
    
    0000000000400460 <__stack_chk_fail@plt>:
      400460:	ff 25 b2 0b 20 00    	jmpq   *0x200bb2(%rip)        # 601018 <_GLOBAL_OFFSET_TABLE_+0x18>
      400466:	68 00 00 00 00       	pushq  $0x0
      40046b:	e9 e0 ff ff ff       	jmpq   400450 <_init+0x28>
    
    0000000000400470 <printf@plt>:
      400470:	ff 25 aa 0b 20 00    	jmpq   *0x200baa(%rip)        # 601020 <_GLOBAL_OFFSET_TABLE_+0x20>
      400476:	68 01 00 00 00       	pushq  $0x1
      40047b:	e9 d0 ff ff ff       	jmpq   400450 <_init+0x28>
    
    0000000000400480 <__libc_start_main@plt>:
      400480:	ff 25 a2 0b 20 00    	jmpq   *0x200ba2(%rip)        # 601028 <_GLOBAL_OFFSET_TABLE_+0x28>
      400486:	68 02 00 00 00       	pushq  $0x2
      40048b:	e9 c0 ff ff ff       	jmpq   400450 <_init+0x28>
    
    Disassembly of section .plt.got:
    
    0000000000400490 <.plt.got>:
      400490:	ff 25 62 0b 20 00    	jmpq   *0x200b62(%rip)        # 600ff8 <_DYNAMIC+0x1d0>
      400496:	66 90                	xchg   %ax,%ax
    
    Disassembly of section .text:
    
    00000000004004a0 <_start>:
      4004a0:	31 ed                	xor    %ebp,%ebp
      4004a2:	49 89 d1             	mov    %rdx,%r9
      4004a5:	5e                   	pop    %rsi
      4004a6:	48 89 e2             	mov    %rsp,%rdx
      4004a9:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp
      4004ad:	50                   	push   %rax
      4004ae:	54                   	push   %rsp
      4004af:	49 c7 c0 50 07 40 00 	mov    $0x400750,%r8
      4004b6:	48 c7 c1 e0 06 40 00 	mov    $0x4006e0,%rcx
      4004bd:	48 c7 c7 48 06 40 00 	mov    $0x400648,%rdi
      4004c4:	e8 b7 ff ff ff       	callq  400480 <__libc_start_main@plt>
      4004c9:	f4                   	hlt    
      4004ca:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
    
    00000000004004d0 <deregister_tm_clones>:
      4004d0:	b8 47 10 60 00       	mov    $0x601047,%eax
      4004d5:	55                   	push   %rbp
      4004d6:	48 2d 40 10 60 00    	sub    $0x601040,%rax
      4004dc:	48 83 f8 0e          	cmp    $0xe,%rax
      4004e0:	48 89 e5             	mov    %rsp,%rbp
      4004e3:	76 1b                	jbe    400500 <deregister_tm_clones+0x30>
      4004e5:	b8 00 00 00 00       	mov    $0x0,%eax
      4004ea:	48 85 c0             	test   %rax,%rax
      4004ed:	74 11                	je     400500 <deregister_tm_clones+0x30>
      4004ef:	5d                   	pop    %rbp
      4004f0:	bf 40 10 60 00       	mov    $0x601040,%edi
      4004f5:	ff e0                	jmpq   *%rax
      4004f7:	66 0f 1f 84 00 00 00 	nopw   0x0(%rax,%rax,1)
      4004fe:	00 00 
      400500:	5d                   	pop    %rbp
      400501:	c3                   	retq   
      400502:	0f 1f 40 00          	nopl   0x0(%rax)
      400506:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
      40050d:	00 00 00 
    
    0000000000400510 <register_tm_clones>:
      400510:	be 40 10 60 00       	mov    $0x601040,%esi
      400515:	55                   	push   %rbp
      400516:	48 81 ee 40 10 60 00 	sub    $0x601040,%rsi
      40051d:	48 c1 fe 03          	sar    $0x3,%rsi
      400521:	48 89 e5             	mov    %rsp,%rbp
      400524:	48 89 f0             	mov    %rsi,%rax
      400527:	48 c1 e8 3f          	shr    $0x3f,%rax
      40052b:	48 01 c6             	add    %rax,%rsi
      40052e:	48 d1 fe             	sar    %rsi
      400531:	74 15                	je     400548 <register_tm_clones+0x38>
      400533:	b8 00 00 00 00       	mov    $0x0,%eax
      400538:	48 85 c0             	test   %rax,%rax
      40053b:	74 0b                	je     400548 <register_tm_clones+0x38>
      40053d:	5d                   	pop    %rbp
      40053e:	bf 40 10 60 00       	mov    $0x601040,%edi
      400543:	ff e0                	jmpq   *%rax
      400545:	0f 1f 00             	nopl   (%rax)
      400548:	5d                   	pop    %rbp
      400549:	c3                   	retq   
      40054a:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
    
    0000000000400550 <__do_global_dtors_aux>:
      400550:	80 3d e9 0a 20 00 00 	cmpb   $0x0,0x200ae9(%rip)        # 601040 <__TMC_END__>
      400557:	75 11                	jne    40056a <__do_global_dtors_aux+0x1a>
      400559:	55                   	push   %rbp
      40055a:	48 89 e5             	mov    %rsp,%rbp
      40055d:	e8 6e ff ff ff       	callq  4004d0 <deregister_tm_clones>
      400562:	5d                   	pop    %rbp
      400563:	c6 05 d6 0a 20 00 01 	movb   $0x1,0x200ad6(%rip)        # 601040 <__TMC_END__>
      40056a:	f3 c3                	repz retq 
      40056c:	0f 1f 40 00          	nopl   0x0(%rax)
    
    0000000000400570 <frame_dummy>:
      400570:	bf 20 0e 60 00       	mov    $0x600e20,%edi
      400575:	48 83 3f 00          	cmpq   $0x0,(%rdi)
      400579:	75 05                	jne    400580 <frame_dummy+0x10>
      40057b:	eb 93                	jmp    400510 <register_tm_clones>
      40057d:	0f 1f 00             	nopl   (%rax)
      400580:	b8 00 00 00 00       	mov    $0x0,%eax
      400585:	48 85 c0             	test   %rax,%rax
      400588:	74 f1                	je     40057b <frame_dummy+0xb>
      40058a:	55                   	push   %rbp
      40058b:	48 89 e5             	mov    %rsp,%rbp
      40058e:	ff d0                	callq  *%rax
      400590:	5d                   	pop    %rbp
      400591:	e9 7a ff ff ff       	jmpq   400510 <register_tm_clones>
    
    0000000000400596 <b>:
      400596:	55                   	push   %rbp
      400597:	48 89 e5             	mov    %rsp,%rbp
      40059a:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
      40059e:	89 75 e4             	mov    %esi,-0x1c(%rbp)
      4005a1:	c7 45 f4 01 00 00 00 	movl   $0x1,-0xc(%rbp)
      4005a8:	e9 8c 00 00 00       	jmpq   400639 <b+0xa3>
      4005ad:	8b 45 f4             	mov    -0xc(%rbp),%eax
      4005b0:	83 e8 01             	sub    $0x1,%eax
      4005b3:	89 45 f0             	mov    %eax,-0x10(%rbp)
      4005b6:	eb 77                	jmp    40062f <b+0x99>
      4005b8:	8b 45 f0             	mov    -0x10(%rbp),%eax
      4005bb:	48 98                	cltq   
      4005bd:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      4005c4:	00 
      4005c5:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      4005c9:	48 01 d0             	add    %rdx,%rax
      4005cc:	8b 00                	mov    (%rax),%eax
      4005ce:	89 45 f8             	mov    %eax,-0x8(%rbp)
      4005d1:	8b 45 f0             	mov    -0x10(%rbp),%eax
      4005d4:	48 98                	cltq   
      4005d6:	48 83 c0 01          	add    $0x1,%rax
      4005da:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      4005e1:	00 
      4005e2:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      4005e6:	48 01 d0             	add    %rdx,%rax
      4005e9:	8b 00                	mov    (%rax),%eax
      4005eb:	89 45 fc             	mov    %eax,-0x4(%rbp)
      4005ee:	8b 45 f0             	mov    -0x10(%rbp),%eax
      4005f1:	48 98                	cltq   
      4005f3:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      4005fa:	00 
      4005fb:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      4005ff:	48 01 c2             	add    %rax,%rdx
      400602:	8b 45 fc             	mov    -0x4(%rbp),%eax
      400605:	39 45 f8             	cmp    %eax,-0x8(%rbp)
      400608:	0f 4e 45 f8          	cmovle -0x8(%rbp),%eax
      40060c:	89 02                	mov    %eax,(%rdx)
      40060e:	8b 45 f0             	mov    -0x10(%rbp),%eax
      400611:	48 98                	cltq   
      400613:	48 83 c0 01          	add    $0x1,%rax
      400617:	48 8d 14 85 00 00 00 	lea    0x0(,%rax,4),%rdx
      40061e:	00 
      40061f:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
      400623:	48 01 c2             	add    %rax,%rdx
      400626:	8b 45 f8             	mov    -0x8(%rbp),%eax
      400629:	89 02                	mov    %eax,(%rdx)
      40062b:	83 6d f0 01          	subl   $0x1,-0x10(%rbp)
      40062f:	83 7d f0 00          	cmpl   $0x0,-0x10(%rbp)
      400633:	79 83                	jns    4005b8 <b+0x22>
      400635:	83 45 f4 01          	addl   $0x1,-0xc(%rbp)
      400639:	8b 45 f4             	mov    -0xc(%rbp),%eax
      40063c:	3b 45 e4             	cmp    -0x1c(%rbp),%eax
      40063f:	0f 8c 68 ff ff ff    	jl     4005ad <b+0x17>
      400645:	90                   	nop
      400646:	5d                   	pop    %rbp
      400647:	c3                   	retq   
    
    0000000000400648 <main>:
      400648:	55                   	push   %rbp
      400649:	48 89 e5             	mov    %rsp,%rbp
      40064c:	48 83 ec 30          	sub    $0x30,%rsp
      400650:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
      400657:	00 00 
      400659:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
      40065d:	31 c0                	xor    %eax,%eax
      40065f:	c7 45 e0 04 00 00 00 	movl   $0x4,-0x20(%rbp)
      400666:	c7 45 e4 03 00 00 00 	movl   $0x3,-0x1c(%rbp)
      40066d:	c7 45 e8 02 00 00 00 	movl   $0x2,-0x18(%rbp)
      400674:	c7 45 ec 01 00 00 00 	movl   $0x1,-0x14(%rbp)
      40067b:	c7 45 f0 00 00 00 00 	movl   $0x0,-0x10(%rbp)
      400682:	48 8d 45 e0          	lea    -0x20(%rbp),%rax
      400686:	be 05 00 00 00       	mov    $0x5,%esi
      40068b:	48 89 c7             	mov    %rax,%rdi
      40068e:	e8 03 ff ff ff       	callq  400596 <b>
      400693:	c7 45 dc 00 00 00 00 	movl   $0x0,-0x24(%rbp)
      40069a:	eb 1e                	jmp    4006ba <main+0x72>
      40069c:	8b 45 dc             	mov    -0x24(%rbp),%eax
      40069f:	48 98                	cltq   
      4006a1:	8b 44 85 e0          	mov    -0x20(%rbp,%rax,4),%eax
      4006a5:	89 c6                	mov    %eax,%esi
      4006a7:	bf 64 07 40 00       	mov    $0x400764,%edi
      4006ac:	b8 00 00 00 00       	mov    $0x0,%eax
      4006b1:	e8 ba fd ff ff       	callq  400470 <printf@plt>
      4006b6:	83 45 dc 01          	addl   $0x1,-0x24(%rbp)
      4006ba:	83 7d dc 04          	cmpl   $0x4,-0x24(%rbp)
      4006be:	7e dc                	jle    40069c <main+0x54>
      4006c0:	90                   	nop
      4006c1:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
      4006c5:	64 48 33 04 25 28 00 	xor    %fs:0x28,%rax
      4006cc:	00 00 
      4006ce:	74 05                	je     4006d5 <main+0x8d>
      4006d0:	e8 8b fd ff ff       	callq  400460 <__stack_chk_fail@plt>
      4006d5:	c9                   	leaveq 
      4006d6:	c3                   	retq   
      4006d7:	66 0f 1f 84 00 00 00 	nopw   0x0(%rax,%rax,1)
      4006de:	00 00 
    
    00000000004006e0 <__libc_csu_init>:
      4006e0:	41 57                	push   %r15
      4006e2:	41 56                	push   %r14
      4006e4:	41 89 ff             	mov    %edi,%r15d
      4006e7:	41 55                	push   %r13
      4006e9:	41 54                	push   %r12
      4006eb:	4c 8d 25 1e 07 20 00 	lea    0x20071e(%rip),%r12        # 600e10 <__frame_dummy_init_array_entry>
      4006f2:	55                   	push   %rbp
      4006f3:	48 8d 2d 1e 07 20 00 	lea    0x20071e(%rip),%rbp        # 600e18 <__init_array_end>
      4006fa:	53                   	push   %rbx
      4006fb:	49 89 f6             	mov    %rsi,%r14
      4006fe:	49 89 d5             	mov    %rdx,%r13
      400701:	4c 29 e5             	sub    %r12,%rbp
      400704:	48 83 ec 08          	sub    $0x8,%rsp
      400708:	48 c1 fd 03          	sar    $0x3,%rbp
      40070c:	e8 17 fd ff ff       	callq  400428 <_init>
      400711:	48 85 ed             	test   %rbp,%rbp
      400714:	74 20                	je     400736 <__libc_csu_init+0x56>
      400716:	31 db                	xor    %ebx,%ebx
      400718:	0f 1f 84 00 00 00 00 	nopl   0x0(%rax,%rax,1)
      40071f:	00 
      400720:	4c 89 ea             	mov    %r13,%rdx
      400723:	4c 89 f6             	mov    %r14,%rsi
      400726:	44 89 ff             	mov    %r15d,%edi
      400729:	41 ff 14 dc          	callq  *(%r12,%rbx,8)
      40072d:	48 83 c3 01          	add    $0x1,%rbx
      400731:	48 39 eb             	cmp    %rbp,%rbx
      400734:	75 ea                	jne    400720 <__libc_csu_init+0x40>
      400736:	48 83 c4 08          	add    $0x8,%rsp
      40073a:	5b                   	pop    %rbx
      40073b:	5d                   	pop    %rbp
      40073c:	41 5c                	pop    %r12
      40073e:	41 5d                	pop    %r13
      400740:	41 5e                	pop    %r14
      400742:	41 5f                	pop    %r15
      400744:	c3                   	retq   
      400745:	90                   	nop
      400746:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
      40074d:	00 00 00 
    
    0000000000400750 <__libc_csu_fini>:
      400750:	f3 c3                	repz retq 
    
    Disassembly of section .fini:
    
    0000000000400754 <_fini>:
      400754:	48 83 ec 08          	sub    $0x8,%rsp
      400758:	48 83 c4 08          	add    $0x8,%rsp
      40075c:	c3                   	retq  
    

    Y86:

    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
    
    • 用 命令行编译,打开.s文件显示汇编代码
    • 用objdump -d .o文件显示反汇编文件

    代码链接

  • 相关阅读:
    理解javascript 对象,原型对象、闭包
    JSON数据理解
    css 盒模型相关样式
    神奇的CSS3选择器
    设计模式六大原则
    java反射机制性能优化
    一份关于jvm内存调优及原理的学习笔记
    浅谈http请求数据分析
    Apache+Tomcat部署负载均衡(或集群)
    同台电脑部署多组Tomcat负载均衡(或集群)
  • 原文地址:https://www.cnblogs.com/javasyn/p/7823483.html
Copyright © 2020-2023  润新知