Статус
нашего
сайта:
ICQ Secrets Center is Online  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

Таненбаум Э.- Архитектура компьютера. стр.577


Таненбаум Э.- Архитектура компьютера. стр.577

ADD 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 стек очищается уже знакомым нам способом — значение ВР копируется в БР.


⇐ Предыдущая страница| |Следующая страница ⇒

.