3.54int decode2(int x,int y,int z){ int t=z-y; int t2=t<<15; t2=t2>>15; return (x^t)*t2;}3.55movl 12(%ebp),%esi ;Get x的低位movl 20(%ebp),%eax ;Get ymovl %eax,%edxsarl $31,%edx ;取y的符号位movl %edx,%ecximull %esi,%ecx ;%ecx=x的低位*y的符号位(0或者-1)movl 16(%ebp),%ebx;Get x的高位imull %eax,%ebx ;%ebx=x的高位*yaddl %ebx,%ecx ;%ecx=x的高位*y+x的低位*y的符号位(0或者-1)mull %esi ;%edx=(x的低位*y)的高位 %eax=(x的低位*y)的低位leal (%ecx,%edx),%edxmovl 8(%ebp),%ecxmovl %eax,(%ecx)movl %edx,4(%ecx)(x的低位*y)的高位+x的高位*y+x的低位*y的符号位(0或者-1) 存储在高位(x的低位*y)的低位 存储在低位(xl*y)_h+xh*y+xl*-1(x1*y)_lxl=1000xh=0000y=1001x*yi=x*(yu-16)=x*yu-16x相当于高位=(x*yu)_h-x,低位=(x*yu)_l因为这里是mull无符号乘法3.56A.x:%esi,n:%ebx,result:%edi,mask:%edxB.result=0x55555555; //0101 0101 0101 0101 0101 0101 0101 0101mask=0x80000000;C.mask!=0D.mask每次循环右移n位E.result每次循环和x&mask的值进行异或F.int loop(int x,int n){ int result=0x55555555; int mask; for(mask=0x80000000;mask!=0;((unsigned)mask)>>n)//汇编中mask是逻辑右移,而mask是有符号整型应该先转成无符号整型才能保证C语言的右移操作符编译成汇编的逻辑右移 { result^=x&mask; } return result;}3.57int cread_alt(int *xp){ int t=0; int *p=xp?xp:&t; return *p;}3.58int switch3(int *p1,int *p2,mode_t action){ int result=0; switch(action) { case MODE_A: result=*p1; *p1=*p2; break; case MODE_B: result=*p1+*p2; *p2=result; break; case MODE_C: *p2=15; result=*p1; break; case MODE_D: *p2=*p1; case MODE_E: result=17; break; default: result=-1; break; } return result;}3.59int switch_PRob(int x,int n){ int result=x; switch(n) { case 40: case 42: result<<=3; break; case 43: result>>=3; break; case 44: result<<=3; result-=x; case 45: result*=result; case 41: //可以不要 default: result+=11; break; } return result;}3.60A.A[i][j][k]=A+((2^6-1)*i+9j+k)*4=A+(63i+9j+k)*4B.T=9S*T=63R*S*T=2772/4=693R=11 S=7 T=93.61int var_prod_ele(int n, int A[n][n], int B[n][n], int i, int k){ int result = 0; int *a = &A[i][0]; int *b = &B[0][k]; int *e = &A[i][n]; for(;a!=e;) { result += *a * *b; b+=n; a++; } return result;}下面是其汇编代码的循环部分:edi是4*n,ebx和edx分别是b和a,esi是e,eax是result。ecx是用于存储乘法的寄存器。L4:movl (%ebx), %ecximull (%edx), %ecxaddl %ecx, %eaxaddl %edi, %ebxaddl $4, %edxcmpl %edx, %esijne L4result,Arow,Bcol,4*n这四个值耗费的存储器必不可少n的值转变为e的值耗费一个寄存器比较n和a的值,省掉了变量j,少用了一个寄存器3.62A.M=76/4=19B.i:%edi,j:ecxC.void transpose(int A[M][M]){ for(int i=0;i<M;i++) { int *Arr=&A[i][0]; int *Brr=&A[0][i]; for(int j=0;j<i;j++) { int t=*Arr; *Arr=*Brr; *Brr=t; Arr+=1; Brr+=M; } }}3.63#define E1(n) 3*n#define E2(n) 2*n-13.64A.8(%ebp) &s212(%ebp) s1.p16(%ebp) s1.vB.------------%ebps2.sums2.prods1.vs1.p&s2------------%espC.将结构的各个成员的值传递进方法D.调用者将返回值变量的地址传递进方法3.65A=3 B=73.66A.CNT=196/28=7B.typedef struct{ int idx; int x[6];}a_struct;ap->idx=*(bp+1c*i+4)*4ap->x[ap->idx]=(bp+4+28*i+4)+*(bp+0x1c*i+4)*4=bp+8+28i+*(bp+28i+4)*4=bp+8+4(7i+*(bp+28i+4))3.67A.e1.p:0e1.x:4e2.y:0e2.next:4B.8C.void proc(union ele *up){ up->e2.next->e1.x=*(up->e2.next->e1.p) - up->e2.y;}3.68void good_echo(){ char c; int x = 0; while( x=getchar(), x!='/n' && x!=EOF) { putchar(x); }}3.69A.long trace(tree_ptr tp){ long result=0; while(tp) { result=tp->val; tp=tp->left; } return result;}B.输出二叉树最左边节点的值3.70A.long traverse(tree_ptr tp){ if(!tp) return 9223372036854775807;//long.max long v=tp->val; long left=traverse(tp->left); long result=traverse(tp->right); if(left<result) result=left; if(result>v) result=v; return result;}B.求二叉树节点中最小的值原创地址:http://blog.csdn.net/maidou0921/article/details/53907971
新闻热点
疑难解答