Низкоуровневый язык программирования Ассемблер урок 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":
И, наконец, для 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), и как обычно начинаем с примеров:
Таким образом, чтобы прибавить к регистру, например, ax число 0AFFh поступают так: add ax, 0AFFh. Чтобы прибавить к этому же регистру другой регистр (например "bx"), то делают так: mov ax, bx. Все просто!
Другая продвинутая техника садизма называется вычитанием (команда sub). Действует она точно также как и сложение. Пример: sub ax, 08h.
Вот здесь я и закончу свои повествования о том, что есть регистры. Очевидно что я не сказал еще многого о них, но не все сразу - остальное вы узнаете по мере необходимости. Для любопытных - на моем сайте (http://www.evolverstation.narod.ru) выложены справочники по командам Асма. Так что смотрите и разбирайтесь.