<?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=207332&amp;view=findpost&amp;p=2432221</guid>
        <pubDate>Wed, 25 Nov 2009 15:52:10 +0000</pubDate>
        <title>Преобразование числа в строку и наоборот</title>
        <link>https://forum.sources.ru/index.php?showtopic=207332&amp;view=findpost&amp;p=2432221</link>
        <description><![CDATA[codegrinder: Перевод беззнакового 32-битного числа в строку:<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">dword_to_STR:</div><div class="code_line">; eax - число</div><div class="code_line">; edi - указатель на выходную строку</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;push edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;xor edx, edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;div [_10]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;test eax, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;je stop_recursion</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;call dword_to_STR</div><div class="code_line">&nbsp;stop_recursion:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov eax, edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;add al, &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;stosb</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pop edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret</div><div class="code_line">_10 &nbsp; dd 10</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>codegrinder</author>
        <category>Assembler FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=207332&amp;view=findpost&amp;p=1737187</guid>
        <pubDate>Sun, 21 Oct 2007 13:11:06 +0000</pubDate>
        <title>Преобразование числа в строку и наоборот</title>
        <link>https://forum.sources.ru/index.php?showtopic=207332&amp;view=findpost&amp;p=1737187</link>
        <description><![CDATA[Ahilles:  <br>
<div class='tag-align-center'><span class='tag-size' data-value='13' style='font-size:13pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>Преобразование числа в строку и наоборот</strong></span></span></div><br>
Два следующих алгоритма пригодятся всем кто не хочет использовать стандартные функции из библиотеки С, и тем кто пишет ОС либо пишет драйвер на ассемблере.<br>
функция dword_to_STR преобразовывает число в строку, число в строке может быть в любой системе счисления 2-16, если число больше чем 7FFFFFFF то число считается отрицательным<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">dword_to_STR:</div><div class="code_line">;на входе EAX число 32 бит</div><div class="code_line">; &nbsp; &nbsp; &nbsp; &nbsp; ESI указатель на строку</div><div class="code_line">; &nbsp; &nbsp; &nbsp; &nbsp; EBX разрядность результата (не больше 16)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pushad</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cmp ebx, 16</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ja &nbsp;.end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cmp eax, 7FFFFFFFh</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;jna .sign_plus</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov byte [esi], &#39;-&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;not eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; .sign_plus:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;xor ecx, ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;jmp .repeat</div><div class="code_line">&nbsp;</div><div class="code_line">.mesto db 32 dup (0)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.repeat:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;xor edx, edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;div ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov edi, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov al, dl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cmp al, 10</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sbb al, 69h</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;das</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov byte [.mesto+ecx], al</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov eax, edi</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cmp eax, 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;jz .endrep</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;jmp .repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;.endrep:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov edi, .mesto</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;add edi, ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;.copyrep:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dec edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov dl, byte [edi]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mov byte [esi], dl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc esi</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;loop .copyrep</div><div class="code_line">&nbsp;&nbsp; &nbsp;.end:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;popad</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div><br>
функция STR_to_DWORD преобразовывает число в строку, число в строке должно быть положительным, если происходит какая-либо ошибка, то результат 0<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">STR_to_DWORD:</div><div class="code_line">; IN &nbsp;ESI = указатель на ZS строку</div><div class="code_line">; &nbsp; &nbsp; EAX = разрядность</div><div class="code_line">; OUT EAX = результат</div><div class="code_line">&nbsp;&nbsp; &nbsp;push esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;push ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;push edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;push edx</div><div class="code_line">&nbsp;&nbsp; &nbsp;push ecx</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp eax, 16</div><div class="code_line">&nbsp;&nbsp; &nbsp;ja .error</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp eax, 2</div><div class="code_line">&nbsp;&nbsp; &nbsp;jb .error</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ecx, eax</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edi, esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;call GetZSLength</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edi, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;add edi, esi &nbsp;; edi point to end ZS</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor eax, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor edx, edx</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc edx</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; .rep:</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec edi</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor ebx, ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov bl, [edi]</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp bl, 30h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jb .error</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp bl, 39h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jna .digit</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp bl, 41h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jb .error</div><div class="code_line">&nbsp;&nbsp; @@:</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp bl, 46h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jna .sim_upcase</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp bl, 61h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jb .error</div><div class="code_line">&nbsp;&nbsp; @@:</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp bl, 66h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jna .sim_lowcase</div><div class="code_line">&nbsp;&nbsp; &nbsp;ja .error</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; .digit:</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub bl, 30h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp @f</div><div class="code_line">&nbsp;&nbsp; .sim_upcase:</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub bl, 37h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp @f</div><div class="code_line">&nbsp;&nbsp; .sim_lowcase:</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub bl, 57h</div><div class="code_line">&nbsp;&nbsp; @@:</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp bl, cl</div><div class="code_line">&nbsp;&nbsp; &nbsp;ja .error</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;imul ebx, edx</div><div class="code_line">&nbsp;&nbsp; &nbsp;add eax, ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;imul edx, ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp edi, esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;jnz .rep</div><div class="code_line">&nbsp;&nbsp; .endrep:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp @f</div><div class="code_line">&nbsp;&nbsp; .error:</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor eax, eax</div><div class="code_line">&nbsp;&nbsp; @@:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop edx</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret</div></ol></div></div></div></div><br>
функция STR_to_DWORD_EX использует предыдущую функцию, но может преобразовывать и отрицательнгые числа, поддерживает только 2, 8, 10, 16 системы счисления, разрядность указывать не надо, она поределяет её сама по символу в конце числа (b-2, o-8, h-16, иначе -10)<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">STR_to_DWORD_EX:</div><div class="code_line">; IN &nbsp;ESI = pointer to ZS</div><div class="code_line">; OUT EAX = result</div><div class="code_line">&nbsp;&nbsp; &nbsp;push esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;push ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;push edi</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor ebx, ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp byte [esi], &#39;-&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp;jnz .sign_plus</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ebx, 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc esi</div><div class="code_line">&nbsp;&nbsp; .sign_plus:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edi, esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;call GetZSLength</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edi, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;add edi, esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp byte [edi], &quot;b&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;jnz .oct</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, 2</div><div class="code_line">&nbsp;&nbsp; &nbsp;xchg byte [edi], bh</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp .convert</div><div class="code_line">&nbsp;&nbsp; .oct:</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp byte [edi], &quot;o&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;jnz .hex</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, 8</div><div class="code_line">&nbsp;&nbsp; &nbsp;xchg byte [edi], bh</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp .convert</div><div class="code_line">&nbsp;&nbsp; .hex:</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp byte [edi], &quot;h&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;jnz .decim</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, 16</div><div class="code_line">&nbsp;&nbsp; &nbsp;xchg byte [edi], bh</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp .convert</div><div class="code_line">&nbsp;&nbsp; .decim:</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, 10</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov bh, byte [edi]</div><div class="code_line">&nbsp;&nbsp; .convert:</div><div class="code_line">&nbsp;&nbsp; &nbsp;call STR_to_DWORD</div><div class="code_line">&nbsp;&nbsp; &nbsp;xchg byte [edi], bh</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor bh, bh</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp ebx, 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;jnz .end</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor ebx, ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub ebx, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, ebx</div><div class="code_line">&nbsp;&nbsp; .end:</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret</div></ol></div></div></div></div><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">GetZSLength:</div><div class="code_line">; get zero-string length</div><div class="code_line">;IN</div><div class="code_line">; &nbsp; &nbsp; &nbsp; EDI ZS offset</div><div class="code_line">;OUT</div><div class="code_line">; &nbsp; &nbsp; &nbsp; EAX ZS length</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push esi</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor &nbsp; al, al</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ecx, 0FFFFFFFFh</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov esi, edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;repne scasb</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub edi, esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov eax, edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec eax</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div>]]></description>
        <author>Ahilles</author>
        <category>Assembler FAQ</category>
      </item>
	
      </channel>
      </rss>
	