Содержащиеся в параметре num байты преобразуются в строку шестнадцатиричных цифр длины (byteCount * 2). Поскольку каждый байт порождает два символа, максимальное значение byteCount равно 127 (не проверяется). Для преобразования каждой группы (по 4 би- та) в шестнадцатиричную цифру мы для скорости используем последо- вательность add-daa-adc-daa.
Процедура HexStr (ее можно найти в файле HEX.ASM) написана так, что вызываться она должна с помощью вызова дальнего типа. Это означает, что ее следует описывать в интерфейсной части моду- ля Турбо Паскаля или с помощью директивы компилятора {$F+}.
CODE SEGMENT ASSUME cs:CODE,ds:NOTHING
; Параметры (+2 с учетом push bp)
byteCount equ byte ptr ss:[bp+6] num equ dword ptr ss:[bp+8]
; Адресация к результату функции (+2 с учетом push bp)
resultPtr equ dword ptr ss:[bp+12]
HexStr PROC FAR PUBLIC HexStr
push bp mov bp,sp ; получить указатель ; стека 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 ; получить следующий ; байт 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 pop bp ret 6 ; параметры занимают ; 6 байт HexStr ENDP CODE ENDS END
Пример программы на Паскале, где используется функция HexStr, имеет следующий вид: