Руководство по языку B.Pascal 7

         

Примеры программ на языке ассемблера


Следующая программа является примером модуля и представляет собой две программы на ассемблере, предназначенные для обработки строк. Функция UppеrCаsе преобразует символы строки в прописные буквы, а функция StringOf возвращает строку символов заданной длины.

unit Strings; interface function UpperCase(S: string): string; function StringOf(Ch: char; Count: byte): string; inplementation {$L STRS} function UpperCase; external; function StringOf; external; end.

Далее приведен файл на языке ассемблера, в котором реализо- ваны программы StringOf и UppеrCаsе. Перед компиляцией модуля Strings этот файл должен быть ассемблирован в файл с именем STRS.OBJ. Обратите внимание на то, что в программах используется дальний тип вызова, так как они описаны в интерфейсной секции блока.

CODE SEGMENT BYTE PUBLIC ASSUME CS:CODE PUBLIC UpperCase, StringOf ; объявить имена function Uppercase(S: String): String UpperRes EQU DWORD PTR [BP+10] UpperStr EQU DWORD PTR [BP+6] Uppercase PROC FAR PUSH BP ; сохранить регистр BP MOV BP,SP ; установить стек PUSH DS ; сохранить регистр DS LDS SI,UpperStr ; загрузить адрес строки LES DI,UpperRes ; загрузить адрес результата CLD ; переместить строку LODSB ; загрузить длину строки STOSB ; скопировать результат MOV CL,AL ; поместить длину строки в СХ XOR CH,CH JCXZ U3 ; пропустить в случае пустой ; строки U1: LODSB ; пропустить, если символ отличен ; от 'а'...'z' CPM AL,'a' JB U2 CPM AL,'z' JA U2 ; переместить строку SUB AL,'a'-'A' ; преобразовать в прописные буквы U2: STOBS ; сохранить результат

LOOP U1 ; цикл по всем символам U3: POP DS ; восстановить регистр DS POP BP ; восстановить регистр ВР RET 4 ; удалить параметры и возвратить ; управление UpperCase ENDP ; function StringOf(Ch: Char; Count: Byte): String StrOfRes EQU DWORD PTR [BP + 10] StrOfChar EQU BYTE PTR [BP + 8] StrOfCOunt EQU BYTE PTR [BP + 6] StringOf PROC FAR PUSH BP ; сохранить регистр ВР MOV BP,SP ; установить границы стека LES DI,StrOfRes ; загрузить адрес результата MOV AL,StrOfCount ; загрузить счетчик CLD ; продвинуться на строку STOSB ; сохранить длину MOV CL,AL ; поместить значение счетчика в CX XOR CH,CH MOV AL,StrOfChar ; загрузить символ REP STOSB ; сохранить строку символов POP ; восстановить ВР RET ; извлечь параметры и выйти SrtingOf ENDP CODE ENDS END

Чтобы ассемблировать этот пример и скомпилировать модуль, можно использовать следующие команды:

TASM STR5 BPC stringer



Содержание раздела