עבור לתוכן

הבדלים בין אסמבלי 64 ביט ל- 32 ביט

Featured Replies

פורסם

התחלתי ללמוד אסמבלי באוניברסיטה, ובקרוב אני צריך לכתוב תוכניות.

החשש היחיד שלי הוא מזה שאנחנו לומדים על אסמבלי והכל על מעבדי 32 ביט, ואילו אצלי בבית אני עובד על מעבד 64 ביט.

ליתר דיוק מה שיש לי בבית הוא מחשב נייד עם מעבד Intel Core i3 עם מערכת הפעלה ubuntu 10.04 וקומפיילר gcc.

רציתי לדעת אם יש הבדלים בין כתיבת אסמבלי 32 ביט לכתיבת אסמבלי 64 ביט (דברים כמו גודל רג'יסטרים, גודל כתובות)?

הדגש העיקרי בשאלה שלי הוא על האם תוכנית שאני אכתוב כאילו כמו למעבד 32 ביט תעבוד רגיל במעבד ה- 64 ביט שלי?

פורסם

מעבדי 64 ביט תומכים לאחור לחלוטין בסט הפקודות של מעבדי 32 ביט.

פורסם
  • מחבר

אוקיי, אבל ניסיתי לקמפל תוכנית Hello World (בלי שום דגלים של ה- gcc):

	#This is a simple "Hello World!" program
.section .rodata #read only data section
str: .string "Hello World!\n"
########
.text #the beginnig of the code
.globl main #the label "main" is used to state the initial point of this program
.type main, @function # the label "main" representing the beginning of a function
main: # the main function:
pushl %ebp #save the old frame pointer
movl %esp, %ebp #create the new frame pointer

pushl $str #the string is the only paramter passed to the printf function.
call printf #calling to printf AFTER we put its parameters in the stack.

#return from printf:
movl $0, %eax #return value is zero (just like in c - we tell the OS that this program finished seccessfully)
movl %ebp, %esp #restore the old stack pointer - release all used memory.
popl %ebp #restore old frame pointer (the caller function frame)
ret #return to caller function (OS)

ואני מקבל הודעות שגיאה כאלה:

Error: suffix or operands invalid for 'push'

מה אני צריך לעשות?

דרך אגב, מה שאנחנו לומדים בכיתה זה על IA32.

פורסם

להוסיף את הדגל -m32 לשורת הפקודה של gcc


gcc -m32 file.s

פורסם
  • מחבר

אוקיי, אבל כשאני משתמש בדגל m32 זה רושם לי:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libgcc.a when searching for -lgcc

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libgcc.a when searching for -lgcc

/usr/bin/ld: cannot find -lgcc

collect2: ld returned 1 exit status

מה אני עושה עכשיו?

פורסם

אתה בלינוקס או באובונטו?

נראה לי באובונטו, אם כן אז תנסה להתקין את החבילה gcc-4.3-multilib (אם היא לא מותקנת)

ותנסה אולי את המתג -L/usr/lib32 המינוס כמובן בהתחלה.

אם אתה בלינוקס, אז תביא הפצה וגירסא.

פורסם
  • מחבר

תודה רבה, הורדתי את ה- multilib ואז זה עובד.

דרך אגב, רשמתי בהודעה הראשונה שאני משתמש באובונטו אבל זה כנראה לא היה כל כך ברור.

שוב תודה.

פורסם

לא קראתי שוב את ההודעה הראשונה כשעניתי לך.

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

פורסם

גם לי אותה בעיה עם push ו-pop.

איך ומאיפה להתקין את gcc-4.3-multilib?

פורסם
  • מחבר

תחפש ב- package manager את המילה multilib ותסמן את הדבר הראשון שאתה מקבל (זה יתקין עוד כמה דברים, פשוט תאשר את זה).

פורסם

תודה. מסתבר שהייתי צריך בנוסף (או רק...) להוסיף m32- בין gcc לשם הקובץ.

ארכיון

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

דיונים חדשים