您的位置:首页 > 其它

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

2017-11-12 23:52 666 查看

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

作业一

完成家庭作业4.47,4.48,4.49

相应代码反汇编成X86-64汇编

把上述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\n",*(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\n",*(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!\n");
exit(1);
}

fd_temp = listen(sockfd_server,MAX_CONN_LIMIT);

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

while(1)
{
//printf("waiting for new connection...\n");
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\n\t", localtime(&t) );
send(sockfd,tmp,strlen(tmp),0);
close(sockfd);  //close a file descriptor.
if(sockfd == -1)
{
fprintf(stderr,"Accept error!\n");
continue;                               //ignore current socket ,continue while loop.
}

if(pthread_create(&thread_id,NULL,(void *)(&Data_handle),(void *)(&sockfd)) == -1)
{
fprintf(stderr,"pthread_create error!\n");
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\t");
printf("客户端IP:%s\n",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]='\0';
printf("当前时间:%s\n",buff);
}

//关闭套节字
close(cfd);
return 0;

}


运行截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