Статус нашего сайта: |
ICQ Information Center |
ICQ SHOP 5-значные 6-значные 7-значные 8-значные 9-значные Rippers List ОПЛАТА СТАТЬИ СЕКРЕТЫ HELP CENTER OWNED LIST РОЗЫСК!New! ICQ РЕЛИЗЫ Протоколы ICQ LOL ;-) Настройка компьютера Аватарки Смайлики СОФТ Mail Checkers Bruteforces ICQTeam Soft 8thWonder Soft Other Progs ICQ Patches Miranda ICQ ФорумАрхив! ВАШ АККАУНТ ICQ LiveJournal
РекламаНаш канал:irc.icqinfo.ru |
Таненбаум Э.- Архитектура компьютера. стр.570а б Рис. В.5. Содержимое окна трассера при выполнении программы из листинга В.1 Листинг В.1. Ассемблерный код программы HlloWrld.s В строках 5, 18 и 20 содержатся метки, обозначенные двоеточием (:). Они представляют численные значения, схожие с константами. В данном случае ассемблеру приходится определять эти численные значения. Поскольку метка start находится в начале секции текста, соответствующее значение принимается за 0, но значения в последующих метках секции текста (в этом примере они не показаны) обуславливаются количеством предшествующих байтов кода. Теперь рассмотрим строку 6. Она заканчивается разностью двух меток — численной константой. Таким образом, строку 6 можно приравнять к следующему выражению: MOV СХД2 Разница между ними заключается лишь в том, что в одном случае длину строки определяет ассемблер, а в другом — программист. Указанное здесь значение выражает объем пространства в секции данных, зарезервированное для размещения строки, расположенной в строке 19. Команда M0V в строке 6 представляет собой команду копирования de -hw в регистр СХ. Содержание строк 7-11 демонстрирует механизм формирования системных вызовов в применяемом наборе инструментов. Фактически, эти строки представляют собой переведенный на языке ассемблера вызов функции из языка С: writeü. hw, 12); Здесь первый параметр представляет собой дескриптор файла стандартного вывода (1), второй выражает адрес отображаемой строки (hw), а третий — длину строки (12). В строках 7-9 эти параметры помещаются в стек в обратном порядке, что соответствует последовательности вызова, принятой в С и применяемой данной программой трассировки. В строке 10 в стек вводится номер системного вызова для функции write (4), а в строке 11 выполняется сам вызов. Такой порядок по большей части соответствует механизму выполнения программы на языке ассемблера в клонах UNIX (или Linux), однако при работе в другой операционной системе его необходимо скорректировать в расчете на конкретные правила выполнения системных вызовов. Впрочем, даже при работе в среде Windows ассемблер as88 и трассер t88 реализуют правила вызовов, принятые в UNIX. Системный вызов в строке 11 ответственен за вывод данных. Код в строке 12 выполняет очистку стека, возвращая указатель стека к значению, которое у него было до размещения в стеке четырех 2-байтных слов. Если вызов write проводится успешно, число записанных байтов возвращается в регистре АХ. В строке 13 результат системного вызова после строки 11 вычитается из исходной длины строки, записанной в СХ; тем самым производится проверка успешности вызова, то есть фактической записи всех байтов. Таким образом, код завершения должен быть равен нулю при успешном вызове и, соответственно, не равен нулю в противном случае. В строках 14 и 15 подготавливается системный вызов exit, осуществляемый в строке 16; для этого коды завершения и функции, относящиеся к вызову EXIT, отправляются в стек. Имейте в виду, что в командах M0V и SUB первый аргумент указывает на приемник, а второй — на источник. Такова особенность нашего ассемблера; в других ассемблерах порядок может быть иным. Выбор разработчиками того или иного варианта, по большому счету, произволен. |