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

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


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

Механизм работы таких программ демонстрирует подпрограмма erout (строки 43-48 кода). Она обрабатывает числа, выходящие за пределы допустимого диапазона. Во-первых, в строке 43 в стек помещается адрес сообщения (в АХ). Затем в стек отправляется число системного вызова _PRINTF. Далее выполняется системный вызов, стек очищается, и программа выполняет возврат. Остальные десять подпрограмм — от routO до rout8 — загружают адреса своих сообщений

в регистр АХ, а затем переходят ко второй строке erout, выводят сообщения и завершают подпрограмму.

Один из способов адаптировать программу к таблицам диспетчеризации — изменить ее таким образом, чтобы из вводимых символов формировалось осмысленное сообщение. К примеру, все символы, кроме восьмеричных цифр, могут составить сообщение об ошибке.

Буферизованный и произвольный доступ к файлам

Программа InFilBuf.s, представленная в листинге В.8, являет собой пример произвольного файлового ввода-вывода. Она допускает, что файл состоит из произвольного числа символьных строк, каждая из которых потенциально может отличаться по длине от других. Сначала эта программа считывает файл и формирует таблицу, в которой запись п отражает положение начала строки п в файле. Впоследствии можно запросить конкретную символьную строку, отыскать запись для нее в таблице и считать с помощью системных вызовов 1 seek и read. Имя файла при стандартном вводе указывается в первой вводимой строке. Программа состоит из нескольких относительно независимых кодовых фрагментов, которые можно адаптировать для иных целей.

Листинг В.8. Программа, реализующая буферизованный и произвольный доступ к файлу

#include "../syscalnr.h"

! 1

bufsiz = 512

! 2

.SECT .TEXT

! 3

infbufst:

! 4

MOV BP.SP

! 5

MOV Dl.linein

! 6

PUSH GETCHAR

! 7

1: SYS

! 8

CMPB AL,*\n*

! 9

JL 9f

! 10

JE If

! 11

STOSB

! 12

JMP lb

! 13

1: PUSH 0

! 14

PUSH linein

! 15

PUSH OPEN

! 16

SYS

! 17

CMP AX.O

! 18

JL 9f

! 19

MOV (fiIdes),AX

! 20

MOV SI.linh+2

! 21

MOV BX.O

! 22

1: CALL fillbuf

! 23

CMP CX.O

! 24

JLE 3f

! 25

2: MOVB AL,'\гГ

! 26

REPNE SCASB

! 27

JNE lb

! 28

INC (count)

! 29

MOV AX.BX

! 30

SUB AX.CX

! 31

XCHG SI.DI

! 32

STOS

! 33

XCHG SI.DI

! 34

CMP CX.O

! 35

JNE 2b

! 36

JMP lb

! 37

9: MOV SP.BP

! 38

PUSH linein

! 39

PUSH errmess

! 40

PUSH PRINTF

! 41

SYS

! 42

PUSH EXIT

! 43

PUSH EXIT

! 44

SYS

! 45

3: CALL getnum

! 46

CMP AX.O

! 47

JLE 8f

! 48

MOV BX.(curlin)

! 49

CMP BX.O

! 50

JLE 7f

! 51

CMP BX,(count)

! 52

JG 7f

! 53

SHL BX.l

! 54

MOV AX.linh-2(BX)

! 55

MOV CX.linh(BX)

! 56

PUSH 0

! 57

PUSH 0

! 58

PUSH AX

! 59

PUSH (fildes)

! 60

PUSH LSEEK

! 61

SYS

! 62

SUB CX.AX

! 63

PUSH CX

! 64

PUSH buf

! 65

PUSH (fildes)

! 66

PUSH READ

! 67

SYS

! 68

ADD SP.4

! 69

PUSH 1

! 70

PUSH WRITE

! 71

SYS

! 72

ADD SP.14

! 73

JMP 3b

! 74

8: PUSH scanerr

! 75

PUSH PRINTF

! 76

SYS

! 77

ADD SP.4

! 78

JMP 3b

! 79

7: PUSH 0

! 80

PUSH EXIT

! 81

SYS

! 82

fillbuf:

! 83

PUSH bufsiz

! 84

PUSH buf

! 85

PUSH (fildes)

! 86

PUSH READ

! 87

SYS

! 88

ADD SP.8

! 89

MOV CX.AX

! 90

ADD BX.CX

! 91

MOV Dl.buf

! 92

RET

! 93

getnum:

! 94

MOV Dl.linein

! 95

PUSH GETCHAR

! 96

1: SYS

! 97

CMPB AL,'\n'

! 98

JL 9b

! 99

JE If

! 100

STOSB

! 101

JMP lb

! 102

1: MOVB (DI).1 '

! 103

PUSH curl in

! 104

PUSH numfmt

! 105

PUSH linein

! 106

PUSH SSCANF

! 107

SYS

! 108

ADD SP.10

! 109

RET

! 110

.SECT .DATA

! Ill

errmess:

! 112

.ASCIZ "Open %s failed\n"

! 113

numfmt: .ASCIZ

! 114

scanerr:

! 115

.ASCIZ "Type a number.\n"

! 116

.ALIGN2

! 117

.SECT .BSS

! 118

linein: .SPACE 80

! 119

fildes: .SPACE2

! 120

linh: .SPACE 8192

! 121

curl in: .SPACE4

! 122

buf: .SPACE bufsiz+2

! 123

count: .SPACE2

! 124

В первых пяти строках кода определяются номера системных вызовов и размер буфера, а указатель базы, как обычно, настраивается на вершину стека. В строках 6-13 из стандартного ввода считывается имя файла, а затем оно сохраняется в символьной строке с меткой linein. Если имя файла не закрыто новой строкой, выводится сообщение об ошибке, а процесс заканчивается с ненулевым состоянием. Все эти действия отражены в строках 38-45. Обратите внимание, что адрес имени файла помещается в стек в строке 39, адрес сообщения об ошибке—в строке 40. Само сообщение об ошибке (представленное в строке ИЗ) представляет собой запрос на строку $s в формате PRINTF. Здесь же выполняется вставка содержимого строки linein.


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

.