参考代码了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原样返回