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

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


Таненбаум Э.- Архитектура компьютера. стр.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


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

.