2017-2018-1 20155318 《信息安全系统设计基础》第八周课下作业

2017-2018-1 20155318 《信息安全系统设计基础》第八周课下作业

作业一

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

作业4.47

  • 书写一个C版本的冒泡排序法,void bubble_a(int *data, int count)用指针引用数组元素,main函数中测试代码如下:
void main()
{
    int data[5]={4,3,2,1,0};
    int i;
    bubble_a(data,5);
    for(i=0;i<5;i++)
    {
        printf("%2d",data[i]);
    }
}
  • 代码链接

  • 运行结果

  • 书写并测试一个由这个函数和测试代码组成的Y86-64程序

  • X86-64汇编:

  • 主函数

main:
.LFB2:
    .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
    movl    $0, %eax
    call    bubble_a
    movl    $0, -36(%rbp)
    jmp .L2
.L3:
    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)
.L2:
    cmpl    $4, -36(%rbp)
    jle .L3
    movl    $10, %edi
    call    putchar
    nop
    movq    -8(%rbp), %rax
    xorq    %fs:40, %rax
    je  .L4
    call    __stack_chk_fail
.L4:
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE2:
    .size   main, .-main
    .globl  bubble_a
    .type   bubble_a, @function
  • 功能函数:
bubble_a:
.LFB3:
    .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 .L6
.L10:
    movl    -8(%rbp), %eax
    subl    $1, %eax
    movl    %eax, -12(%rbp)
    jmp .L7
.L9:
    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 .L8
    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)
.L8:
    subl    $1, -12(%rbp)
.L7:
    cmpl    $0, -12(%rbp)
    jns .L9
    addl    $1, -8(%rbp)
.L6:
    movl    -8(%rbp), %eax
    cmpl    -28(%rbp), %eax
    jl  .L10
    nop
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE3:
    .size   bubble_a, .-bubble_a
    .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
    .section    .note.GNU-stack,"",@progbits
  • X86-64机器码:
000000000000009e <bubble_a>:
  9e:   55                      push   %rbp
  9f:   48 89 e5                mov    %rsp,%rbp
  a2:   48 89 7d e8             mov    %rdi,-0x18(%rbp)
  a6:   89 75 e4                mov    %esi,-0x1c(%rbp)
  a9:   c7 45 f8 01 00 00 00    movl   $0x1,-0x8(%rbp)
  b0:   e9 ba 00 00 00          jmpq   16f <bubble_a+0xd1>
  b5:   8b 45 f8                mov    -0x8(%rbp),%eax
  b8:   83 e8 01                sub    $0x1,%eax
  bb:   89 45 f4                mov    %eax,-0xc(%rbp)
  be:   e9 9e 00 00 00          jmpq   161 <bubble_a+0xc3>
  c3:   8b 45 f4                mov    -0xc(%rbp),%eax
  c6:   48 98                   cltq   
  c8:   48 83 c0 01             add    $0x1,%rax
  cc:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
  d3:   00 
  d4:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  d8:   48 01 d0                add    %rdx,%rax
  db:   8b 10                   mov    (%rax),%edx
  dd:   8b 45 f4                mov    -0xc(%rbp),%eax
  e0:   48 98                   cltq   
  e2:   48 8d 0c 85 00 00 00    lea    0x0(,%rax,4),%rcx
  e9:   00 
  ea:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  ee:   48 01 c8                add    %rcx,%rax
  f1:   8b 00                   mov    (%rax),%eax
  f3:   39 c2                   cmp    %eax,%edx
  f5:   7d 66                   jge    15d <bubble_a+0xbf>
  f7:   8b 45 f4                mov    -0xc(%rbp),%eax
  fa:   48 98                   cltq   
  fc:   48 83 c0 01             add    $0x1,%rax
 100:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
 107:   00 
 108:   48 8b 45 e8             mov    -0x18(%rbp),%rax
 10c:   48 01 d0                add    %rdx,%rax
 10f:   8b 00                   mov    (%rax),%eax
 111:   89 45 fc                mov    %eax,-0x4(%rbp)
 114:   8b 45 f4                mov    -0xc(%rbp),%eax
 117:   48 98                   cltq   
 119:   48 83 c0 01             add    $0x1,%rax
 11d:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
 124:   00 
 125:   48 8b 45 e8             mov    -0x18(%rbp),%rax
 129:   48 01 c2                add    %rax,%rdx
 12c:   8b 45 f4                mov    -0xc(%rbp),%eax
 12f:   48 98                   cltq   
 131:   48 8d 0c 85 00 00 00    lea    0x0(,%rax,4),%rcx
 138:   00 
 139:   48 8b 45 e8             mov    -0x18(%rbp),%rax
 13d:   48 01 c8                add    %rcx,%rax
 140:   8b 00                   mov    (%rax),%eax
 142:   89 02                   mov    %eax,(%rdx)
 144:   8b 45 f4                mov    -0xc(%rbp),%eax
 147:   48 98                   cltq   
 149:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
 150:   00 
 151:   48 8b 45 e8             mov    -0x18(%rbp),%rax
 155:   48 01 c2                add    %rax,%rdx
 158:   8b 45 fc                mov    -0x4(%rbp),%eax
 15b:   89 02                   mov    %eax,(%rdx)
 15d:   83 6d f4 01             subl   $0x1,-0xc(%rbp)
 161:   83 7d f4 00             cmpl   $0x0,-0xc(%rbp)
 165:   0f 89 58 ff ff ff       jns    c3 <bubble_a+0x25>
 16b:   83 45 f8 01             addl   $0x1,-0x8(%rbp)
 16f:   8b 45 f8                mov    -0x8(%rbp),%eax
 172:   3b 45 e4                cmp    -0x1c(%rbp),%eax
 175:   0f 8c 3a ff ff ff       jl     b5 <bubble_a+0x17>
 17b:   90                      nop
 17c:   5d                      pop    %rbp
 17d:   c3                      retq
  • 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次条件传送

  1 #include<stdio.h>
  2 
  3 void bubble_a(long *data,long count)
  4 {
  5     long i,last,t,j;
  6     for(last = count-1;last>0;last--)
  7     {
  8         for(i = 0;i<last;i++)
  9         {
 10            t=*(data+i)-*(data+i+1); 
 11            if(t>0){
 12                 *(data+i)=t;
 13                 *(data+i)=*(data+i+1);
 14                 *(data+i+1)=t;
 15             }
 16         }
 17     }
 18 }
 19 int main()
 20 {
 21     int i;
 22     long data[10] = {2,3,4,5,6,7,8,9,0,1};
 23     bubble_a(data,10);
 24     for(i=0;i<10;i++)
 25     {
 26         printf("%d
",*(data+i));
 27     }
 28     return 0;
 29 }

X86-64汇编:

bubble_c:
.LFB3:
    .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 .L6
.L9:
    movl    -12(%rbp), %eax
    subl    $1, %eax
    movl    %eax, -16(%rbp)
    jmp .L7
.L8:
    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)
.L7:
    cmpl    $0, -16(%rbp)
    jns .L8
    addl    $1, -12(%rbp)
.L6:
    movl    -12(%rbp), %eax
    cmpl    -28(%rbp), %eax
    jl  .L9
    nop
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE3:
    .size   bubble_c, .-bubble_c
    .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
    .section    .note.GNU-stack,"",@progbits

X86-64机器码:

000000000000009e <bubble_c>:
  9e:   55                      push   %rbp
  9f:   48 89 e5                mov    %rsp,%rbp
  a2:   48 89 7d e8             mov    %rdi,-0x18(%rbp)
  a6:   89 75 e4                mov    %esi,-0x1c(%rbp)
  a9:   c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%rbp)
  b0:   e9 97 00 00 00          jmpq   14c <bubble_c+0xae>
  b5:   8b 45 f4                mov    -0xc(%rbp),%eax
  b8:   83 e8 01                sub    $0x1,%eax
  bb:   89 45 f0                mov    %eax,-0x10(%rbp)
  be:   eb 7e                   jmp    13e <bubble_c+0xa0>
  c0:   8b 45 f0                mov    -0x10(%rbp),%eax
  c3:   48 98                   cltq   
  c5:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
  cc:   00 
  cd:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  d1:   48 01 d0                add    %rdx,%rax
  d4:   8b 00                   mov    (%rax),%eax
  d6:   89 45 f8                mov    %eax,-0x8(%rbp)
  d9:   8b 45 f0                mov    -0x10(%rbp),%eax
  dc:   48 98                   cltq   
  de:   48 83 c0 01             add    $0x1,%rax
  e2:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
  e9:   00 
  ea:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  ee:   48 01 d0                add    %rdx,%rax
  f1:   8b 00                   mov    (%rax),%eax
  f3:   89 45 fc                mov    %eax,-0x4(%rbp)
  f6:   8b 45 f0                mov    -0x10(%rbp),%eax
  f9:   48 98                   cltq   
  fb:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
 102:   00 
 103:   48 8b 45 e8             mov    -0x18(%rbp),%rax
 107:   48 01 c2                add    %rax,%rdx
 10a:   8b 45 fc                mov    -0x4(%rbp),%eax
 10d:   39 45 f8                cmp    %eax,-0x8(%rbp)
 110:   0f 4e 45 f8             cmovle -0x8(%rbp),%eax
 114:   89 02                   mov    %eax,(%rdx)
 116:   8b 45 f0                mov    -0x10(%rbp),%eax
 119:   48 98                   cltq   
 11b:   48 83 c0 01             add    $0x1,%rax
 11f:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
 126:   00 
 127:   48 8b 45 e8             mov    -0x18(%rbp),%rax
 12b:   48 01 c2                add    %rax,%rdx
 12e:   8b 45 f8                mov    -0x8(%rbp),%eax
 131:   39 45 fc                cmp    %eax,-0x4(%rbp)
 134:   0f 4d 45 fc             cmovge -0x4(%rbp),%eax
 138:   89 02                   mov    %eax,(%rdx)
 13a:   83 6d f0 01             subl   $0x1,-0x10(%rbp)
 13e:   83 7d f0 00             cmpl   $0x0,-0x10(%rbp)
 142:   0f 89 78 ff ff ff       jns    c0 <bubble_c+0x22>
 148:   83 45 f4 01             addl   $0x1,-0xc(%rbp)
 14c:   8b 45 f4                mov    -0xc(%rbp),%eax
 14f:   3b 45 e4                cmp    -0x1c(%rbp),%eax
 152:   0f 8c 5d ff ff ff       jl     b5 <bubble_c+0x17>
 158:   90                      nop
 159:   5d                      pop    %rbp
 15a:   c3                      retq   

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

作业4.49

不使用跳转,最多使用1次条件传送,需借助栈来保存其中一个操作数的值。代码如下:

  1 #include<stdio.h>
  2 #include"duizhan.h"
  3 
  4 void bubble_a(long *data,long count)
  5 {
  6     long i,last,t,j;
  7     struct Stack* ps;
  8     init(ps);
  9     for(last = count-1;last>0;last--)
 10     {
 11         for(i = 0;i<last;i++)
 12         {
 13              j=*(data+i)-*(data+i+1);
 14             if(j>0)
 15             {
 16                 push(ps,*(data+i+1));
 17                 *(data+i+1)=*(data+i);
 18                 pop(ps,data+i);
 19             }
 20         }
 21     }
 22 }
 23 int main()
 24 {
 25     int i;
 26     long data[10] = {2,3,4,5,6,7,8,9,0,1};
 27     bubble_a(data,10);
 28     for(i=0;i<10;i++)
 29     {
 30         printf("%d
",*(data+i));
 31     }
 32     return 0;
 33 }

需要先编辑一个包含栈操作的头文件duizhan.h,其中包含栈的初始化函数init(),入栈函数push(),弹栈函数pop()

  • X86-64汇编:
bubble_c:
.LFB3:
    .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 .L6
.L9:
    movl    -12(%rbp), %eax
    subl    $1, %eax
    movl    %eax, -16(%rbp)
    jmp .L7
.L8:
    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)
.L7:
    cmpl    $0, -16(%rbp)
    jns .L8
    addl    $1, -12(%rbp)
.L6:
    movl    -12(%rbp), %eax
    cmpl    -28(%rbp), %eax
    jl  .L9
    nop
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE3:
    .size   bubble_c, .-bubble_c
    .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
    .section    .note.GNU-stack,"",@progbits
  • X86-64机器码:
0000000000000094 <bubble_c>:
  94:   55                      push   %rbp
  95:   48 89 e5                mov    %rsp,%rbp
  98:   48 89 7d e8             mov    %rdi,-0x18(%rbp)
  9c:   89 75 e4                mov    %esi,-0x1c(%rbp)
  9f:   c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%rbp)
  a6:   e9 8c 00 00 00          jmpq   137 <bubble_c+0xa3>
  ab:   8b 45 f4                mov    -0xc(%rbp),%eax
  ae:   83 e8 01                sub    $0x1,%eax
  b1:   89 45 f0                mov    %eax,-0x10(%rbp)
  b4:   eb 77                   jmp    12d <bubble_c+0x99>
  b6:   8b 45 f0                mov    -0x10(%rbp),%eax
  b9:   48 98                   cltq   
  bb:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
  c2:   00 
  c3:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  c7:   48 01 d0                add    %rdx,%rax
  ca:   8b 00                   mov    (%rax),%eax
  cc:   89 45 f8                mov    %eax,-0x8(%rbp)
  cf:   8b 45 f0                mov    -0x10(%rbp),%eax
  d2:   48 98                   cltq   
  d4:   48 83 c0 01             add    $0x1,%rax
  d8:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
  df:   00 
  e0:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  e4:   48 01 d0                add    %rdx,%rax
  e7:   8b 00                   mov    (%rax),%eax
  e9:   89 45 fc                mov    %eax,-0x4(%rbp)
  ec:   8b 45 f0                mov    -0x10(%rbp),%eax
  ef:   48 98                   cltq   
  f1:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
  f8:   00 
  f9:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  fd:   48 01 c2                add    %rax,%rdx
 100:   8b 45 fc                mov    -0x4(%rbp),%eax
 103:   39 45 f8                cmp    %eax,-0x8(%rbp)
 106:   0f 4e 45 f8             cmovle -0x8(%rbp),%eax
 10a:   89 02                   mov    %eax,(%rdx)
 10c:   8b 45 f0                mov    -0x10(%rbp),%eax
 10f:   48 98                   cltq   
 111:   48 83 c0 01             add    $0x1,%rax
 115:   48 8d 14 85 00 00 00    lea    0x0(,%rax,4),%rdx
 11c:   00 
 11d:   48 8b 45 e8             mov    -0x18(%rbp),%rax
 121:   48 01 c2                add    %rax,%rdx
 124:   8b 45 f8                mov    -0x8(%rbp),%eax
 127:   89 02                   mov    %eax,(%rdx)
 129:   83 6d f0 01             subl   $0x1,-0x10(%rbp)
 12d:   83 7d f0 00             cmpl   $0x0,-0x10(%rbp)
 131:   79 83                   jns    b6 <bubble_c+0x22>
 133:   83 45 f4 01             addl   $0x1,-0xc(%rbp)
 137:   8b 45 f4                mov    -0xc(%rbp),%eax
 13a:   3b 45 e4                cmp    -0x1c(%rbp),%eax
 13d:   0f 8c 68 ff ff ff       jl     ab <bubble_c+0x17>
 143:   90                      nop
 144:   5d                      pop    %rbp
 145:   c3                      retq
  • 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

多进程实现daytime服务器

  • 服务器
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<sys/socket.h>
#include<sys/types.h>       //pthread_t , pthread_attr_t and so on.
#include<netinet/in.h>      //structure sockaddr_in
#include<arpa/inet.h>       //Func : htonl; htons; ntohl; ntohs
#include<assert.h>          //Func :assert
#include<string.h>          //Func :memset
#include<unistd.h>          //Func :close,write,read
#include<ctype.h>
#include<arpa/inet.h>
#include <time.h>
#define SOCK_PORT 9988
#define BUFFER_LENGTH 1024
#define MAX_CONN_LIMIT 5    //MAX connection limit

