Это действительно не так просто ответить, как может показаться на первый взгляд. Проблема довольно проста: такая функция, как substr
, на самом деле не существует изолированно - она является частью строковой библиотеки, и чтобы сделать ее полезной, вам нужно как минимум набросать, как в целом подходит библиотека вместе, как вы представляете свои данные и т. д. Т.е., substr
создает строку, но для этого вам необходимо решить, что такое строка .
Чтобы избежать этой проблемы, я собираюсь игнорировать то, что вы на самом деле спросили, и дать несколько более простой ответ, который больше подходит для языка ассемблера. Что вам действительно нужно, так это начать с одного буфера данных, найти пару «маркеров» в этом буфере и скопировать то, что находится между этими маркерами, в назначенную позицию в другом буфере. Для начала нам нужен код для поиска "find_last":
; expects:
; ESI = address of buffer
; ECX = length of data in buffer
; AH = character to find
; returns:
; ESI = position of item
;
find_last proc
mov al, [esi+ecx]
cmp ah, al
loopnz find_last
ret
find_last endp
Теперь, чтобы скопировать подстроку в буфер передачи, мы делаем что-то вроде этого:
CR = 13
copy_substr proc
mov esi, offset read_buffer
mov ecx, bytes_read
mov ah, CR
call find_last ; find the carriage-return
mov edx, esi ; save its position
mov esi, offset read_buffer
mov ecx, bytes_read
mov ah, ':'
call find_last ; find the colon
inc esi ; point to character following colon
sub edx, esi ; get distance from colon+1 to CR
mov ecx, edx
; Now: ESI = address following ':'
; ECX = distance to CR
mov edi, (offset trans_buffer) + prefix_length
rep movsb ; copy the data
ret
copy_substr endp