תאריך:
1. כתוב תוכנית ב-C שתגיד האם המערכת שאתה עובד בה היא big endian או little endian.
פתרון:
קוד: בחר הכל
int endian()
{
long int *buff;
short int i;
buff = (long*) malloc(sizeof(long));
*buff = 1;
(char) i = *buff;
if (i == 1)
{
return 1;//little
}
else
{
return 0; //big
}
}
2. ברשותך מעבד שתומך בפקודות הבאות:
mac(x,y,z) = x*y+z
H(Rx) = high bits of reg Rx
L(Rx) = low bits of Rx
המעבד יכול לבצע 2 פקודות במחזור.
לרשותך כמה רגיסטרים שתצטרך.
ממש את הפונקציה הבאה:
( ( (a – b)<<2 ) + c – d + 4)>>3
תוך שימוש בפקודות ובקבועי int.
פתרון:
פנים הסוגריים זה קל למימוש. הטריק של החלוקה ב-8 (3<<) הוא להזיז את ה-low bits של פיתרון פנים הסוגרים ב-13 (כלומר כפל ב-2^13) ולקחת את ה-high bits (אין גלישה כי מדובר על חיבור וכפל של int).
אם פותחים את הסוגריים בצורה הבאה למשל:
קוד: בחר הכל
(a – b)*2^15 + (c – d + 4)*2^13
ניתן לממש ב-3 מחזורים:
קוד: בחר הכל
R5 = mac(b, -1, a) || R6 = mac(d, -1, c)
R7 = mac(R5, 2^15, 0) || R8 = mac(R6, 1, 4)
R9 = mac(R8, 2^13, R7)
והתוצאה נמצאת ב-H(R9).