Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.577ADD SI,2 После исправления выводимый список чисел не вызывает нареканий. Тем не менее нас поджидает еще одна ошибка. После завершения вызова vecprint и возврата значения трассер отмечает ошибку в указателе стека. Очевидное решение — проверить, совпадает ли значение, вводимое в стек при вызове vecprint, со значением, находящимся на вершине стека при выполнении ко манды RET в строке 41. Как выясняется, они не совпадают. Таким образом, строку 40 следует заменить двумя новыми строками: ADD SP,10 POP BP Первая команда удаляет 5 слов, помещенных в стек в ходе вызова vecprint; таким образом открывается доступ к значению ВР, сохраненному в строке 22. Путем выталкивания этого значения из стека мы восстанавливаем значение регистра ВР, имевшее место перед вызовом, и получаем правильный адрес возврата. Теперь программа завершается корректно. Не секрет, что отладка кода на языке ассемблера — скорее искусство, чем наука, однако не стоит пренебрегать помощью трассера, который значительно упрощает процесс. Обработка символьных строк и строковые команды Основное назначение этого подраздела — показать механизм обработки повторяющихся строковых команд. В листингах В.5 и В.6 представлены простые программы для обработки символьных строк, strngcpy.s и reverspr.s, расположенные в папке examples. Листинг В.5. Копирование строки (strngcpy.s) .SECT .DATA ! 32 mesgl: .ASCIZ "Have a look\n" ! 33 mesg2: .ASCIZ "qrstNn" ! 34 .SECT .BSS Листинг В.6- Вывод символьных строк задом наперед (reverspr.s) #iinclude ". ./syscalnr.h" ! 1 start: MOV Dl.str ! 2 PUSH AX ! 3 MOV BP.SP ! 4 PUSH _PUTCHAR ! 5 MOVB AL,'\n' ! 6 MOV CX.-1 ! 7 REPNZ SCASB ! 8 NEG CX ! 9 STD ! 10 DEC CX ! 11 SUB DI.2 ! 12 MOV SI.DI ! 13 1: LODSB ! 14 MOV (BP).AX ! 15 SYS ! 16 LOOP lb ! 17 MOVB (BP),'\n' ! 18 SYS ! 19 PUSH 0 ! 20 PUSH JXIT ! 21 SYS ! 22 .SECT .DATA ! 23 str: .ASCIZ "reverse\n" ! 24 В листинге В.5 представлена программа копирования строки. Она вызывает подпрограмму 5"Ьппдрг, которую также можно найти в отдельном файле БЫпдрг.Б (листинга с этим файлом в нашем приложении нет). Чтобы ассемблировать программу, содержащую подпрограммы в отдельных файлах, в команде а$88 все исходные файлы следует указать, начиная с основной программы, которая определяет имена исполняемого и вспомогательных файлов. К примеру, чтобы ассемблировать программу, представленную в листинге В.5, нужно ввести команду аБ88 Б^пдсру.Б Б^пдрг.Б Программа из листинга В.6 выводит символьные строки с обратным порядком следования символов. Мы рассмотрим обе программы по очереди. В листинге В.5 строки кода пронумерованы, начиная с первой метки. Основная программа (строки 2-8) начинается с вызова подпрограммы Б^пдсру с двумя аргументами: исходной строкой те$д2 и целевой строкой те$д1; подпрограмма копирует содержимое первой во вторую. Теперь рассмотрим непосредственно подпрограмму Б^пдсру, которая начинается в строке 9 кода. Она рассчитана на то, что адреса целевого буфера и исходной строки вводятся в стек непосредственно перед ее вызовом. В строках 10-13 задействованные регистры сохраняются путем передачи их значений в стек; впоследствии, в строках 27-30, их предполагается восстановить. В строке 14 значения БР и ВР копируются стандартным методом. После этого в ВР можно загружать аргументы. В строке 26 стек очищается уже знакомым нам способом — значение ВР копируется в БР. |