Ассемблер в Linux для программистов C: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 665:
в %eax теперь 0x00000002 */
movl $1, %ecx /* поместить число 0x000000011 в %ecx */
movl other_var(,%ecx,4), %eax /* поместить в %eax первый (нумерация с нуля) элемент массива other_var,
пользуясь %ecx как индексным регистром */
movl $other_var, %ebx /* поместить в %ebx адрес указателя на массивмассива other_var */
movl 4(%ebx), %eax /* обратиться по адресу %ebx + 4;
в %eax снова 0x00000002 */
movl $other_var + 4, %eax /* поместить в %eax адрес, по которому расположен 0x00000002
(адрес указателя на массивмассива плюс 4 байта на-- пропустить нулевой элемент) */
movl $0x15, (%eax) /* записать по адресу "то, что записано в %eax" число 0x00000015 */
</pre>
 
Внимательно следите, когда вы загружаете адрес переменной, а когда обращаетесь к значению переменной по её адресу. Например:
 
<pre>
movl other_var + 4, %eax /* забыли знак $, в результате в %eax находится число 0x00000002 */
movl $0x15, (%eax) /* пытаемся записать по адресу 0x00000002 -> получаем segmentaionsegmentation fault */
movl 0x48, %eax /* забыли $, и пытаемся обратиться по адресу 0x00000048 -> segmentaionsegmentation
fault */
</pre>
Строка 797 ⟶ 799 :
|<code>mull</code> ||<code>%eax</code> ||64 бита: младшая часть в <code>%eax</code>, старшая в <code>%edx</code>
|}
Вопрос: как действует mull на 64-битной архитектуре?
 
Примеры:
Строка 1197 ⟶ 1198 :
Команды <code>and</code>, <code>or</code> и <code>xor</code> ведут себя так же, как и операторы языка Си <code>&</code>, <code>|</code>, <code>^</code>. Эти команды устанавливают флаги согласно результату.
 
Команда <code>not</code> инвертирует каждый бит операнда (изменяет на противоположный), так же как и оператор языка Си <code>~</code>.
 
Команда <code>test</code> выполняет побитовое И над операндами, как и команда <code>and</code>, но, в отличие от неё, операнды не изменяет, а только устанавливает флаги. Её также называют командой логического сравнения, потому что с её помощью удобно проверять, установлены ли определённые биты. Например, так:
 
<pre>
testb $0x000010000b00001000, %al /* установлен ли 3-й (с нуля) бит? */
je not_set
/* нужные биты установлены */
Строка 1208 ⟶ 1209 :
/* биты не установлены */
</pre>
 
Обратите внимание на запись константы в двоичной системе счисления: используетяс префикс <code>0b</code>.
 
Команду <code>test</code> можно применять для сравнения значения регистра с нулём: