Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.575Подпрограмму vecmul можно включать в другие программы. Если имя исходного файла vecprod.s поместить в командой строке перед именем другого исходного файла на языке ассемблера, последний сможет обращаться к подпрограмме умножения двух векторов фиксированной длины. Во избежание дублирования предварительно рекомендуется исключить определения констант EXIT и PRINTF. Если заголовочный файл syscalnr.h подсоединен, писать определения констант системных вызовов в других местах нет необходимости. Отладка программы вывода массива Рассмотренные в предыдущих примерах программы просты и не содержат ошибок. В данном примере мы покажем, как трассер может помочь в отладке программ с ошибками. Наша следующая программа предназначена для вывода целочисленного массива, определенного после метки vecl. В ее первоначальной версии есть 3 ошибки. Для их выявления мы привлечем ассемблер и трассер, но сначала обсудим код. Так как системные вызовы, а значит, и константы, с помощью которых эти вызовы можно различать по номерам, нужны любой программе, мы выделили определения констант с этими номерами в отдельный заголовочный файл, который включается в код в первой строке: #include "../syscalnr.h" Помимо прочего, в этом файле определены константы для следующих дескрипторов файлов: STDIN = О STD0UT = 1 STDERR = 2 Они открываются в начале процесса, а в заголовке содержатся метки, указывающие на секции текста и данных. Этот файл имеет смысл включать в заголовок всех исходных ассемблерных файлов, поскольку имеющиеся в нем определения весьма востребованы. Если исходный код рассредоточен по нескольким файлам, ассемблер включает в него только одну версию заголовочного файла, за счет чего ситуации многократного определения констант удается избежать. Программа arrayprt приведена в листинге В.4. Код не прокомментирован, так как мы предполагаем, что к настоящему моменту читатель уже в достаточной степени знаком с набором команд. В строке 4 адрес пустого стека помещается в регистр указателя базы — так предусматривается возможность очистки стека путем копирования указателя базы в указатель стека, что и выполняется в строке 10. В предыдущем примере (в строках 5-9) мы уже рассматривали ситуацию вычисления и введения в стек аргументов перед вызовом. В строках 22-25 регистры загружаются в подпрограмму. Листинг В,4- Программа arrayprt перед отладкой finclude "../syscalnr.h" ! 1 .SECT .TEXT ! 2 vecpstrt: ! 3 MOV BP.SP ! 4 PUSH vecl ! 5 MOV CX,frmatstr-vecl ! 6 SHR CX ! 7 PUSH CX ! 8 CALL vecprint ! 9 MOV SP.BP ! 10 PUSHO ! 11 PUSH _EXIT ! 12 SYS ! 13 .SECT .DATA ! 14 vecl: .WORD 3,4.7,11,3 ! 15 frmatstr: .ASCIZ "%s" ! 16 frmatkop: ! 17 .ASCIZ "The array contains " ! 18 frmatint: .ASCIZ " %6" ! 19 .SECT .TEXT ! 20 vecprint: ! 21 PUSH BP ! 22 MOV BP.SP ! 23 MOV CX,4(BP) ! 24 MOV BX,6(BP) ! 25 MOV SI.O ! 26 PUSH frmatkop ! 27 PUSH frmatstr ! 28 PUSH _PRINTF ! 29 |