עבור לתוכן

היפוך מספר בינארי באסמבלי

Featured Replies

פורסם

שלום אנשים :)

קיבלתי כמה תרגילים כהגשה ואחד התרגילים אני פשוט לא מצליח להגיע לכתיבת התוכנית :

התרגיל הוא: צריך לכתוב תוכנית באסמבלי שמקבלת מערך בשם arr1 בגודל 20 תאים, כל תא בגודל byte והופכת את סדר הסיביות שבכל אחד מתאי המערך. הופכת את הסדר לא ערך.

לדוגמא: תן במערך שהתוכן שלו : 10010011 הסדר ההפוך יהיה : 11001001

אם זה 00110011 זה יהיה 11001100

אשמח פיתרון, אני כבר יושב הרבה זמן על זה :-\

פורסם

יכול להיות שיש דרך יותר חכמה אבל אני אתן לך מה שעלה לי בראש.

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

בהתחלה אנחנו רוצים את הסיבית הראשונה אז נכפיל ב 00000001b.

כל הספרות הלא רלוונטיות התאפסו ואז אתה מבצע rol שזה מזיז את הסיבית שמאלה, תבצע 7 פעמים ואז היא תהיה בהתחלה.

את התוצאה תחבר למספר שאיפסת בהתחלה ככה שאחרי החיבור יהיה בו 10000000b.

ככה תעבור על כל הסיביות...

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

זה יהיה פשוט יותר.

פורסם

דרך קצת יותר פשוטה (זה קוד C, אבל אני מקווה שתבין את העקרון):


x = ((x & 0x0f) << 4) | ((x & 0xf0) >> 4);
x = ((x & 0x33) << 2) | ((x & 0xcc) >> 2);
x = ((x & 0x55) << 1) | ((x & 0xaa) >> 1);

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

פורסם

שניצל,

רעיון ממש יפה :xyxthumbs:

לא בטוח כמה יפה ואלגנטי זה באסמבלר.

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

אני לא ממש זוכר איך כותבים באסמבלי אבל הרעיון הוא כזה:

הנתון יכנס לאוגר a וההיפוך ימצא בסוף ב-b


mov al, Byte
move bl, 0
loop for 8 bits:
shl al, 1
rcr bl, 1
end loop

פורסם

צודק זו הייתה השיטה שלמדתי בתיכון. :)

ארכיון

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

דיונים חדשים