1 inc counter counter 2 dec counter counter3

  • Slides: 16
Download presentation

 פקודות בסיסיות בשפת מכונה 1. inc counter : counter++ 2. dec counter :

פקודות בסיסיות בשפת מכונה 1. inc counter : counter++ 2. dec counter : counter-3. mov var 1, var 2 : var 2 = var 1 4. add var 1, var 2 : var 2 += var 1 5. sub var 1, var 2 : var 2 -= var 1 6. and mask, var 1 : var 1 = var 1 & mask – 2–

move שילובים אפשריים ב - תזכורת תבנית דוגמה C איך זה נראה ב move

move שילובים אפשריים ב - תזכורת תבנית דוגמה C איך זה נראה ב move constant register move $0 x 4, R 1 temp = 0 x 4; move constant memory move $-147, (R 1) *p = -147; move register move R 1, R 2 temp 2 = temp 1; move register memory move R 1, (R 2) *p = temp; move memory register move (R 1), R 2 temp = *p; move memory – 3– ILLEGAL!

1 תרגיל CPU זכרון ערך רגיסטר ערך כתובת 0 x 100 R 1 0

1 תרגיל CPU זכרון ערך רגיסטר ערך כתובת 0 x 100 R 1 0 x. FF 0 x 100 0 x 4 R 2 0 x. AB 0 x 104 0 x 100 R 6 0 x 13 0 x 108 0 x 10 C R 7 0 x 14 0 x 10 C 0 x 120 R 8 : נריץ את התכנית הבאה 1. move $0 x 4050, R 1 Immediate-> Registry 2. move R 8, R 7 Registr-> Registr 3. move (R 6, R 2) , R 1 Memory-> Registry 4. move $-17, (R 7) Immediate-> Memory R 7=0 x 120 R 1=0 x. AB M[0 x 120]=0 x. FFFFFFEF 5. move R 6, -12(R 8) Registry-> Memory M[0 x 114]=0 x 100 R 1=0 x 4050 ? מה יהיה הערך ביעד אחרי כל פקודה – 4–

 תרגיל 2 CPU זכרון כתובת ערך רגיסטר ערך 0 x 100 0 x.

תרגיל 2 CPU זכרון כתובת ערך רגיסטר ערך 0 x 100 0 x. FF R 1 0 x 100 0 x 104 0 x. AB R 2 0 x 108 0 x 13 R 3 0 x 10 C 0 x 14 נריץ את התכנית הבאה : ערך יעד לפני ערך אחרי פקודה add ) addl R 2, (R 1 0 x. FF 0 x 100 subtract ) subl R 3, 4(R 1 0 x. AB 0 x. A 8 multiply ) imull $16, (R 1, R 3, 4 0 x 140 increment ) incl 8(R 1 0 x 13 0 x 14 decrement decl R 2 0 x 1 0 x 0 subtract subl R 3, R 1 0 x 100 0 x. FD הערה למחפשים באינטרנט : היזהרו , אינטל כותבים את האופרנדים בסדר הפוך מזה – – 5

 תרגיל מסכם באסמבלי C- • חיפוש מינימום במערך ב int get_min(int * array,

תרגיל מסכם באסמבלי C- • חיפוש מינימום במערך ב int get_min(int * array, unsigned size) { const int Tmax= -1 U >> 1; (111. . 1>>1 = 0111… 1) int min_value = Tmax; unsigned i; for (i = 0 ; i != size ; i++) { } – 6– if (array[i] < min_value) min_value= array[i]; } return min_value; ? assembly- • איך נעשה זאת ב

 תרגיל מסכם באסמבלי פישוט הפונקציה GOTO- • משתמשים ב int get_min(int * array,

תרגיל מסכם באסמבלי פישוט הפונקציה GOTO- • משתמשים ב int get_min(int * array, unsigned size) { int min_value= 2147483647; unsigned i=0; goto loop_condition; loop_body: if (array[i] >= min_value) goto loop_advance; min_value= array[i]; loop_advance: i++; loop_condition: if (i != size) goto loop_body; return min_value; – 8 –}

 תרגיל מסכם באסמבלי פישוט הפונקציה int* במקום char* : • משתמשים במצביעים לבתים

תרגיל מסכם באסמבלי פישוט הפונקציה int* במקום char* : • משתמשים במצביעים לבתים int get_min(char * array, unsigned size) { int min_value= 2147483647; unsigned i=0; goto loop_condition; loop_body: int current_elem= *(int*)(array+i*4); if (current_elem >= min_value) goto loop_advance; min_value= current_elem; loop_advance: i++; loop_condition: if (i != size) goto loop_body; return min_value; – 9– }

 תרגיל מסכם באסמבלי int min_value= 2147483647; unsigned i=0; goto loop_condition; loop_body: int current_elem=

תרגיל מסכם באסמבלי int min_value= 2147483647; unsigned i=0; goto loop_condition; loop_body: int current_elem= *(int*)(array+i*4); if (current_elem >= min_value) goto loop_advance; min_value= current_elem; loop_advance: i++; loop_condition: if (i != size) goto loop_body; return min_value; – 12 –

 תרגיל מסכם באסמבלי הקצאת רגיסטר R 1= 2147483647; R 2= array; R 4=0;

תרגיל מסכם באסמבלי הקצאת רגיסטר R 1= 2147483647; R 2= array; R 4=0; goto loop_condition; loop_body: R 3= *(int*)(R 2+R 4*4); if (R 3 >= R 1) goto loop_advance; R 1= R 3; loop_advance: R 4++; loop_condition: if (R 4 != size) goto loop_body; return; – 13 –

 תרגיל מסכם באסמבלי קריאת פרמטרים מהמחסנית R 1= 2147483647; , שקיימת Read R

תרגיל מסכם באסמבלי קריאת פרמטרים מהמחסנית R 1= 2147483647; , שקיימת Read R 2= read (R 8+8); ה היא לא פונקצי עבורכם R 4=0; זו דרך להציג יותר את פשוטה goto loop_condition; בצורה המעבר loop_body: R 3= read (R 2+R 4*4); if (R 3>=R 1) goto loop_advance; R 1= R 3; loop_advance: R 4++; loop_condition: if (R 4 != read (R 8+12)) goto loop_body return; . . . ! עוד רגע Assembly וזה כמעט q – 15 –

 תרגיל מסכם באסמבלי Assembly- האלגוריתם ב move $2147483647, R 1 move 8(R 8),

תרגיל מסכם באסמבלי Assembly- האלגוריתם ב move $2147483647, R 1 move 8(R 8), R 2 xor R 4, R 4 jmp loop_condition loop_body: move (R 2, R 4, 4), R 3 compare R 3, R 1 jle loop_advance move R 3, R 1 loop_advance: increment R 4 loop_condition: compare 12(R 8), R 4 jne loop_body – 16 – R 1= 2147483647; R 2= read(R 8+8); R 4=0; goto loop_condition loop_body: R 3= read (R 2+R 4*4); if (R 3>=R 1) goto loop_advance; R 1= R 3; loop_advance: R 4++; loop_condition: if (R 4 != read(R 8+12)) goto loop_body;