adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
; будет выполнено
mov ds,dx
pop bp
ret 6 ; параметры занимают
; 6 байт
HexStr ENDP
CODE ENDS
END
Пример программы на Паскале, где используется функция
HexStr, имеет следующий вид:
Program HexTest;
var
num : word;
Турбо Ассемблер 3.0/tasm/#2-2 = 137 =
{$F+}
function HexStr(var num; byteCount : byte) : string;
external;
{$L HEXSTR.OBJ}
{$F-}
begin
num := word;
Writeln('Преобразованная строка имеет шестнадцатиричное
представление: ', HexStr(num,Sizeof(num)),'*');
end.
Для построения и запуска примеров программы на Паскале и
программы Ассемблера используйте следующие команды командного
файла:
TASM HEXSTR
TPC HEXTEST
HEXTEST
Если вы используете директиву .MODEL, то программу HexStr
можно записать следующим образом (файл HEXMOD.ASM):
.MODEL large, PASCAL
.CODE
HexStr PROC FAR num:DWORD,byteCount:BYTE RETURNS resultPtr:DWORD
PUBLIC HexStr
les di,resultPtr ; получить адрес
; результата функции
mov dx,ds ; сохранить DS Турбо
; Паскаля в DX
lds si,sum ; получить адрес числа
mov al,byteCount ; сколько байт?
xor ah,ah ; слово
mov cx,ax ; отслеживать число
; байт в CX
add si,ax ; начать со старшего
; байта числа
dec si
shl ax,1 ; сколько цифр?
; (2/байт)
cld ; сохранить число цифр
; (работать в прямом
; направлении)
stosb ; в приемнике - байт
; длины строки
NextLoop:
std ; сканировать число от
; старшего байта к
; младшему
lodsb ; получить следующий
Турбо Ассемблер 3.0/tasm/#2-2 = 138 =
; байт
mov ah,al ; сохранить его
shr al,1 ; выделить старшую
; группу бит
shr al,1
shr al,1
shr al,1
add al,90h ; специальная после-
; довательность шестнад-
; тиричного преобразования
daa ; использование инструкций
; ADD и DAA
adc al,40h
daa ; группа преобразована
; в код ASCII
cld ; сохраним ASCII и следуем
; далее
stosb
mov al,ah ; повторить преобразование
; для младшей группы
and al,0Fh
add al,90h
daa
adc al,40h
daa
stosb
loop HexLoop ; продолжать, пока не
; будет выполнено
mov ds,dx ; восстановить DS
; Турбо Паскаля
ret
HexStr ENDP
CODE ENDS
END
При этом вы можете использовать ту же программу на Паскале и
просто ассемблировать альтернативный вариант HexStr и перекомпи-
лировать программу с помощью того же командного файла.
Пример обмена содержимого двух переменных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
С помощью данной процедуры (VAREXCH.ASM) вы можете выполнить
обмен содержимого двух переменных размера count. Если count имеет
значение 0, то то процессор попытается перекопировать 64К.
CODE SEGMENT
ASSUME cs:CODE,ds:NOTHING
; Параметры (заметим, что из-за push bp смещение
; увеличивается на 2)
var1 equ DWORD PTR ss:[bp+12]
Турбо Ассемблер 3.0/tasm/#2-2 = 139 =
var2 equ DWORD PTR ss:[bp+8]
count equ WORD PTR ss:[bp+6]
Exchange PROC FAR
PUBLIC Exchange
cld ; обмен в прямом направлении
mov dx,ds ; сохранить регистр DS
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
; Турбо Паскаля
pop bp
ret 10
Exchange ENDP
CODE ENDS
END
Программа Турбо Паскаля, которая использует функцию Exchange
(файл varexch.pas), имеет вид:
program TextExchange;
type
EmployeeRecord = record
Name : string[30];
Address : string[30];
Турбо Ассемблер 3.0/tasm/#2-2 = 140 =
City : string[15];
State : string[2];
Zip : string[10];
end;
var
OldEmployee, NewEmployee : EmployeeRecord;
{$F+}
procedure Exchange(var var1,var2; count : word); external;
{$L XCHANGE.OBJ}
{$F-}
begin
|
adfun.ru
|
|
|
|