Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по программированию (от Ассемблера до Делфи)


Информационный Канал Subscribe.Ru


Низкоуровневый язык программирования Ассемблер
урок 4
Регистры. Продвинутая инструкция по применению

На этом уроке вы наверняка узнаете о том, что 8-ми, 16-ти и 32-ух разрядные регистры связаны друг с другом семейными узами, а также вы узнаете о том, что можно делать с содержимым регистров.

Давайте-ка попытаемся вспомнить о существовании регистра ax, а также о существовании регистров ah и al. Ничего общего не находите? Не знаю как вы, но мне показалось, что названия этих регистров начинаются с буквы "a". И на самом деле - если очень внимательно приглядеться, то можно увидеть в их названии символ "a". Вот этот символ то и связывает друг с другом регистры ax, ah и al. Еще бы понять каким образом они связаны... А связаны они таким образом, что регистр ax содержит в себе оба регистра ah и al. Звучит просто фантастически, но что же это означает? Вторая буковка в названии регистра ah называется "h" или "high" или "старший", у регистра al это буковка "l" или "low" или "младший". Регистр ax является 16-ти разрядным, то есть состоит из двух байтов. Дак вот один из этих байтов это регистр ah, а второй - al.

Например, в регистре ax находится число: 1234ABCD (шеснадцатиричная система счисления). Это число по определению должно содержаться в двух байтах. Таким образом мы получаем, что в регистре ah будет содержаться число 1234 (так как он старший), а в регистре al - ABCD. Чудненько, чудьненько.

Вся фишка в том, что таким же образом регистр bx связан с регистрами bh и bl, регистр cx - с регистрами ch и cl, а регистр dx - с регистрами dh и dl. Но и это еще не все!! Помните о регистрах eax, ebx, ecx и edx? Догадываетесь к чему это я? Дак вот, регистр eax содержит в себе регистр ax, который в свою очередь содержит ah и al. Но тут возникает жизненно важный вопрос: почему eax содержит в себе только ax, ведь eax - 32-ух разрядный, а ax - 16-ти? Прикол в том, что я и сам в общем-то не знаю ответа на этот вопрос...Единственное, что я знаю дак это то, что ax является младшей частью регистра eax.

Ну, а теперь, когда мы вникли в анатомические особенности регистров, можно и поглядеть как над ними можно издеваться. Для начала научимся в них чего-нибудь писать. А делают это обычно командой "mov":


Для 8-ми разрядных регистров:
mov ah, 09h
mov dl, 0FFh
mov ch, 0A9h
mov dh, 0Ah
mov ah, al
mov dl, ch

Для 16-ти разрядных регистров:
mov ax, 0AFFh
mov dx, 0FFFFh
mov cx, 1234h
mov bx, 0ABCDh
mov cx, ax
mov dx, bx

И, наконец, для 32-ух разрядных регистров:
mov eax, 0ABCD1234h
mov ebx, 1234ABCDh
mov ecx, 1A2B3C4Dh
mov edx, 0A1B2C3D4h
mov eax, ecx
mov edx, ebx

Обратите внимание на то, что все числа указаны в шестнадцатиричной системе счисления - об этом говорит буковка "h" в конце каждого числа. Кроме этого, если первым символом числа стоит буква (например "A9"), то в этом случае перед ней добавляют "0" (для "A9" - "0A9").

На этом издевательства над регистрами не заканчиваются. Следующая продвинутая техника садизма называется сложением (команда add), и как обычно начинаем с примеров:


Для 8-ми разрядных регистров:
add ah, 09h
add dl, 01h
add ch, 0A9h
add dh, 0Ah
add ah, al
add dl, ch

Для 16-ти разрядных регистров:
add ax, 0AFFh
add dx, 0FFFFh
add cx, 1234h
add bx, 0ABCDh
add cx, ax
add dx, bx

Аналогично и для 32-ух разрядных регистров...

Таким образом, чтобы прибавить к регистру, например, ax число 0AFFh поступают так: add ax, 0AFFh. Чтобы прибавить к этому же регистру другой регистр (например "bx"), то делают так: mov ax, bx. Все просто!

Другая продвинутая техника садизма называется вычитанием (команда sub). Действует она точно также как и сложение. Пример: sub ax, 08h.

Вот здесь я и закончу свои повествования о том, что есть регистры. Очевидно что я не сказал еще многого о них, но не все сразу - остальное вы узнаете по мере необходимости. Для любопытных - на моем сайте (http://www.evolverstation.narod.ru) выложены справочники по командам Асма. Так что смотрите и разбирайтесь.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное