ics小班第二次作业

3.58

long decode2(long x,long y,long z)
{
    return (((y-z)<<63)>>63)^((y-z)*x)
}

3.59

用x0,y0来表示x,y的低位,x1,y1来表示x,y的高位
xy=(x0+x1264)*(y0+y1*264)
=x0y0+x1y02^64+x0y12^64+x1y12^642^64
最后一项超过128位且在128位以内的部分为零所以可以舍去最后一项
x0y0也可能超过64位,设超过位z1,未超过的位z0
x
y=2^64(x1y0+x0y1+z1)+z0
所以z0要放在低位,其余的放在高位

 movq   %rdx, %rax   #%rax = y0.
    cqto                 #有符号运算,因此用cqto,这里会自动关联%rdx和%rax分别表示高位和低位,假如y是负数,那么%rdx所有位都是1(此时值是-1),否则,%rdx全为0, %rdx = y1.
    movq   %rsi, %rcx   # %rcx = x0.
    sarq   $63,  %rcx   # 将%rcx向右移63位,跟%rdx的含义一样,要么是-1,要么是0, %rcx = x1.
    imulq  %rax, %rcx   # %rcx = y0 * x1
    imulq  %rsi, %rdx   # %rdx = x0 * y1
    addq   %rdx, %rcx   # %rcx = y0 * x1 + x0 * y1
    mulq   %rsi         # 无符号计算 x0*y0,并将x0*y0的128位结果的高位放在%rdx,低位放在%rax,因此这里%rdx = z1, %rax = z0.
    addq   %rcx, %rdx   # %rdx = y0*x1+x0*y1+z1
    movq   %rax, (%rdi) # 将%rax的值放到结果的低位
    movq   %rdx, 8(%rdi)# 将%rdx的值放到结果的高位
    ret

3.60

long loop(long x,int n)
{
    long result=0;
    long mask;
    for(mask=1;mask!=0;mask=mask<<(n&0xff))
    result|=mask&x;
 } 

A. %rdi 存x
%esi存n
%rax存result
%rdx存mask
B.result 初始值为0
mask初始值为1
C.mask!=0;
D.mask=mask<<(n&0xff)
E.result|=mask&x;

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.64

A.

&D[i][j][k] = XD + L(i * S * T + j * T + k)

B.
由A题目中的公式以及汇编至第9行第10行计算出来的可得:
S * T = 65
T = 13
S * T * R * 8 = 3640
R = 7
S = 5
T = 13

你可能感兴趣的:(ics小班第二次作业)