<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778926</guid>
        <pubDate>Mon, 24 Sep 2018 08:02:35 +0000</pubDate>
        <title>затирает локальные переменные</title>
        <link>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778926</link>
        <description><![CDATA[kin01: <strong class='tag-b'>Jin X</strong>, к переменной обращения вообще нет. На самом деле значение этой переменной изменяется уже после вызова GetProcessHeap. Но это всё действительно из-за того что Delphi делает по странному кадр фрейма, а именно размещение локальных переменных.]]></description>
        <author>kin01</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778923</guid>
        <pubDate>Mon, 24 Sep 2018 07:25:29 +0000</pubDate>
        <title>затирает локальные переменные</title>
        <link>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778923</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>HeapAlloc</strong> в Delphi без обёртки.<br>
А работа с динамической памятью там вообще идёт без него.<br>
Тут вообще проблема в другом.<br>
<br>
<strong class='tag-b'>kin01</strong>, с чего вы решили, что локальная переменная <strong class='tag-b'>p</strong> затирается? Если обращаетесь к <strong class='tag-b'>p</strong> через masm64 (вроде <strong class='tag-b'>mov rax,p</strong>), тогда логично, т.к. в первом коде у вас фрейм сделан по странной манере Delphi, а не как положено. Т.е. сначала уменьшается ESP, а затем делается <strong class='tag-b'>mov ebp,esp</strong>. Надо наоборот. В общем-то, как в последнем вашем коде (в процедуре my_test, а в main осталось по-старому).<br>
Почему положено именно так (почему в Delphi сделано странно)? Потому есть есть инструкции <strong class='tag-b'>enter</strong> и <strong class='tag-b'>leave</strong> специально предназначенные для создания фрейма, и они работают как раз таким образом. Так что, в конце процедуры (перед <strong class='tag-b'>ret</strong>) можно просто поставить <strong class='tag-b'>leave</strong> безо всяких <strong class='tag-b'>add rsp,...</strong> + <strong class='tag-b'>pop rbp</strong>.<br>
Кстати, почему в main нет эпилога? И <strong class='tag-b'>ret</strong> в конце я бы заменил на <strong class='tag-b'>invoke ExitProcess, 0</strong> всё-таки (т.к. если вы напишете такую прогу на fasm, там <strong class='tag-b'>ret</strong> выкинет вас в никуда). Но тогда эпилог не нужен (из <strong class='tag-b'>ExitProcess</strong> всё равно не будет возврата).<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">include c:\masm32\include64\masm64rt.inc</div><div class="code_line">&nbsp;</div><div class="code_line">NOSTACKFRAME</div><div class="code_line">&nbsp;</div><div class="code_line">.code</div><div class="code_line">&nbsp;</div><div class="code_line">my_test proc</div><div class="code_line">LOCAL p : QWORD</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push rbp</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rbp, rsp</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub rsp, 32+8+8 ; эти 3 инструкции можно заменить на один enter 48,0</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rcx,1234567890ABCDEFh</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov p,rcx &nbsp; ; test</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;call GetProcessHeap</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rcx, rax</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edx, HEAP_ZERO_MEMORY</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov r8d, 24</div><div class="code_line">&nbsp;&nbsp; &nbsp;call HeapAlloc</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rcx,p &nbsp; ; test</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;leave</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret</div><div class="code_line">my_test endp</div><div class="code_line">&nbsp;</div><div class="code_line">main proc</div><div class="code_line">&nbsp;&nbsp; &nbsp;push rbp</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rbp, rsp</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub rsp, 50h &nbsp; &nbsp;; эти 3 инструкции тоже можно заменить на enter 50h,0</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;call my_test</div><div class="code_line">&nbsp;&nbsp; &nbsp;leave &nbsp;; хотя, здесь это можно убрать, всё равно вызываем ExitProcess</div><div class="code_line">&nbsp;&nbsp; &nbsp;invoke ExitProcess,0</div><div class="code_line">main endp</div><div class="code_line">&nbsp;</div><div class="code_line">end</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778896</guid>
        <pubDate>Sun, 23 Sep 2018 19:53:57 +0000</pubDate>
        <title>затирает локальные переменные</title>
        <link>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778896</link>
        <description><![CDATA[Qraizer: Блин, ну вот нету у меня под рукой masmового SDK64.<br>
<strong class='tag-b'>kin01</strong>, я сильно подозреваю, что дельфийный HeapAlloc() – это совсем не WinAPIховый, а только лишь некий thunk к нему. Посмотри в отладчике дальше, внутрь HeapAlloc(). Почти уверен, в kernel32 ты попадёшь не сразу.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778890</guid>
        <pubDate>Sun, 23 Sep 2018 19:07:41 +0000</pubDate>
        <title>затирает локальные переменные</title>
        <link>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778890</link>
        <description><![CDATA[kin01: Так правильно?<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">include c:\masm32\include64\masm64rt.inc</div><div class="code_line">&nbsp;</div><div class="code_line">NOSTACKFRAME</div><div class="code_line">&nbsp;</div><div class="code_line">.code</div><div class="code_line">&nbsp;</div><div class="code_line">my_test proc</div><div class="code_line">LOCAL p : QWORD</div><div class="code_line">&nbsp;</div><div class="code_line">push rbp</div><div class="code_line">mov rbp, rsp</div><div class="code_line">sub rsp, 32 + 8 + 8</div><div class="code_line">&nbsp;</div><div class="code_line">call GetProcessHeap</div><div class="code_line">mov rcx, rax</div><div class="code_line">mov edx, HEAP_ZERO_MEMORY</div><div class="code_line">mov r8d, 24</div><div class="code_line">call HeapAlloc</div><div class="code_line">add rsp, 32 + 8 + 8</div><div class="code_line">pop rbp</div><div class="code_line">ret</div><div class="code_line">my_test endp</div><div class="code_line">&nbsp;</div><div class="code_line">main proc</div><div class="code_line">push rbp</div><div class="code_line">sub rsp, 50h</div><div class="code_line">mov rbp, rsp</div><div class="code_line">&nbsp;</div><div class="code_line">call my_test</div><div class="code_line">ret</div><div class="code_line">main endp</div><div class="code_line">&nbsp;</div><div class="code_line">end</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-09-23T19:12:38+00:00">23.09.18, 19:12</time></span></span><br>
поправил на add rsp, 32 + 8 + 8 перед выходом]]></description>
        <author>kin01</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778865</guid>
        <pubDate>Sat, 22 Sep 2018 20:40:17 +0000</pubDate>
        <title>затирает локальные переменные</title>
        <link>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778865</link>
        <description><![CDATA[kin01: Студия сгенерировала больше места, не считая возврат результата.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">LPVOID my_alloc()</div><div class="code_line">{</div><div class="code_line">000000013F311A50 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;rbp &nbsp;</div><div class="code_line">000000013F311A52 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;rdi &nbsp;</div><div class="code_line">000000013F311A53 &nbsp;sub &nbsp; &nbsp; &nbsp; &nbsp; rsp,108h &nbsp;</div><div class="code_line">000000013F311A5A &nbsp;lea &nbsp; &nbsp; &nbsp; &nbsp; rbp,[rsp+20h] &nbsp;</div><div class="code_line">000000013F311A5F &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; rdi,rsp &nbsp;</div><div class="code_line">000000013F311A62 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; ecx,42h &nbsp;</div><div class="code_line">000000013F311A67 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; eax,0CCCCCCCCh &nbsp;</div><div class="code_line">000000013F311A6C &nbsp;rep stos &nbsp; &nbsp;dword ptr [rdi] &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;LPVOID i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return HeapAlloc(GetProcessHeap(), 8, 24);</div><div class="code_line">000000013F311A6E &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;qword ptr [__imp_GetProcessHeap (013F320000h)] &nbsp;</div><div class="code_line">000000013F311A74 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; r8d,18h &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;LPVOID i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return HeapAlloc(GetProcessHeap(), 8, 24);</div><div class="code_line">000000013F311A7A &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; edx,8 &nbsp;</div><div class="code_line">000000013F311A7F &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; rcx,rax &nbsp;</div><div class="code_line">000000013F311A82 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;qword ptr [__imp_HeapAlloc (013F320030h)] &nbsp;</div><div class="code_line">}</div><div class="code_line">000000013F311A88 &nbsp;lea &nbsp; &nbsp; &nbsp; &nbsp; rsp,[rbp+0E8h] &nbsp;</div><div class="code_line">000000013F311A8F &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; rdi &nbsp;</div><div class="code_line">000000013F311A90 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; rbp &nbsp;</div><div class="code_line">000000013F311A91 &nbsp;ret</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-09-22T20:44:06+00:00">22.09.18, 20:44</time></span></span><br>
Теперь надо понять как грамотно записывать в masm, чтобы был отступ. Не заводить же переменные пустышки для этого. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-09-22T20:49:18+00:00">22.09.18, 20:49</time></span></span><br>
Плюс чтобы стеку программы дали памяти под все переменные в ней. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-09-22T20:54:03+00:00">22.09.18, 20:54</time></span></span><br>
Это задаётся как-то так ?<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$pdata$my_test DD imagerel my_test</div><div class="code_line">&nbsp;&nbsp; &nbsp;DD &nbsp;imagerel my_test+48</div><div class="code_line">&nbsp;&nbsp; &nbsp;DD &nbsp;imagerel $unwind$my_test</div></ol></div></div></div></div>]]></description>
        <author>kin01</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778859</guid>
        <pubDate>Sat, 22 Sep 2018 19:36:45 +0000</pubDate>
        <title>затирает локальные переменные</title>
        <link>https://forum.sources.ru/index.php?showtopic=413563&amp;view=findpost&amp;p=3778859</link>
        <description><![CDATA[kin01: Подсмотрел код процедуры в Delphi:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure br;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;p: pointer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, 24);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Project12.dpr.16: begin</div><div class="code_line">0000000000536660 55 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; push rbp</div><div class="code_line">0000000000536661 4883EC30 &nbsp; &nbsp; &nbsp; &nbsp; sub rsp,</div><div class="code_line">0000000000536665 488BEC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov rbp,rsp</div><div class="code_line">Project12.dpr.17: HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, 24);</div><div class="code_line">0000000000536668 E8F348EEFF &nbsp; &nbsp; &nbsp; call GetProcessHeap</div><div class="code_line">000000000053666D 4889C1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov rcx,rax</div><div class="code_line">0000000000536670 C7C208000000 &nbsp; &nbsp; mov edx,{text}000008</div><div class="code_line">0000000000536676 41C7C018000000 &nbsp; mov r8d,{text}000018</div><div class="code_line">000000000053667D E8AE49EEFF &nbsp; &nbsp; &nbsp; call HeapAlloc</div><div class="code_line">Project12.dpr.18: end;</div><div class="code_line">0000000000536682 488D6530 &nbsp; &nbsp; &nbsp; &nbsp; lea rsp,[rbp+]</div><div class="code_line">0000000000536686 5D &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pop rbp</div><div class="code_line">0000000000536687 C3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret</div></ol></div></div></div></div><br>
<br>
теперь хочу сделать тоже самое в masm<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">include c:\masm32\include64\masm64rt.inc</div><div class="code_line">&nbsp;</div><div class="code_line">NOSTACKFRAME</div><div class="code_line">&nbsp;</div><div class="code_line">.code</div><div class="code_line">&nbsp;</div><div class="code_line">my_test proc</div><div class="code_line">&nbsp;&nbsp; &nbsp;LOCAL p : QWORD</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push rbp</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub rsp, 30h</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rbp, rsp</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;call GetProcessHeap</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rcx, rax</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edx, HEAP_ZERO_MEMORY</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov r8d, 24</div><div class="code_line">&nbsp;&nbsp; &nbsp;call HeapAlloc</div><div class="code_line">&nbsp;&nbsp; &nbsp;lea rsp, [rbp + 30h]</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop rbp</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret</div><div class="code_line">my_test endp</div><div class="code_line">&nbsp;</div><div class="code_line">main proc</div><div class="code_line">&nbsp;&nbsp; &nbsp;push rbp</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub rsp, 50h</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rbp, rsp</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;call my_test</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret</div><div class="code_line">main endp</div><div class="code_line">&nbsp;</div><div class="code_line">end</div></ol></div></div></div></div><br>
<br>
После вызова HeapAlloc в переменную  LOCAL p : QWORD попадает мусор. Много читал тем по стеку в win64, но видимо до сих пор что-то не понима. В Delphi может это вообще не процедуры а метки. Пытался и код выровнять в masm. Может это Delphi дизассемблер что-то неправильно показывает? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-09-22T20:19:46+00:00">22.09.18, 20:19</time></span></span><br>
Это резерв для функций которые будут вызыватся в теле основной функции? То есть переменные в masm надо размещать после 32 байт? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-09-22T20:29:07+00:00">22.09.18, 20:29</time></span></span><br>
То есть sub rsp, 30h это под одну локальную переменную + 32 для все вызовов что будут внутри. Плюс иногда возможно нужно выравнивание до 16]]></description>
        <author>kin01</author>
        <category>Assembler</category>
      </item>
	
      </channel>
      </rss>
	