אסמבלר...

סייפיי

New member
אסמבלר...

בעת הידור הקובץ "the.asm" נתקלתי בהודעות השגיאה הבאות: Assembling file: the.asm Error** the.asm(22) Relative jump out of range by 001Ah bytes** Error** the.asm(24) Relative jump out of range by 0014h bytes** Error messages: 2 Warning messages: None Passes: 1 Remaining memory: 391k בשורות הנ"ל (22 ו24) יש שימוש בפקודת jmp zero אשר מפנה לשתי תוויות בתחתית התוכנית (שנמצאת במרחק של 80 שורות ממנה, ועוד מתוכנן לגדול), איך אני פותר את הבעיה? בתודה מראש.
 

zontar

New member
ככה :

הבעיה היא שמרווח הקפיצות שלך מוגבל מכיוון שפקודת JMP היא לקפיצה קצרה ומוגבלת בטווח הכתובות,ע"מ לפתור זאת ישנה קפיצה ארוכה שאיני זוכר כרגע את שמה וישנה האפשרות פשוט לחלק את הקפיצה ל 2 חלקים: קפוץ לתוית באמצע וממנה קפוץ לתוית הנכונה.
 

emissary

New member
יש עוד דרך קצת עוקפת

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

voguemaster

New member
זה תלוי

תלוי בקוד שמנסים לכתוב. יש פקודת קפיצה למרחק יחסי קצר ויש קפיצה ארוכה. בכל אסמבלר (דוגמא: TASM או MASM) יש מוסכמות כלשהי לגבי איך מבצעים את כל אחת הקפיצות. אני באמת לא זוכר כבר כי מזמן מזמן לא כתבתי תוכנית באסמבלי, מה גם שזה קשור אם זה קוד 32 סיביות או 16. בגדול יש אפשרות לבצע קפיצת far, רק שאני אצטרך לבדוק את זה בספר. אני מניח שזו תוכנית רגילה שיכולה לעבוד תחת DOS (תקן אותי אם אני טועה). פשוט אין לי כרגע הרבה זמן, אני עומד לצאת... רק כדי להבהיר את המצב: קפיצה קרובה (near jump) ב-16 סיביות היא קפיצה למרחק של עד 128 בתים קדימה או 127 בתים אחורה. בהתחשב בעובדה שחלק מהפקודות (opcodes) תופסות יותר מבייט אחד, אתה מגלה שאתה די מוגבל מבחינת הסתעפויות בתוכנית ולכן צריך לדעת לכתוב נכון או לדעת לעקוף את המגבלות (כל אסמבלר עם התחביר שלו)...
 

voguemaster

New member
יש פיתרון אם אתה עובד עם TASM

אתה יכול להשתמש ב-JUMPS, שזה assembler directive. שמים אותו איפשהו בהתחלה והוא אומר לאסמבלר שאם יש הסתעפות NEAR שהיא לא חוקית, לייצר את הקוד המתאים להסתעפות FAR כדי שהתוכנית תעבוד.
 

The Jackel

New member
תודה חבר´ה על הדיון ../images/Emo8.gif

זה מעלה בי זיכרונות טובים על ההתעסקות שלי בשפת הסף הזו. אולי אני אעשה שבוע נוסטלגייה החל מיום ראשון :)
 

סייפיי

New member
קודם כל תודה על התגובות

עכשיו להבהרה: assembler directive? אני לא מכיר את המונח... אני עובד עם TASM של borland בדוס.
 

selalerer

New member
הכוונה לפקודת קומפיילר.

יש שתי סוגי פקודות שאתה כותב: פקודות למכונה: שהופכות לקוד שעושה בדיוק את מה שהפקודות אומרות. פקודות קומפיילר: שמפעילות איזשהו תהליך בקומפיילר שעושה קוד מסובך יותר מפקודה אחת ולפעמים ע"פ תנאים מסויימים.
 

voguemaster

New member
הבהרה

assembler directive זאת מילה שמורה שהאסמבלר יודע לזהות (TASM במקרה שלך) ולפעול לפיהן. דוגמאות טובות הן ORG, DB, DW, ASSUME, .386, MODEL וכו´.. הן בעיקרון אומרות לאסמבלר משהו על התוכנית או על קטע קוד מסוים. עם EQU זאת דוגמא טובה, עבור קבועים. יש גם את LABELS, LOCALS, PROC וכו´.. אני בטוח שהשתמשת בחלק מהדברים האלה. בכל אופן, מתישהו בתחילת התוכנית, או קטע קוד, תרשום JUMPS. מעתה ואילך כל קפיצה קצרה לא חוקית (כזו שיוצא שהיא בלתי אפשרית) מתוקנת אוטומטית ע"י האסמבלר. הוא פשוט שם את ההוראות המתאימות לקפיצה ארוכה. אתה יכול לבדוק איך זה נראה באסמבלי בעזרת TURBO DEBUGGER בצורה הכי פשוטה (כמו SI עדיף תמיד
). אפשר גם לבטל את JUMPS ע"י NOJUMPS. כך אפשר לשלוט על קטעי קוד מסוימים, כמו עם הרבה directives אחרים. מקווה שעזרתי.
 
למעלה