adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
with OldEmployee do
begin
Name := 'John Smith';
Address := ' 123 F Street';
City := 'Scotts Valley';
State := 'CA';
Zip := ' 90000-0000';
end;
with NewEmployee do
begin
Name := 'Mary Jones';
Address := ' 9471 41st Avenue';
City := 'New York';
State := 'NY';
Zip := ' 10000-1111';
end;
Writeln('Before: ',OldEmployee.Name,' ',NewEmployee.Name);
Exchange(OldEmployee,NewEmployee,sizeof(OldEmployee));
Writeln('After: ',OldEmployeeName,' ',NewEmployee.Name);
Exchange(OldEmployee,NewEmployee,sizeof(OldEmployee));
Writeln('After: ',OldEmployeeName,' ',NewEmployee.Name);
end.
Чтобы сформировать и запустить данные программы на Паскале и
Ассемблере, используйте следующие команды командного файла:
TASM XCHANGE
TPC XCHANGE
XCHANGE
Если использовать директиву .MODEL, то программа Exchange на
Ассемблере будет выглядеть следующим образом:
.MODEL large, PASCAL
.CODE
Exchange PROC FAR var1:DWORD,var2:DWORD,count:WORD
PUBLIC Exchange
cld ; обмен в прямом направлении
mov dx,ds ; сохранить DS
Турбо Ассемблер 3.0/tasm/#2-2 = 141 =
push bp
mov bp,sp ; получить базу стека
lds si,var1 ; получить первый адрес
les di,var2 ; получить второй адрес
mov cx,count ; получить число перемещаемых
; байт
shr cx,1 ; получить счетчик слов
; (младший бит -> перенос)
jnc ExchangeWord ; если не нечетный байт,
; войти в цикл
mov al,es:[di] ; считать нечетный байт
; из var2
movsb ; переместить байт из var1
; в var2
mov [si-1],al ; записать var2 в var1
jz Finis ; выполнено, если нужно
; выполнить обмен только
; одного байта
ExchangeWords:
mov bx,-2 ; BX - это удобное место
; для хранения -2
ExchangeLoop:
mov ax,es:[di] ; считать слово из var2
movsw ; переместить из var1
; в var2
mov [bx][si,ax ; записать слово var2 в
; var1
loop ExchangeLoop ; повторить count/2 раз
Finis:
mov ds,dx ; получить обратно DS
; Турбо Паскаля
ret
Exchage ENDP
CODE ENDS
END
Вы можете использовать ту же программу на Паскале и просто
ассемблировать альтернативный вариант процедуры Exchаnge и пере-
компилировать программу с помощью того же командного файла.
Пример анализа операционной среды DOS
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
С помощью функции EnvString вы сможете просмотреть операци-
онную среду DOS и найти строку вида "s=НЕЧТО" и возвратить НЕЧТО,
если это найдено.
DATA SEGMENT PUBLIC
EXTRN prefixSeg : Word ; дает адрес PSP
DATA ENDS
SEGMENT PUBLIC
ASSUME cs:CODE,ds:DATA
Турбо Ассемблер 3.0/tasm/#2-2 = 142 =
EnvString PROC FAR
PUBLIC EnvString
push bp
cld ; работать в прямом
; направлении
mov es,[prefixSeg] ; посмотреть PSP
mov es,es:[2Ch] ; ES:DI указывают на
; операционную среду,
xor di,di ; которая выровнена на
; границу параграфа
mov bp,sp ; найти строку параметров,
lds si,ss:[bp+6] ; которая следует за
; адресом возврата
ASSUME ds:NOTHING
lodsb ; посмотреть длину
or al,al ; она равна 0?
jz RetNul ; да, возврат
mov ah,al ; в противном случае
; сохранить ее в AH
mov dx,si ; DS:SI содержат указатель
; на первый параметр
; char
xor al,al ; сделать его равным 0
Compare:
mov ch,al ; мы хотим, чтобы для
; следующего отсчета ch=0
mov si,dx ; возвратить указатель на
; просмотренную строку
mov cl,ah ; получить длину
mov si,dx ; возвратить указатель на
; строку
repe cmpsb ; сравнить байты
jne Skip ; если сравнение неудач-
; ное попробовать следу-
; ющую строку
cmp byte ptr es:[di],'=' ; сравнение
; завершилось успешно
; следующий символ '='?
jne NoEqual ; если нет, все еще нет
; совпадения
Found:
mov ax,es ; DI:SI будет указывать
; на найденную нами строку
mov ds,ax
mov si,di
inc si ; "пройти" символ '='
les bx,ss:[bp+10] ; получить адрес
; результата
; функции
mov di,bx ; занести его в ES:DI
inc di ; байт длины
mov cl,255 ; задать максимальную
; длину
Турбо Ассемблер 3.0/tasm/#2-2 = 143 =
CopyLoop:
lodsb ; получить байт
or al,al ; проверить на 0
jz Done ; если 0, выполнено
stosb ; занести его в результат
loop CopyLoop ; переместить до 255
; байт
Done: not cl ; при сохранении мы
; уменьшали от CL до 255
mov es:[bx],cl ; сохранить длину
mov ax,SEG DATE
mov ds,ax ; восстановить DS
ASSUME ds:DATA
pop bp
ret 4
ASSUME ds:NOTHING
Skip:
dec di ; проверить на 0
NoEqual:
mov cx,7FFFh ; длинный поиск, если
; нужно
sub cx,di ; операционная среда
; никогда не превышает
; 32К
jbe RetNul ; если конец, выйти
repne scasb ; посмотреть следующий
; 0
jcxz RetNul ; выйти, если не найден
cmp byte ptr es:[di],al ; второй 0 в строке?
jne Compare ; если нет, попытаться
; снова
RetNul:
les di,ss:[bp+10] ; получить адрес
; результата
stosb ; сохранить там 0
mov ax,SEG DATA
mov ds,ax ; восстановить DS
ASSUME ds:DATA
pop bp
ret 4
EnvString ENDP
CODE ENDS
END
Программа на Паскале, которая использует функцию EnvString,
выглядит следующим образом:
|
adfun.ru
|
|
|
|