צריך כיוון באסמבלי - ניתוח DWORD במכונת 16 ביט
| |
ערכתי לאחרונה בתאריך 02.12.07 בשעה 17:05 בברכה, TheBinary המכונה שלנו מוגבלת ל-16 ביט (אוגרי AX - AH AL, BX - BH BL וכו') יודעת לעבוד רק עם BYTE / WORD יש לי בזיכרון מערך בגודל 1024 סיביות:
arr db 6h,3h,Ah,2h,1h,Bh,Fh,0h,6h,2h,8h,Ah, 3h,Dh,1h,Eh,6h,3h,Ah,2h,1h,Bh,Fh,0h,6h,2h,8h,Ah,3h, Dh,1h,Eh,6h,3h,Ah,2h,1h,Bh,Fh,0h,6h,2h,8h,Ah,3h,Dh, 1h,Eh,6h,3h,Ah,2h,1h,1h,Fh,0h,6h,2h,1h,Ah,3h,Dh,1h, Fh,6h,3h,Ah,2h,1h,Bh,Fh,0h,6h,2h,Ch,Ah,3h,Dh,1h,Eh, 6h,3h,Ah,2h,1h,Bh,Fh,0h,6h,2h,8h,Ah,3h,Bh,1h,Eh,6h, 3h,Eh,2h,1h,Bh,Fh,0h,6h,8h,8h,Ah,3h,Dh,1h,Eh,6h,7h, Ah,2h,1h,Bh,Fh,0h,6h,2h,8h,Ah,3h,Dh,1h,Eh
צריך להסתכל עליו כאל מערך דו מימדי של 32 על 32. צריך לכתוב פרוצדורה שמקבלת את הכתובת למערך, ומספר n והיא צריכה להחזיר את מספר השורה הקטן ביותר בה יש רצף של n סיביות שהן 1 אם אין - להחזיר 0. (מספור השורות מ-1 עד 32)הבעיה היא למצוא את הרצף. אם היה לי אוגר EAX זה היה ממש פשוט, לעשות ROL ולבדוק CARRY FLAG. אבל המכונה מוגבלת ל-16 ביט. Net_Boy הציע לי פתרון של להעביר חצי שורה ל-AX וחצי שורה ל-BX ולכתוב קוד שיודע לעבוד עם 2 האוגרים אחד אחרי השני - אבל אז אחד המרצים בקורס ענה לי את התשובה הבאה: ואם שורה במערך היא באורך 9 בתים ומעלה, מה הפתרון? יש פתרון שמטפל בזה נכון בכל מספר בתים. ולהזהר מהמלכוד של איחסון מלים בשיטת little-endian ב- 8086 הוא אמר שיש פתרון שמטפל בזה בצורה נכונה בכל מספר ביטים כלשהו (אני מניח שהכוונה שלו היתה לביטים ולא בתים), ובגלל זה הפתרון של להעביר חצי שורה ל-AX וחצי ל-BX לא הכי יעיל שיש. אפשר כיוון? תודה ד"א - ה-little-endian זה אחד הדברים הכי מרגיזים שיש!
|
|