שאלה באסמבלי

שאלה באסמבלי

נתונה מטריצה 3X3 כתוב תוכנית (למיקרו מעבד 8088 ) הבודקת אם סכום האיברים באלכסון הראשי של המטריצה שווים לאלכסון המשני שלה.
 
תשובה בעברית

כתוב את התוכנית בעצמך. אם תתקע, כתוב לפורום בצירוף קובץ הקוד שלך והחברים פה ישמחו לעזור לך. אל תצפו שיעשו לכם את שעורי הבית בפורום, הוא מיועד לעזרה לאנשים, לא למציאת פראיירים שיודעים תיכנות.
 

angel20

New member
כיוון

כידוע לך באסמבלר כל המספרים של המטריצה באים אחד אחרי השני בזיכרון (נכון מטריצה ניראת כשורה ועמודה אך בזיכרון זה לא כך) תעשה את החישוב של מקומות האלכסון ותגי אליהם בעזרת המצביעים (SI,DI,BX) לא לישכוח לישמור את תחילת מקטע המטריצהת תחשב וזהו.
 

zontar

New member
הכי קל זה לצייר את המטריצה

(אני יודע שזו לא דרך לפיתרון אבל בתור התחלה זה מקל מאד) לאחר שציירת אותה בדוק מה החוקיות של הרווחים בין המספרים באלכסון ראשי וכתוב קטע תוכנית שמסכם אותם לאחר מכן בדוק מה החוקיות של הרווחים של המספרים באלכסון משני וסכם אותם ו... אופס... סיימת את התוכנית. בהצלחה.
 

אלדד26

New member
תשובה קצת יותר מלאה

אשלים את שתי התשובות האחרונות ביתר פירוט. ראשית כל, כפי שנאמר, כל מטריצה היא בעצם מערך ליניארי של תאי זיכרון. בוא נניח שמדובר במערך של 10x10 לצורך הדוגמה. נניח שהאינדקסים של השורות מסומנים ב - i ורצים על התחום 9..0. נניח שהאינדקסים של העמודות מסומנים ב - j ורצים על התחום 9..0. נניח שמדובר במערך של מילים (words). עכשיו ניקח כמה דוגמאות: 1. אנחנו רוצים את הפינה השמאלית העליונה. מדובר בתא (0,0). זה התא המצוי בהיסט 0 בתוך המערך. כלומר, כדי להעביר ל - AX את תוכן התא הנ"ל נבצע: MOV SI,0 [MOV AX,DS[SI 2. אם נרצה את התא (0,4), כלומר - התא החמישי בשורה הראשונה, נקבל: MOV SI,4 [MOV AX,DS[SI 3. אם נרצה את התא (1,0), כלומר - התא הראשון בשורה השניה, זה יהיה בעצם התא ה - 11 במערך, והוא יישב בהיסט 10 (זוכר? התא הראשון יושב בהיסט 0!). למה זה התא ה - 11 במערך? כי השורה הראשונה היא התאים 10..1, השורה השניה היא התאים 20..11 וכו´. בקיצור, (1,0) יהיה: MOV SI,10 [MOV AX,DS[SI 4. ודוגמה אחרונה: התא (6,3), שהוא התא הרביעי בשורה השביעית - הוא יהיה בהיסט 63. למה? כי השורה השביעית היא התאים 70..61, שיושבים בהיסטים 69..60. התא הרביעי הוא 63. MOV SI,63 [MOV AX,DS[SI ומכאן הגענו לנוסחה הפשוטה שמחשבת את ההיסט של התא במטריצה. נניח ש - N הוא גודל השורה (במקרה הנ"ל, 10) - הנוסחה היא i*N+j. תבדוק את זה על הדוגמאות ותראה. כל מה שנותר לך עכשיו זה להמיר את המיקומים במטריצה להיסטים הללו. אפשר לעשות את זה עם מקרו פשוט (אם למדת מקרואים), ואפשר לעשות את זה ידנית. אפשר גם לשפר את זה בכל מיני דרכים ולחסוך חישובים מיותרים... הרי זו כל המטרה של השפה! ומכאן לנושא השני שהוזכר כאן. עניין החוקיות מקנה לנו את היכולת לקחת בעיה, להבין מתוכה פרמטרים נוספים, להסיק חוקיות, ובכך לכתוב תוכנית הרבה יותר פשוטה. בוא נבדוק את החוקיות באלכסון הראשי. האלכסון הראשי רץ על התאים - (0,0), (1,1), (2,2). בוא נבדוק את ההיסטים של התאים. התא הראשון : (0,0) - היסט 0, כמובן. התא השני : (1,1) - היסט 1+1*3 = 4. התא השלישי : (2,2) - היסט 2+2*3 = 8. שים לב להפרשים. ההפרשים בין ההיסטים הוא 4. אולי שמת לב גם שההפרש הוא כגודל השורה + 1. זה נכון תמיד, ואפשר להוכיח את זה פשוט באמצעות אינדוקציה, אבל את זה אני אשאיר לכם כתרגיל בית
בקיצור, מה הבעיה להתחיל מהיסט 0, ולהתקדם כל פעם 4 תאים קדימה, ולבצע את הפעולה כולה 3 פעמים (כמספר השורות)? נסה לעשות את אותו הדבר על האלכסון המשני ותראה מה אתה מקבל. בהצלחה!
 

angel20

New member
כל הכבוד על הלימוד

זה באמת מענין אבל ניראה לי שזה יסבך את הילד שהרי את הכיוון הוא לא יודע. אז ביתר קלות: lea si,matriza start: cmp bx,16 je lbl1 [add ax,[si][bx add bx,4 jmp start lbl1:cmp bx,0 je lbl2 [add ax,[si][bx dec bx,4 jmp lbl1 lbl2:cmp ax,bx פסיקה... כמובן שתאתחל מה שצריך לאתחל. מקווה שעזרתי.
 

angel20

New member
תיקון

lea si,matriza start: cmp bx,12 je lbl [add ax,[si][bx add bx,4 jmp start lbl:dec bx,6 lbl1:cmp bx,0 je lbl2 [add ax,[si][bx dec bx,2 jmp lbl1 lbl2:cmp ax,bx פסיקה...
 

אלדד26

New member
אבל למה לפתור לו את התרגיל?

מיותר. ככה לא לומדים. ככה לא מבינים. ככה מעתיקים - ואח"כ נכשלים במבחן. רק אם ינסה בעצמו, ויעביר 50 קומפילציות, וינסה 50 פעמים וייכשל, הוא יבין.
 

angel20

New member
צודק לא צריך ליפתור

אבל מיניסיון שלי כשלא היה לי אפילו כיוון רק פיתרון או חלק ממנו הביאו אותי להבין איך ליפתור בהמשך עוד תרגילים. אחד שאין לא כיוון לפיתרון לא יגיע אליו לעולם אם לא נותנים לו דרך ראשונית מניסיון.
 

zontar

New member
פששש../images/Emo70.gif הרבה זמן פנוי יש לכם>רק

תזכרו שהוא צריך להיות זה שמבזבז את זמנו ולא אתם
אפילו אם אתם מתים לעזור לו ככה לא עוזרים.
 

אלדד26

New member
לא פתרתי לו את התרגיל.

הסברתי את ההתייחסות למטריצה. אף אחד לא אמור להגיע לנוסחה הזו לבד, היא נלמדת בכל שיעור אסמבלי באוניברסיטה ובתיכון.
 
למעלה