3_58 csapp 第三版的答案


參考代碼了http://blog.csdn.net/scf0920/article/details/77543294

3.58##

看匯編寫c代碼
long decode(long x, long y,long z){
z-=y;
int ret=z*x;
z>>=63;
z<<=63;
ret^=z;
return ret;
}

3_59##

現將一個參數進行符號擴展
cqto
對rax進行符號擴展 ,置於rdx rax 中

然后用 符號>>63 可以得到另外一個參數的高64位
低位乘高位 高位乘低位 再相加,
最后低位乘低位(使用擴展乘法 只有一個參數的imulq指令)

3_60##

這個題和第二版出入較大

#include<stdio.h>
long loop(long x,int n){
	long result=0;
	long mask;
	for(mask=1;mask!=0;mask=mask<<n){
		result!=mask&x; 
	}
	return result;
}

這里要注意%cl 是%ecx的低位,

3_61##

這里要注意如果使用條件傳送指令就會預先計算好,各個分支的值,只要保證直接結算分支不會出錯就可以

long creadalt(long *xp){
int t;
int *p=xp? xp: &t;
return *p;
}

3_62##

匯編代碼的翻譯

case MODE_A:
    result = *p2;
    action = *p1;
    *p2 = action;
    break;
case MODE_B:
    result = *p1 + *p2;
    *p1 = result;
    break;
case MODE_C:
    *p1 = 59;
    result = *p2;
    break;
case MODE_D:
    result = *p2;
    *p1 = result;
    result = 27;
    break;
case MODE_E:
    result = 27;
    break;
default:
    result = 12;

3_63##

long switch_porb(long x,long n){
	long result=x;
	switch(n){
		case 65:
			x*=x;
		case 61:
			result=x+0x4b;
			break;
		case 63:
			result=x>>3;
			break;
		case 64:
			x*=15;
			result=x;
			break;
		default:
			result=x*8; 
	}
	return result;
}

參考代碼在這里有問題
多個選項指向一個區域意味着這個指針是default跳轉的地方,哪里處理的不好

3_71##

void good_echo(){
	char s[SIZE];
	char *p=fgets(s,SIZE,stdin);
	if(p==NULL){
		return;
	}
	puts(p);
}

雖然fgets函數接受一個chars 再把他返回,但是這種用p接受是很有必要的,因為並不是所有的情況都會把s原樣返回


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM