ב-C, הערך המוחזר מפונקציה מסויימת, נשמר בד"כ ברגיסטר AX, לפחות לגבי סוגי הערכים הרגילים (16 Bit). לדוגמה:
הפונקציה הזאת:
int func(void) { int a = 3; return (a + 5); } |
תהיה שקולה, פחות או יותר לדבר הבא:
_func: mov word ptr [a] , 3 add word ptr [a], 5 mov ax, [a] ret |
אם ארצה לכתוב את פונקציה זו באסמבלי, אך תחת קומפילר C, אכתוב משהו כמו:
int func(void) { int a; asm mov byte ptr [a], 3; asm add byte ptr [a], 5; asm mov ax, [a]; return; } |
כמובן שאני מקבל הודעת אזהרה על כך שאני כביכול לא מחזיר ערך מהפונקציה, מכיוון שאני "עוקף" את המנגנון של הקומפילר.
השאלה שלי היא איך לבצע את הנ"ל מבלי לקבל הודעת אזהרה, ומבלי להחזיר ערך משתנה כלשהו בדרך המקובלת (כמו return a), מכיוון שזה סתם פעולות ללא תועלת (גם ככה אני מחזיר את AX, וכאשר אני יעביר את התוכנית שמחזירה את a קומפילתיה, אני אקבל קוד באסמבלי שמעתיק את a ל-AX, ואז מחזיר את הפונקציה ע"י ret)... אם אפשר, שיהיה לפי ANSI-C...
כמו-כן, איך אני יכול לצרף קוד אסמבלי לקוד C (באמצעות קישור) ?