20155212 2017-2018-1 《信息安全系統(tǒng)設(shè)計》第8周課下作業(yè) 題目1 完成家庭作業(yè)4.47,4.48,4.49 相應(yīng)代碼反匯編成X86-64匯編 把上述X86-64匯編翻譯成Y86匯編,并給出相應(yīng)機(jī)器碼 發(fā)操作過程、測試、問題解決過程博客鏈接 4.47 A. 書寫并測試一個C版本,用指針引用數(shù)組元素,而不是用數(shù)組索引。 #include <stdio.h>
/*Bubble sorts:Pointer version*/
void bubble_p(long *data,int count){long i, last, t;for(last = count-1; last > 0; last--){ for(i = 0; i < last; i++){if(*(data+i+1)<*(data+i)){t = *(data+i+1);*(data+i+1) = *(data+i);*(data+i) = t;}}}
}void main(){int i;long data[5]={4, 1, 0, 2, 3};bubble_p(data, 5);for(i=0; i<5; i++){printf("%ld\t", *(data+i));}printf("\n");
}
B. 書寫并測試這個函數(shù)和測試代碼組成的Y86-64程序。 使用gcc -E Bubble.c -Og -o Bubble1.i、gcc -S Bubble.c -Og -o Bubble1.s編譯代碼,這樣生成符合原始C代碼整體結(jié)構(gòu)的機(jī)器代碼的優(yōu)化等級,便于理解。 X86-64匯編代碼 bubble_p:leal -1(%rsi), %r9dmovslq %r9d, %r9jmp .L2
.L4:leaq 8(%rdi,%rax,8), %rsimovq (%rsi), %rcxleaq (%rdi,%rax,8), %rdxmovq (%rdx), %r8cmpq %r8, %rcxjge .L3movq %r8, (%rsi)movq %rcx, (%rdx)
.L3:addq $1, %raxjmp .L5
.L6:movl $0, %eax
.L5:cmpq %r9, %raxjl .L4subq $1, %r9
.L2:testq %r9, %r9jg .L6rep ret
.LC0:
main:pushq %rbxsubq $48, %rspmovq %fs:40, %raxmovq %rax, 40(%rsp)xorl %eax, %eaxmovq $4, (%rsp)movq $1, 8(%rsp)movq $0, 16(%rsp)movq $2, 24(%rsp)movq $3, 32(%rsp)movl $5, %esimovq %rsp, %rdicall bubble_pmovl $0, %ebxjmp .L8
.L9:movslq %ebx, %raxmovq (%rsp,%rax,8), %rdxmovl $.LC0, %esimovl $1, %edimovl $0, %eaxcall __printf_chkaddl $1, %ebx
.L8:cmpl $4, %ebxjle .L9movl $10, %edicall putcharmovq 40(%rsp), %raxxorq %fs:40, %raxje .L10call __stack_chk_fail
.L10:addq $48, %rsppopq %rbxret
.pos 0irmovq stack,%rspcall mainhalt
bubble_p:irmovq $1, %r8subq %r8, %rsirrmovq %rsi, %r9rrmovq %r9, %r9jmp .L2
.L4:addq %rax, %raxaddq %rax, %raxaddq %rax, %raxaddq %rdi, %raxirmovq $8, %r10addq %r10, %raxrrmovq %rax, %rsimrmovq (%rsi), %rcxrrmovq %rax, %r8addq %r8, %r8addq %r8, %r8addq %r8, %r8addq %rdi, %r8rrmovq %r8, %rdxmrmovq (%rdx), %r8rrmovq %rcx, %r10subq %r8, %r10jge .L3rmmovq %r8, (%rsi)rmmovq %rcx, (%rdx)
.L3:irmovq $1, %r8addq %r8, %raxjmp .L5
.L6:irmovq $0, %r8rrmovq %r8, %rax
.L5:rrmovq %rax, %r10subq %r9, %r10
.L2:jg .L6ret
main:pushq %rbpirmovq $48, %r8rrmovq %r8, %rspxorq %rax, %raxirmovq $4, %r8rmmovq %r8, (%rbp)irmovq $1, %r8rmmovq %r8, 8(%rbp)irmovq $0, %r8rmmovq %r8, 16(%rbp)irmovq $2, %r8rmmovq %r8, 24(%rbp)irmovq $3, %r8rmmovq %r8, 32(%rbp)irmovq $5, %r8rrmovq %r8, %rsirrmovq %rsp, %rdicall bubble_pirmovq $0, %r9rrmovq %r9 ,%rbxjmp .L8
.L9:rrmovq %rbx, %raxrrmovq %rax, %r8addq %r8, %r8addq %r8, %r8addq %r8, %r8addq %rsp, %r8rrmovq %r8, %rdxirmovq $1, %r10rrmovq %r10, %rdiirmovq $0, %r8rrmovq %r8, %raxcall _printf_chkrrmovq %r10, %rbx
.L8:irmovq $4, %rbxjle .L9irmovq $10, %rdicall putcharmrmovq 40(%rsp), %raxje .L10call _stack_chk_fail
.L10:irmovq $48, %r8addq %r8, %rsppopq %rbxret.pos 0x200
stack:
主要修改內(nèi)容 leaq:要與``movq```類區(qū)分開 movq:要根據(jù)源和目的的類型劃分為不同的四種命令 addq類:必須是寄存器之間才能操作 cmpq:將第二操作數(shù)放到新寄存器,然后subq 4.48 不使用跳轉(zhuǎn),最多使用3次條件傳送 - 代碼 ``` #include <stdio.h> /Bubble sorts:Pointer version/ void bubble_p(long data,int count){ long i, last, t; for(last = count-1; last > 0; last--){ for(i = 0; i < last; i++){ if((data+i+1)<(data+i)){ t = (data+i)-(data+i+1); if(t>0){ t = (data+i); (data+i) = (data+i+1); *(data+i+1) = t; } } } } }
void main(){ int i; long data[5]={4, 1, 0, 2, 3}; bubble_p(data, 5); for(i=0; i<5; i++) { printf("%ld\t", *(data+i)); } printf("\n"); } ``` 分析:通過“t=(data+i)-(data+i+1)”來設(shè)置條件碼,通過comvg條件傳送指令實現(xiàn)if(t>0)中的三個賦值語句 4.48 不使用跳轉(zhuǎn),最多使用1次條件傳送 #include <stdio.h>
#include <stack>
using namespace std;/*Bubble sorts:Pointer version*/
void bubble_p(long *data, int count) {long i, last, t;stack <long> S;for (last = count - 1; last > 0; last--) {for (i = 0; i < last; i++) {if (*(data + i + 1)<*(data + i)) {t = *(data + i) - *(data + i + 1);if (t>0) {S.push(*(data+i+1));*(data + i + 1) = *(data+i);*(data + i) = S.top();S.pop();}}}}
}void main() {int i;long data[5] = { 4, 1, 0, 2, 3 };bubble_p(data, 5);for (i = 0; i<5; i++){printf("%ld\t", *(data + i));}printf("\n");
} 基于socket 使用教材的csapp.h, csapp.c
實現(xiàn)daytime(13)服務(wù)器(端口我們使用13+后三位學(xué)號)和客戶端 服務(wù)器響應(yīng)消息格式是 “ 客戶端IP:XXXX 服務(wù)器實現(xiàn)者學(xué)號:XXXXXXXX 當(dāng)前時間: XX:XX:XX ”
提交一個客戶端至少查詢?nèi)螘r間的截圖測試截圖 提交至少兩個客戶端查詢時間的截圖測試截圖
Daytime
DAYTIME協(xié)議是基于TCP的應(yīng)用,是一種有用的調(diào)試工具,它的作用是返回當(dāng)前時間和日期,格式是字符串格式。
基于TCP 的daytime服務(wù):daytime服務(wù)是基于TCP的應(yīng)用,服務(wù)器在TCP端口13偵聽,一旦有連接建立就返回ASCII形式的日期和時間,在傳送完后關(guān)閉連接。接收到的數(shù)據(jù)被忽略。 基于UDP 的daytime服務(wù):daytime服務(wù)也可以使用UDP協(xié)議,它的端口也是13,不過UDP是用數(shù)據(jù)報傳送當(dāng)前時間的。接收到的數(shù)據(jù)被忽略。 Daytime格式:Weekday, Month Day, Year Time-Zone 使用man -k time | grep 2查看系統(tǒng)調(diào)用 使用man 2 time查看time() 查看localtime() tm結(jié)構(gòu)體 c struct tm { int tm_sec; /* Seconds (0-60) */ int tm_min; /* Minutes (0-59) */ int tm_hour; /* Hours (0-23) */ int tm_mday; /* Day of the month (1-31) */ int tm_mon; /* Month (0-11) */ int tm_year; /* Year - 1900 */ int tm_wday; /* Day of the week (0-6, Sunday = 0) */ int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */ int tm_isdst; /* Daylight saving time */ };
多線程結(jié)果 多進(jìn)程結(jié)果
轉(zhuǎn)載于:https://www.cnblogs.com/dky20155212/p/7823349.html
總結(jié)
以上是生活随笔 為你收集整理的20155212 2017-2018-1 《信息安全系统设计》第8周课下作业 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。