<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3AGeraltFromRivia%2F%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04</id>
		<title>Участник:GeraltFromRivia/Лекция асм 04 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3AGeraltFromRivia%2F%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:GeraltFromRivia/%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04&amp;action=history"/>
		<updated>2026-06-09T03:22:57Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:GeraltFromRivia/%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04&amp;diff=27167&amp;oldid=prev</id>
		<title>GeraltFromRivia в 12:30, 28 июня 2012</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:GeraltFromRivia/%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04&amp;diff=27167&amp;oldid=prev"/>
				<updated>2012-06-28T12:30:33Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:GeraltFromRivia/%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04&amp;amp;diff=27167&amp;amp;oldid=27166&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>GeraltFromRivia</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:GeraltFromRivia/%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04&amp;diff=27166&amp;oldid=prev</id>
		<title>GeraltFromRivia: Новая страница: «;!!  IF  !!  thiscall 	ecx +stdcall  f(a, b, c); a -&gt; f(b, c);  push	c push	b push	a call	f  либо  push	a push 	buff call	f ret	esp, 4  f: 	mov ecx, [exp + 5]...»</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:GeraltFromRivia/%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%D0%B0%D1%81%D0%BC_04&amp;diff=27166&amp;oldid=prev"/>
				<updated>2012-06-28T12:26:27Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «;!!  IF  !!  thiscall 	ecx +stdcall  f(a, b, c); a -&amp;gt; f(b, c);  push	c push	b push	a call	f  либо  push	a push 	buff call	f ret	esp, 4  f: 	mov ecx, [exp + 5]...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;!!  IF  !!&lt;br /&gt;
&lt;br /&gt;
thiscall&lt;br /&gt;
	ecx +stdcall&lt;br /&gt;
&lt;br /&gt;
f(a, b, c);&lt;br /&gt;
a -&amp;gt; f(b, c);&lt;br /&gt;
&lt;br /&gt;
push	c&lt;br /&gt;
push	b&lt;br /&gt;
push	a&lt;br /&gt;
call	f&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
push	a&lt;br /&gt;
push 	buff&lt;br /&gt;
call	f&lt;br /&gt;
ret	esp, 4&lt;br /&gt;
&lt;br /&gt;
f:&lt;br /&gt;
	mov ecx, [exp + 5]&lt;br /&gt;
	mov [ecx], ...&lt;br /&gt;
	mov eax ecx&lt;br /&gt;
	ret 4&lt;br /&gt;
;;-------------------------------------------------------&lt;br /&gt;
if (eax &amp;lt; 5)&lt;br /&gt;
	...1&lt;br /&gt;
else&lt;br /&gt;
	...2&lt;br /&gt;
&lt;br /&gt;
то же самое, что и:&lt;br /&gt;
&lt;br /&gt;
	cmp 	eax, 5&lt;br /&gt;
	JAE 	l1	;беззнаковое сравнение jump ... equal&lt;br /&gt;
	...1&lt;br /&gt;
	JMP	l2&lt;br /&gt;
l1:&lt;br /&gt;
	...2&lt;br /&gt;
l2:&lt;br /&gt;
	...&lt;br /&gt;
;;-------------------------------------------------------&lt;br /&gt;
if (eax &amp;lt; 5 &amp;amp;&amp;amp; ebx)&lt;br /&gt;
	...1&lt;br /&gt;
else&lt;br /&gt;
	...2&lt;br /&gt;
&lt;br /&gt;
то же самое, что и:&lt;br /&gt;
&lt;br /&gt;
	cmp 	eax, 5&lt;br /&gt;
	JAE 	l1&lt;br /&gt;
	test	ebx, ebx&lt;br /&gt;
	JNZ	l1&lt;br /&gt;
	...1&lt;br /&gt;
	JMP	l2&lt;br /&gt;
l1:&lt;br /&gt;
	...2&lt;br /&gt;
l2:&lt;br /&gt;
	...&lt;br /&gt;
;;--------------------------------------------------------&lt;br /&gt;
Если ebx заменить на [ebx] то все может полететь, надо быть на готове&lt;br /&gt;
&lt;br /&gt;
сделаем теперь такое:&lt;br /&gt;
&lt;br /&gt;
if (eax &amp;gt; '0' &amp;amp;&amp;amp; ebx &amp;lt;= '9')&lt;br /&gt;
	...1&lt;br /&gt;
&lt;br /&gt;
то же самое, что и:&lt;br /&gt;
&lt;br /&gt;
	lea	ecx, [eax - '0']	;трехоперандное вычитание&lt;br /&gt;
	cmp 	ecx, '9' - '0'&lt;br /&gt;
	JA	l1	;работает с беззнаковыми числами, переход по адресу&lt;br /&gt;
	...&lt;br /&gt;
l1:&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
заметим, что компилятор очень часто именно так и переводит&lt;br /&gt;
&lt;br /&gt;
код нуля '0' представляется в виде 0x30&lt;br /&gt;
...&lt;br /&gt;
код девятки '9' представляется как 0x39&lt;br /&gt;
&lt;br /&gt;
но у нас есть целый промежуток от 0x00 до 0xFF&lt;br /&gt;
&lt;br /&gt;
поэтому мы хотим сделать сдвиг влево на 30, тогда первые 30 значений &amp;quot;уйдут в правый конец&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if ((uint)(eax - '0') &amp;lt;= '9'-'0')&lt;br /&gt;
&lt;br /&gt;
char нам знаковость не гарантирует, поэтому с ним аккуратнее(его не с амортизировали)&lt;br /&gt;
;;----------------------------------------------------------&lt;br /&gt;
    int&lt;br /&gt;
if (eax &amp;gt; '0' &amp;amp;&amp;amp; ebx &amp;lt;= '9')&lt;br /&gt;
	...1&lt;br /&gt;
&lt;br /&gt;
то же самое, что и:&lt;br /&gt;
&lt;br /&gt;
	lea	ecx, [eax - '0']	&lt;br /&gt;
	; sub	eax, '0'&lt;br /&gt;
	cmp 	ecx, '9' - '0'&lt;br /&gt;
	JA	l1&lt;br /&gt;
	...&lt;br /&gt;
l1:&lt;br /&gt;
	...&lt;br /&gt;
;;-------------------------------------------------------------&lt;br /&gt;
5) MOV	eax, 1&lt;br /&gt;
2) xoc	eax, eax&lt;br /&gt;
1) inc	eax,&lt;br /&gt;
&lt;br /&gt;
;;=============================================================&lt;br /&gt;
;!! SWITCH  !!&lt;br /&gt;
&lt;br /&gt;
switch(eax)&lt;br /&gt;
{&lt;br /&gt;
case 1:&lt;br /&gt;
	...1&lt;br /&gt;
	break;&lt;br /&gt;
case 3:&lt;br /&gt;
case 4:&lt;br /&gt;
	...2&lt;br /&gt;
default&lt;br /&gt;
	...3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
реализуется так:&lt;br /&gt;
&lt;br /&gt;
table dd	l3, l1, l3, l2, l2	;находится в сегменте данных для чтения&lt;br /&gt;
&lt;br /&gt;
	CMP	eax, 4&lt;br /&gt;
	JA	l3&lt;br /&gt;
	JMP	dword [table + eax + 4]	;dword = double word&lt;br /&gt;
l1:&lt;br /&gt;
	...1&lt;br /&gt;
	JMP l4&lt;br /&gt;
l2:&lt;br /&gt;
	...2&lt;br /&gt;
l3:&lt;br /&gt;
	...3&lt;br /&gt;
l4:&lt;br /&gt;
	...4&lt;br /&gt;
&lt;br /&gt;
;;=======================================================================&lt;br /&gt;
;!! WHILE !!&lt;br /&gt;
задачка - реализовать while (eax &amp;gt; 3) ...;&lt;br /&gt;
&lt;br /&gt;
l1:&lt;br /&gt;
	cmp	eax, 3&lt;br /&gt;
	JBE	l2	;jump belong to equal&lt;br /&gt;
	...1&lt;br /&gt;
	JMP	l1&lt;br /&gt;
l2:&lt;br /&gt;
	...2&lt;br /&gt;
;;------------------------------------------------------------------&lt;br /&gt;
задачка - реализовать do ... while (eax &amp;gt; 3)&lt;br /&gt;
&lt;br /&gt;
l1:&lt;br /&gt;
	...1&lt;br /&gt;
	cmp	eax, 3&lt;br /&gt;
	JA	l1&lt;br /&gt;
&lt;br /&gt;
заметим, что во втором случае, у нас и конструкция легче, и кода меньше(проще)&lt;br /&gt;
как модифицировать while, чтоьы по эффективности он догнал do...while?&lt;br /&gt;
&lt;br /&gt;
	CMP	eax, 3&lt;br /&gt;
	JBE	12&lt;br /&gt;
l1:&lt;br /&gt;
	cmp	eax, 3&lt;br /&gt;
	JA	l1&lt;br /&gt;
l2:&lt;br /&gt;
&lt;br /&gt;
;;=============================================================================&lt;br /&gt;
;!! FOR  !!&lt;br /&gt;
&lt;br /&gt;
for (uint eax = 0; eax &amp;lt; 5; eax++)	;uint = unsigned integer&lt;br /&gt;
{...}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	XOR	eax, eax&lt;br /&gt;
l1:&lt;br /&gt;
	...&lt;br /&gt;
	inc	eax&lt;br /&gt;
	emp	eax, 5&lt;br /&gt;
	JB	l1&lt;br /&gt;
;;----------------------------------------------------------------------------&lt;br /&gt;
for (uint eax = 4; eax &amp;gt;= 0; eax--)&lt;br /&gt;
{...}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	mov	eax, 4&lt;br /&gt;
l1:&lt;br /&gt;
	...&lt;br /&gt;
	SUB	eax, 1&lt;br /&gt;
	JNC	l1&lt;/div&gt;</summary>
		<author><name>GeraltFromRivia</name></author>	</entry>

	</feed>