<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[נתינת ארגונומט לפונקציה?]]></title><description><![CDATA[<pre><code>mov ecx, -11
call GetStdHandle
</code></pre>
<p dir="rtl">. אאל"ט המקטע קוד הזה נותן ארגונומט לפונקציה (11-)<br />
לאח"כ זה קורא לפונקציה שקוראת את זה כקבוע.<br />
ואז מחזירה את הHandle שהוא RAX</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/yossiz" aria-label="Profile: yossiz">@<bdi>yossiz</bdi></a> אני צודק בהבנה שלי?</p>
]]></description><link>https://tchumim.com/topic/17638/נתינת-ארגונומט-לפונקציה</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 05:56:33 GMT</lastBuildDate><atom:link href="https://tchumim.com/topic/17638.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Sep 2026 16:52:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to נתינת ארגונומט לפונקציה? on Thu, 03 Sep 2026 22:54:38 GMT]]></title><description><![CDATA[<p dir="rtl">עכשיו הבאתי את התשובה שכתבתי לקלוד לקבל ביקורת (למען האמת גם בתשובה המקורית נעזרתי קצת בקלוד לבירור כמה דברים, אבל ניסחתי אותה בעצמי) והוא טוען שטעיתי קצת</p>
<blockquote>
<p dir="auto">yossiz <a href="/post/172071">כתב</a>:</p>
<p dir="rtl">לכן יש פה שימוש ב-ecx</p>
</blockquote>
<p dir="rtl">הוא טוען שבאמת היה אפשר להשתמש גם ב-rcx בעקרון כי ה-ABI (שים לב לניסוח, ABI ולא API, מה ההבדל? נושא לעוד שיעור...) של ווינדוס בפירוש מתעלם מבייטים העליונים כאשר הרוחב של הארגומנט מוצהר כ-DWORD</p>
<p dir="rtl">היתרון של שימוש ב-ecx הוא כי הבינארי של הפקודה קצרה יותר</p>
<pre><code>B9 F5 FF FF FF              ; mov ecx, -11   → 5 bytes
48 C7 C1 F5 FF FF FF        ; mov rcx, -11   → 7 bytes
</code></pre>
<p dir="rtl">(היו עוד ביקורות אבל דקויות ממש עדינות שלא כדאי להעלות לפה)</p>
]]></description><link>https://tchumim.com/post/172075</link><guid isPermaLink="true">https://tchumim.com/post/172075</guid><dc:creator><![CDATA[yossiz]]></dc:creator><pubDate>Thu, 03 Sep 2026 22:54:38 GMT</pubDate></item><item><title><![CDATA[Reply to נתינת ארגונומט לפונקציה? on Thu, 03 Sep 2026 22:14:23 GMT]]></title><description><![CDATA[<p dir="rtl"><a class="plugin-mentions-user plugin-mentions-a" href="/user/%D7%A9%D7%90%D7%9C%D7%AA%D7%99%D7%90%D7%9C" aria-label="Profile: שאלתיאל">@<bdi>שאלתיאל</bdi></a> קיוויתי בתשובה הנ"ל לתת לך טעימה שתבין למה כדאי לך ללמוד כל הידע המקדים שהספרים/קורסים מנסים ללמד אותך<br />
למה כדאי להבין שיטת המספור הבינארי, ולמה כדאי להבין שפת C<br />
מקווה ששיכנעתי אותך קצת</p>
]]></description><link>https://tchumim.com/post/172072</link><guid isPermaLink="true">https://tchumim.com/post/172072</guid><dc:creator><![CDATA[yossiz]]></dc:creator><pubDate>Thu, 03 Sep 2026 22:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to נתינת ארגונומט לפונקציה? on Thu, 03 Sep 2026 22:43:35 GMT]]></title><description><![CDATA[<p dir="rtl"><a class="plugin-mentions-user plugin-mentions-a" href="/user/%D7%A9%D7%90%D7%9C%D7%AA%D7%99%D7%90%D7%9C" aria-label="Profile: שאלתיאל">@<bdi>שאלתיאל</bdi></a> כן, בטח אתה צודק בהבנה שלך<br />
אבל אפשר להוסיף המון הסבר</p>
<p dir="rtl">למה <code>ecx</code>?<br />
יש פה שתי שאלות,<br />
א) למה רג'יסטר <code>c</code> ולא <code>a</code> או <code>b</code> או משהו אחר<br />
ב) למה לבחור ב-<code>ecx</code> (גירסת ה-32 סיביות מתוך משפחת <code>c</code>, לעומת <code>rcx</code>) מדובר הרי בקוד של 64 סיביות (עוד שאלה: איך ידעתי מתוך שתי השורות שהבאת שזה 64 סיביות?)</p>
<p dir="rtl">התשובה לשאלה הראשונה (וגם לשאלה שבסוגריים בסוף השאלה השנייה) קשורה ל-<a href="https://en.wikipedia.org/wiki/Calling_convention" target="_blank" rel="noopener noreferrer nofollow ugc">calling conventions</a> = המוסכמה איך נהוג לקרוא פונקציות בווינדוס 64. וקונבנציה של win64 הוא ששמים את הארגומנט הראשון (מסוג int) ב-<code>rcx</code> (זה שונה לגמרי מהקונבנציות הן של win32 והן של לינוקס)<br />
אפשר להמשיך ולשאול למה הקונבנציה ככה, אבל קונבנציה כשמו כן הוא, סתם מוסכמה כי חייבים להסכים על שיטה כלשהו, (אולי יש טעם יותר עמוק, אני לא יודע)</p>
<p dir="rtl">התשובה לשאלה השניה יותר מסובכת: זה חוזר לאיך מוגדר הקבוע <code>STD_OUTPUT_HANDLE</code> בקבצי ה-hearders של windows api<br />
ככה זה מוגדר:</p>
<pre><code>typedef unsigned long DWORD;
#define STD_OUTPUT_HANDLE ((DWORD)-11)
</code></pre>
<p dir="rtl">(הנה דוגמה מצויינת למה כדאי לך מאוד להכיר שפת C... כי זו השפה שבה מוגדרים ה-API של ווינדוס ולינוקס)</p>
<p dir="rtl">יש פה דקויות שצריך לשים אליהם את הדעת:<br />
<strong>א) מה כתוב בשפת C</strong><br />
ה-<code>-11</code> כשלעצמו (בשפת C) הוא <code>signed int</code> אבל הערך שהפונקציה מקבלת הוא מסוג <code>DWORD</code> שהוא unsigned<code> long</code> שזה א) unsigned וב) long דהיינו 32 סיביות, לכן יש casting (= כפייה לטייפ אחר) של הערך ל-DWORD<br />
עכשיו צריך להבין שכאשר אתה כופה -11 לטייפ unsigned ו-unsigned הרי לא יכול לקבל ערך שלילי, אז מה הערך??<br />
התשובה היא: <code>0xFFFFFFF5</code> (למה? ע"ע <a href="https://www.hamichlol.org.il/%D7%9E%D7%A9%D7%9C%D7%99%D7%9D_%D7%9C-2" target="_blank" rel="noopener noreferrer nofollow ugc">משלים ל-2</a>)</p>
<p dir="rtl"><strong>ב) איך זה ממומש באסמבלי</strong><br />
עכשיו כשנבוא לתרגם את זה לאסמבלי ונרצה להעביר את הערך <code>0xFFFFFFF5</code> בתור ארגומנט יש דבר נוסף שצריך לשים עליו לב, וזה שאם נכתוב <code>mov rcx, -11</code> אז הערך ש-rcx יקבל יהיה <code>0xFFFFFFFFFFFFFFF5</code><br />
לכן יש פה שימוש ב-ecx, שעובד אחרי שנדע התנהגות ה"הרחבה" של המעבד, כלומר איך המעבד "מרחיב" מספר בן 32 סיביות לתוך רג'יסטר בן 64 סיביות (התשובה על ידי מילוי המיקומים הריקים ב-0, למרות שבמקרה של מספר signed זה גורם לשינוי הערך של המספר)</p>
<p dir="rtl">יש עוד דברים שאפשר לשאול כמו למשל למה ה-API של ווינדוס מגדיר את הקבוע של STD_OUTPUT_HANDLE כמספר שלילי ולא מספר חיובי, וגם לזה יש תשובות טובות, ולמה -11 ולא -1, וגם לזה יש תשובה טובה</p>
<p dir="rtl">כהנה וכהנה תמיד אפשר ו<em>חייבים</em> לחטט ולהיות סקרני</p>
]]></description><link>https://tchumim.com/post/172071</link><guid isPermaLink="true">https://tchumim.com/post/172071</guid><dc:creator><![CDATA[yossiz]]></dc:creator><pubDate>Thu, 03 Sep 2026 22:43:35 GMT</pubDate></item></channel></rss>