פורסם 2014 במרץ 2311 שנים בתחילת שנת הלימודים שלי באסמבלי אני זוכר שהשתמשנו בנוסחא שנותנת לי לרוץ על עמודות ונוסחא שנותנת לי לרוץ על שורות במטריצה מישהו זוכר? אני פשוט רוצה לפתור עכשיו איזה תרגיל שלוקח איבר IJ במטריצה ומכפיל אותו באיבר JI במטריצה באותו הגודל אחרת ושכחתי אשמח לעזרה
פורסם 2014 במרץ 2311 שנים איזה אסמבלי?לרוב כשמייצגים מערך דו מימדי במערך חד מימדי (בגודל COL*ROW) אז הגישה לאיבר ה-i,j מתבצעת באמצעות [arr[i+j*col
פורסם 2014 במרץ 2411 שנים אני חושב שאתה מדבר על לולאה בתוך לולאה.תחפש את זה בגוגל ותקרא איך הרעיון עובד (זה לא מסובך, הכי קל להבין מדוגמאות של C אם כבר למדת).באמסבלי זה מבוצע עם פקודות קפיצה, בד"כ יש את 2 הפקודות JNZ ו-JZ (קפוץ אם הגעת לאפס).באופן כללי השיטה הולכת ככה:אתה אמור להגדיר את אוגר האינדקס (זכור לי שזה CX, כי זה ה-counter) על עמודות, ומתחיל לספור אותו כלפי מטה.JNZ יעשה קפיצה כשהאינדקס מגיע לאפס ואז אתה עובר לשורה הבאה ושוב מתחיל מהתחלה עד שאתה מסיים.
פורסם 2014 במרץ 2411 שנים מחבר Dimka אבל להזכירך באסמבלי אין עמודות, תכלס הכל מסודר בזיכרון בשורה אחת...בגלל זה אם אני רוצה למשל לעבור על השורות מה שאני צריך לעשות זה כולה mov al,[si] that all וכמובן לקדם את הSI ואז אני מקבל את ערכי השורות..אבל אם אני רוצה להוסיף רגיסטר למשל את DI שהוא ירוץ לי על העמודות פה מתחילה הבעיה
פורסם 2014 במרץ 2411 שנים אז תסתכל על מה שגיל אמר. אתה פשוט צריך להכניס את החישוב הזה לתוך התכנית שלך.
פורסם 2014 במרץ 2411 שנים מחבר הבעיה שאין לי 2 מצביעים למערך , הנתונים היחידים שיש לי זה מצביע אחד שרץ על המערך שהוא כאילו הi שלי, אין לי j ,
פורסם 2014 במרץ 2411 שנים אז לא הבנתי מה אתה רוצה לעשות.יש לך מטריצה אחת? שתי מטריצות? מערך חד מימדי? שניים? מה אתה רוצה לעשות איתם?
פורסם 2014 במרץ 2411 שנים מחבר יש לי 2 מטריצות דו מימדיות בתרגיל, אבל מן הסתם אין דבר כזה באסמבלי מערך דו מימדי, הם מסודרים בזיכרון בשורה, לדוגמא מטריצה שהיא בגודל 3 שורות ו3 עמודות במקטע המידע נראה מערך של 9 בתים.עכשיו יש לי 2 מערכים כאלה שהם למעשה 2 מטריצות ריבועיות.. , על אחד אני צריך לרוץ על השורות וזה לא בעיה אני פשוט עושה פוינטר SI למשל ובעזרת מיעון עקיף אני שולף את הנתונים , רץ על השורות באותה מטריצה.לעומת זאת על המטריצה השניה אני צריך לרוץ על העמודות... אבל אין לי עמודות.. כי במקטע המידע הם מסודרים שניהם באותה צורהפה הבעיה שלי
פורסם 2014 במרץ 2411 שנים יש לך i ו-j רק שלא ידעת מה הם. ה-i מספר העמודה במטריצה וה-j פשוט רץ מ-0 ועד מספר השורות פחות אחד. את כל זה אתה כמובן מוסיף ל-offset שמגדיר את תחילת המטריצה בזיכרון
פורסם 2014 במרץ 2411 שנים מחבר לא הכי מובן ליבזיכרון למשל יש לי מטריצה N על N בגודל 3 למשל אז יש לי Matrix db 12,2,33,45,5,6,7,8,9 אז אם אני רוצה להכפיל כל פעם את איבר ij באיבר ji אני צריך לעשות על אותו מערך 2 מצביעים ? למשל si מצביע שורות , ואז לרוץ מהאיבר הראשון עד לאחרון , אבל איך אני מיישם את העמודות... שם אני נתקע אשמח אם תסבירו לי בדוגמא ממשית
פורסם 2014 במרץ 2411 שנים קוד ב-c:int arr[] = {1,2,3,4,5,6,7,8,9};int a = arr[1 + 0*3];int b = arr[1 + 1*3];int c = arr[1 + 2*3];תנסה לתאר לי איך נראית המטריצה ואילו איברים נכנסים במשתנים a,b,c
פורסם 2014 במרץ 2511 שנים מחבר מטריצה A1 4 73- 5 172 10 81מטריצה B6 7 12 2 112 - 100 81ומטריצה C באותו הגודל, במטריצה A אנחנו עוברים על השורות ובמטריצה B אנחנו עוברים על העמודותבאסמבלי מקטע הנתונים שלי נראה ככה :data segment A db 7,4,1,17,5,-3,81,10,2 B db 1,7,6,11,2,2,81,100,-2 C db 9 dup (?)endsעכשיו אם אני רוצה לעבור על כל מטריצה A על השורות שלה מה שאני עושה זה מעביר לSI את offset של Aמעביר לCX את הגודל של המטריצה שזה 9ואז אני עושה 2 פקודותmov dl,[si] , inc siואז בזמן שאני עושה LOOP יוצא לי שאני עובר על כל השורותאבל במקביל אני צריך לעבור על מטריצה B ולא על שורות אלא על העמודות...פה אני נתקע אין לי שמץ של מושג איך עוברים על מטריצה B , אני יכול לעשות משהו אבל סביר להניח שזה יהיה מסורבל... ולא משהו כללי אני רוצה למצוא פתרון שלא משנה הגודל הריבועי של המטריצות הפתרון שלי עובד נערך 2014 במרץ 2511 שנים על-ידי bdoron
פורסם 2014 במרץ 2511 שנים בכפל מטריצות לא מספיק לעבור על המטריצה רק פעם אחת. על כל עמודה ב-B אתה צריך לעבור על כל 3 השורות של A (ולהיפך, על כל שורה של A אתה צריך לעבור על כל עמודות B).בשביל לעבור על עמודה פשוט צריך להגדיל את si כל איטרציה במספר האיברים בעמודה (במקרה הזה 3) במקום ב-1.
פורסם 2014 במרץ 2511 שנים מחבר יואב אתה רוצה להגיד לי ש: אם למשל אני נמצא באיבר השני במטריצה A שזה האיבר במקום 01 ואני רוצה להגיע למקום 10 במטריצה B כל מה שאני צריך לעשות זה להגדיל את הSI ב3?ואיך זה יכול להיות נכון... נגיד הגעתי לאיבר מספר 7 במערך , אני מוסיף לו 3 וחרגתי מהמערך נערך 2014 במרץ 2511 שנים על-ידי bdoron
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.