作業搭檔20135316王劍橋20135332武西垚
3.61
題中**在迴圈時會產生6
個臨時的變數,故共需要六個暫存器在存放資料,但是由於處理器的六個暫存器中,
%esp
和%ebp
不能用於存放臨時資料,而且另外乙個暫存器還必須用來儲存乘法指令的結果。因此必須將迴圈中的值的數量減少到5個。
當沒有足夠多的暫存器來儲存臨時資料時,編譯器必須把一些區域性變數放到儲存器中
由於在每次迴圈中**從儲存器中取出n
的值進行檢查迴圈是否終止,所以我覺得可以去掉每次的減產環節,直接用立即數來控制迴圈結束。**如下:
int var_prod_ele(int n, int a[n][n], int b[n][n], int i, int k)
但是這樣得到的結果仍然會使用到儲存器。
按下面的**,迴圈裡面貌似就沒有用到儲存器。
但是用到了乙個常量4
,就是增加
a的時候,會
add 4
。只需要result,a
,e,b
,4n這五個變數。
思路如下,先初始化a
陣列的行和
b陣列的列,記住他們的位址,同時記住
a陣列那一行最後乙個元素的位址,之後迴圈每次用變換的
a陣列行位址和
a陣列最後乙個元素位址進行比較來控制迴圈的結束。若沒有到達
a陣列行的最後乙個元素,則
a陣列依次向後移動,
b陣列依次向下移動,直到最後達到最後乙個元素。**如下:
int var_prod_ele(int n, int a[n][n], int b[n][n], int i, int k)
return result;
}3.63
e1和e2是用#define宣告的巨集表示式,用引數表示a矩陣的維度。
int sum_col(int n, int a[e1(n)][e2(n)],int j) {
int i;
int result = 0;
for (i = 0; i < e1(n); i++)
result += a[i][j];
return result;
1.分析通過資訊交換所得的觀察。
最常用於協議逆向工程,涉及使用匯流排分析器和資料報嗅探器。在接入計算機匯流排或網路的連線,並成功擷取通訊資料後,可以對匯流排或網路行為進行分析,以製造出擁有相同行為的通訊實現。此法特別適用於裝置驅動程式的逆向工程。有時,由硬體製造商特意所做的工具,如jtag埠或各種除錯工具,也有助於嵌入式系統的逆向工程。對於微軟的windows系統,受歡迎的底層偵錯程式有softice。
2.反彙編,即使用反彙編器,把程式的原始機器碼,翻譯成較便於閱讀理解的彙編**。這適用於任何的電腦程式,對不熟悉機器碼的人特別有用。流行的相關工具有ollydebug和ida。
3.反編譯,即使用反編譯器,嘗試從程式的機器碼或位元組碼,重現高階語言形式的源**。
e1(n)在
esi中,
esi = 3n
。e2(n)在
ebx中,
ebx = 4*e2(n) = 4*(2n-1)
。所以e2(n) = 2n-1
。
20135223何偉欽 第三章家庭作業
3.54解析 此題較為簡單,只要對號入座,即可寫出相應的c語言 3.56解析 1 由c 函式的定義可先猜測得 esi x,ebx n 由result mask初始化以迴圈表示式的mask的使用可得 edi result,edx為mask,即是 暫存器 變數 esi x ebx n edi resul...
20135202閆佳歆 第三章家庭作業 3 63
原來的函式 int sum col int n,int a e1 n e2 n int j int i int result 0 for i 0 i轉化為goto 的版本 int sum col int n,int a e1 n e2 n int j int i 0 int result 0 if ...
第三章作業
1.完成課本每乙個程式設計題。要求先畫出流程演算法圖或n s圖,然後程式設計實現,有可能的話使用兩種以上方法 2.程式設計求 百錢百雞 問題。雞翁一值錢五,雞母 一值錢三,雞雛三值錢一。百錢買百雞,問雞翁 雞母 雞雛各幾何?3.程式設計輸入乙個整數,計算它是幾位數字,分別輸出每一位數字,並輸出各個數...