static void Data_handle(void * sock_fd);
struct sockaddr_in s_addr_in;
struct sockaddr_in s_addr_client;
int sockfd;

int main()
{
int sockfd_server;
int fd_temp;
int client_length;

sockfd_server = socket(AF_INET,SOCK_STREAM,0);  //ipv4,TCP
assert(sockfd_server != -1);

//before bind(), set the attr of structure sockaddr.
memset(&s_addr_in,0,sizeof(s_addr_in));
s_addr_in.sin_family = AF_INET;
s_addr_in.sin_addr.s_addr = htonl(INADDR_ANY);  //trans addr from uint32_t host byte order to network byte order.
s_addr_in.sin_port = htons(SOCK_PORT);          //trans port from uint16_t host byte order to network byte order.

fd_temp = bind(sockfd_server,(struct scokaddr*)(&s_addr_in),sizeof(s_addr_in));

if(fd_temp == -1)
{
fprintf(stderr,"bind error!
");
exit(1);
}

fd_temp = listen(sockfd_server,MAX_CONN_LIMIT);

if(fd_temp == -1)
{
fprintf(stderr,"listen error!
");
exit(1);
}

while(1)
{
//printf("waiting for new connection...
");
pthread_t thread_id;
client_length = sizeof(s_addr_client);

//Block here. Until server accpets a new connection.
sockfd = accept(sockfd_server,(struct sockaddr*)(&s_addr_client),&client_length);

time_t t = time(0);
char tmp[64];
strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A
	", localtime(&t) );
send(sockfd,tmp,strlen(tmp),0);
close(sockfd);  //close a file descriptor.
if(sockfd == -1)
{
fprintf(stderr,"Accept error!
");
continue;                               //ignore current socket ,continue while loop.
}

if(pthread_create(&thread_id,NULL,(void *)(&Data_handle),(void *)(&sockfd)) == -1)
{
fprintf(stderr,"pthread_create error!
");
break;                                  //break while loop
}
}

//Clear
int ret = shutdown(sockfd_server,SHUT_WR); //shut down the all or part of a full-duplex connection.
assert(ret != -1);

return 0;
}

static void Data_handle(void * sock_fd)
{
int fd = *((int *)sock_fd);
int i_recvBytes;
char data_recv[BUFFER_LENGTH];

printf("服务器实现者20155318	");
printf("客户端IP:%s
",inet_ntoa(s_addr_client.sin_addr));
pthread_exit(NULL);   //terminate calling thread!
}
  • 客户端
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/wait.h>
#include<signal.h>
#include<errno.h>
#include<pthread.h>
#include <pthread.h>

#define SERV_PORT 13321
#define SERV_IP "127.0.0.1"
#define NUM 3

int std_err(const char* name)
{
    perror(name);
	    exit(1);
}
int main(void)
{
	int cfd, ret;
	char buf[BUFSIZ];
	pid_t pid;
	int i;
	//创建套节字
	cfd = socket(AF_INET, SOCK_STREAM, 0);
	if(cfd == -1)
		std_err("socket");
	//定义IP , 端口
	struct sockaddr_in clie_addr;
	clie_addr.sin_family = AF_INET;
	clie_addr.sin_port = htons(SERV_PORT);
	//转换IP 字符串的地址
	ret = inet_pton(AF_INET, SERV_IP, &clie_addr.sin_addr.s_addr);
	if(ret != 1)
		std_err("inet_pton");
	//链接服务器
	ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr));
	if(ret == -1)
	std_err("connect");
	char buff[256];
	int nRecv=recv(cfd,buff,256,0);
	if(nRecv>0)
	{   
		buff[nRecv]='';
		printf("当前时间:%s
",buff);
	} 
	
	//关闭套节字
	close(cfd);
	return 0;

}
  • 运行截图
原文地址:https://www.cnblogs.com/lxy1997/p/7823598.html