128bit符号なし整数を、2個の64bit符号なし整数からなる配列で表現するとする。128bit整数同士の加算を行うadd128関数をアセンブリで実装せよ。たとえばmainは下記のように実装可能である。(0番目の要素が下位ビット、1番目の要素が上位ビットを表現している。下記例に従ってください。
#include <stdio.h>
void add128(unsigned long long int*, unsigned long long int*, unsigned long long int*);
int main(void){
unsigned long long int a[2] = {0xA05F44019BD79748ULL, 0x0000000000003995ULL};
unsigned long long int b[2] = {0x7B6F88EC052868B8ULL, 0x0000000000009A2CULL};
unsigned long long int c[2];
add128(a, b, c);
printf("%llx,%llx\n", c[0], c[1]);
return 0;
}
なお、上記の実行結果はc= {1BCECCEDA1000000, D3C2}となる。
締切: 12/19 23:59
2つのベクトルの内積を求める関数dotをアセンブリで実装せよ。値がNULLやINFである場合は考慮しなくて良い。nはベクトルの要素数を表し、nは1以上であるものとする。
double dot(size_t n, const double v[], const double w[]);
実行例:
dot(2, (double[]){-2.32, 23.3}, (double[]){10.9, 2.5}) = 32.962 (誤差は許容する)
dot(6, (double[]){0.0783, 4.57, 13.1, -5.45, 9.60, 9.07}, (double[]){-5.85, 0.397, 2.11, 4.04, 2.20, -3.48}) = -3.464365
締切: 12/19 23:59
整数を10進数の文字列に変換する関数itoa10をアセンブリで実装せよ。bufの必要なメモリ領域はCコード上で確保されているものとしてよい。
/* bufをそのまま返す */
char *itoa10(int n, char *buf);
つまり、strcmp(itoa10(-1201750177, buf), "-1201750177") == 0となればよい。
締切: 12/19 23:59