<?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_02</id>
		<title>Участник:GeraltFromRivia/Лекция асм 02 - История изменений</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_02"/>
		<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_02&amp;action=history"/>
		<updated>2026-05-11T19:37:46Z</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_02&amp;diff=27164&amp;oldid=prev</id>
		<title>GeraltFromRivia: Новая страница: «Сегодня по плану у нас обзор команд, &quot;ret&quot; это хорошо, но мало. У архитектуры x86 есть 8 различ...»</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_02&amp;diff=27164&amp;oldid=prev"/>
				<updated>2012-06-28T12:23:51Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «Сегодня по плану у нас обзор команд, &amp;quot;ret&amp;quot; это хорошо, но мало. У архитектуры x86 есть 8 различ...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Сегодня по плану у нас обзор команд, &amp;quot;ret&amp;quot; это хорошо, но мало.&lt;br /&gt;
У архитектуры x86 есть 8 различных регистров, которые являются сокращениями выполняемых ими действий:&lt;br /&gt;
    eax, ebx, ecx, edx, ebp, esp, esi, edi.&lt;br /&gt;
    hint: esp&amp;lt;... stack pointer&amp;gt; вообще его не трогают, поэтому по факту есть 7 регистров.&lt;br /&gt;
    eip - мы можем читать, но не можем в него писать.&lt;br /&gt;
    eflags - регистор флажков(флагов много, но полезных для нас мало), нужные только:&lt;br /&gt;
        zf&amp;lt;zeroflag&amp;gt;(после выполнения операции и получаем нолу, флаг нуля становится 1);&lt;br /&gt;
        cf&amp;lt;carryflag&amp;gt;(следит за переполнением)&lt;br /&gt;
        sf&amp;lt;signflag&amp;gt;(следит за главным битом числа - знаком)&lt;br /&gt;
        df&amp;lt;... flag&amp;gt;(флаг направления - нужен для строковых операций)&lt;br /&gt;
    все регистровые операции 32х битные.&lt;br /&gt;
    Чтобы сильно не путаться, мы будем рассматривать 32х битный &amp;quot;мир&amp;quot;(если мы будем менять регистр ах&amp;lt;16 бит&amp;gt;, то будут изменяться только первые 16 бит у еах).&lt;br /&gt;
    - можно разбить ах на два подрегистра - al и ah(по 8 бит)&lt;br /&gt;
Одна из значимых команд для пересылки данных это &amp;quot;mov&amp;quot;&lt;br /&gt;
Еще есть команды &amp;quot;movzx&amp;quot;(расширяет нулями) и &amp;quot;movsx&amp;quot;(расширяет знаками)&lt;br /&gt;
Команды условной загрузки позволяют одним регистрам загрузить значения другого регистра &amp;quot;movcc&amp;quot;&lt;br /&gt;
Из загрузок у нас есть еще команда &amp;quot;xchg&amp;quot; - swap значений 2х регистров&lt;br /&gt;
Команда &amp;quot;bswap&amp;quot; заменяет порядок следования байтов, так сказать замена BigEndian на LittleEndian и наоборот.&lt;br /&gt;
    hint: LE немного удобнее, например каст int to char получается задаром (smile)&lt;br /&gt;
Доп две команды &amp;quot;push&amp;quot; и &amp;quot;pop&amp;quot; - вставить на стэк, и вытащить из стека.&lt;br /&gt;
Malloc и free можно использовать и в ассемблере.&lt;br /&gt;
Еще парочка комманд: &amp;quot;pusha&amp;quot; и &amp;quot;popa&amp;quot;, кто не понял:&lt;br /&gt;
    &amp;lt; popa(d) = popad &amp;gt;&lt;br /&gt;
&lt;br /&gt;
ПРИМЕРbI:&lt;br /&gt;
    MOV al, 5&lt;br /&gt;
    MOV cx, dx&lt;br /&gt;
    MOVZX eax, bl&lt;br /&gt;
    MOVSX ..., ...&lt;br /&gt;
    MOVcc ..., ...&lt;br /&gt;
    XCHG eax, ebx&lt;br /&gt;
    PUSH eax&lt;br /&gt;
    POP eax&lt;br /&gt;
&lt;br /&gt;
//==============================================================================&lt;br /&gt;
MUL ebx&lt;br /&gt;
    edx:eax = eax + OP&lt;br /&gt;
DIV ebx&lt;br /&gt;
    eax = edx:eax / OP&lt;br /&gt;
    edx = edx:eax % OP&lt;br /&gt;
runtimeerror 200 = divizion by zero(на самом деле прога на ноль не делит, поэтому перед делением лучше обнулить edx)&lt;br /&gt;
    hint: если не понятно - почитайте doc.&lt;br /&gt;
Две эквивалентные формулы:&lt;br /&gt;
    imul ecx, ebx        &amp;lt;=&amp;gt;     ecx *= ebx&lt;br /&gt;
    imul ecx, ebx, 5        &amp;lt;=&amp;gt;     ecx = ebx * 5&lt;br /&gt;
&lt;br /&gt;
ADD eax, ebx        &amp;lt;=&amp;gt;     eax += ebx&lt;br /&gt;
&lt;br /&gt;
INC и DEC команды инкремента и декремента&lt;br /&gt;
    hint: эти команды не трогают флаг переноса, по сравнению с операциями сложениями и вычитания&lt;br /&gt;
INC eax&lt;br /&gt;
&lt;br /&gt;
LEA eax, [ebx + ecx]        &amp;lt;=&amp;gt;         eax = ebx + ecx&lt;br /&gt;
LEA eax, [ebx * 5]      &amp;lt;=&amp;gt;      LEA eax, [ebx + ebx * 4]&lt;br /&gt;
&lt;br /&gt;
Еще у нас есть команды логики:&lt;br /&gt;
    AND / OR / XOR / NOT&lt;br /&gt;
        XOR eax, eax    (быстрое обнуление)&lt;br /&gt;
&lt;br /&gt;
CMP - команда сравнения(compare)&lt;br /&gt;
&lt;br /&gt;
странные команды - TEST, SUB, SHRD, SHLD, ROR, ROL, label:&lt;br /&gt;
    TEST eax, eax&lt;br /&gt;
&lt;br /&gt;
команды сдвига - SHR / SHL      &amp;lt;=&amp;gt;     &amp;gt;&amp;gt;, &amp;lt;&amp;lt;&lt;br /&gt;
    SHR eax, 2   (быстрое деление на 4)&lt;br /&gt;
Циклические сдвиги - RCL, RCR&lt;br /&gt;
&lt;br /&gt;
Переход по... - JMP&lt;br /&gt;
&lt;br /&gt;
команда вызова функции: CALL, RET&lt;br /&gt;
    Call        &amp;lt;=&amp;gt;&lt;br /&gt;
    Ret     &amp;lt;=&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOP - команда которая ничего не делает&lt;br /&gt;
UD2 - команда, которая всегда завалит программу(такой команды определенно нет)&lt;/div&gt;</summary>
		<author><name>GeraltFromRivia</name></author>	</entry>

	</feed>