מה זה עושה?
-
global main extern GetStdHandle extern WriteConsoleA extern ExitProcess section .bss buffer resb 8 written resd 1 section .text main: push r12 push r13 sub rsp, 40 mov eax, 10000 lea rdi, [rel buffer+7] mov byte [rdi], 10 dec rdi .convert_loop: xor edx, edx mov ecx, 10 div ecx add edx, '0' mov [rdi], dl dec rdi test eax, eax jnz .convert_loop lea rax, [rel buffer+8] sub rax, rdi mov r13d, eax mov r12, rdi mov ecx, -11 call GetStdHandle mov rcx, rax mov rdx, r12 mov r8d, r13d lea r9, [rel written] mov qword [rsp+32], 0 call WriteConsoleA xor ecx, ecx call ExitProcessזה הקוד המלא, מדפיס 10000 למסך.
לא כ"כ הבנתי למה לחסר אחד מRDI אחרי ההעברה של באפר+7 (מבוסס היסט)
וכו' למה זה ככה? -
ולמה בתוך הלולאה (שורה 27) מחסרים אחד מ-RDI, זה כן הבנת?
בגדול הקוד עובר בסדר הפוך על הבתים של הבאפר וממלא אותם, אחרי שהוא ממלא את הבית האחרון עם התו\nהוא חוזר לבית שלפני זה על ידי ה-decאגב, מאיפה הקוד? זה מועתק מאיפשהו? כי ChatGPT טוען שיש באג בקוד... (אני מאמין לו, אבל לא התעמצתי יותר מדי לוודא את זה)
גלוי נאות: אני אדם עצלן ואני משתמש ב-AI כדי לענות לך. אבל אני לא כותב שום דבר שאני לא מבין טוב. אבל תדע לך שגם אתה יכול להתשתמש ב-AI כדי להבין, ואפשר לשגע אותו עד שאתה מבין כל מילה.
-
@שאלתיאל קודם כל צריך שיהיה לך מבט-על של מה התוכנה עושה, התמונה הכללית
בעיקרון מדובר בקוד שעושה פעולה מיותרת (אין לי ביקורת על זה, זה טוב ללמידה)
יש החלטה שרירותית בתוכנה שאתה הולך להדפיס את המספר 10000 כמחרוזת, אבל במקום להזין את זה כמחרוזת מלכתחילה, אתה מזין את זה כמספר ואז ממיר למחרוזת
להזכירך: המספר 10000 בבינארי זה10011100010000, איך מקבלים מזה את המחרוזת"10000"?האלגוריתם להמיר מספר בינארי
nלמחרוזתsבייצוג דצימלי הוא כזה (בפסאודו קוד) :while n > 0: d = n % 10 s = d + s n = n / 10
️ הפעולה %היא "מודולו", ופעולת החילוק כאן היא חילוק אינטגרלי (מספר שלם) בלי השארית.ניקח לדוגמה את המספר
1234.המצב ההתחלתי:
n = 1234 d = s = ""הנה השלבים המלאים:
n > 0? ⇐ כן!d = n % 10⇐ תוצאה:d = 4s = d + s⇐ תוצאה:s = "4"n = n / 10⇐ תוצאה:n = 123
n > 0? ⇐ כן!d = n % 10⇐ תוצאה:d = 3s = d + s⇐ תוצאה:s = "34"n = n / 10⇐ תוצאה:n = 12
n > 0? ⇐ כן!d = n % 10⇐ תוצאה:d = 2s = d + s⇐ תוצאה:s = "234"n = n / 10⇐ תוצאה:n = 1
n > 0? ⇐ כן!d = n % 10⇐ תוצאה:d = 1s = d + s⇐ תוצאה:s = "1234"n = n / 10⇐ תוצאה:n = 0
n > 0? ⇐ לא.
הלולאה הסתיימה וקיבלנו:
s = "1234"הנקודה החשובה לשים לב אליה הוא שהמספרים מתקבלים מימין לשמאל, כלומר מהסוף להתחלה
לכן בתוכנה שלך הלולאה עוברת על הבאפר מהסוף להתחלה
כדי למלאות את הבאפר מהסוף להתחלה, המצביע RDI מתחיל בהצבעה על buffer+7 ואז עובר ל-buffer+6, עובר ל-buffer+5 וכן הלאה
עדיין לא מובן? תשאל שוב
-
@שאלתיאל אכן אתה לא לחינם הרגשת בעיה, בא נגדיר "חופר":
כל שאלה שאתה שואל תעשה מאמץ מקדים למצוא תשובה, אם אין לך כח, חכה שיהיה. לגיטימי שלא תצליח בקלות, ואז זה הזמן לשאול.
מנסחים את השאלה בינך לעצמך, מחליטים ששווה שאלה ושלא מצאת פתרון, ופותחים נושא ייעודי רק לשאלה זו. שאלות כאלה אתה יכול לשאול בלי סוף ובלי נקיפות מצפון.
אבל חשוב להיות שקוף וכנה עם העונים לך - תלמד ותשאל לפי הסדר: אתה לא יודע מה זה ייצוג מספרי בבינארית. העונה מצפה שתדע את זה וראית היטב שהוא מצפה לזה, הוא גם כתב לך את זה בעבר, וגם מדריכי אסמבלר שקראת גם הניחו שאתה יודע, אבל אתה "החלקת" את העניין.
אתה בנקודה כזו צריך להחליט: אפשרות א: אני לומד, ואנסה להבין, אפשרות ב: אני שואל וכותב מפורש שהתקשיתי בזה ואני מעדיף להתעלם מהמידע הזה. ככה לעונה יש אפשרות לשקול מה לענות לך והוא לא טורח בשרשרת של תיבת פנדורה.המלצה: אתה שוקד כראוי אבל מותר לך לשמוע המלצות. המליצו לך ללמוד קודם שפת תכנות. היית נשמע בטוח שלא זה מה שכדאי לך, וזה טוב שיש לך דעה ושאתה חזק ולא עף מכל רוח, אבל שקול, הרי מי שענה לך יודע הרבה גם באסמבלי שלדעתך הוא הבטחת העתיד, אולי הצדק עימו.
-
D dovid נעל נושא זה
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות