04.02.2009, 00:57
общий
это ответ
Здравствуйте, Гранков Николай Александрович!
Вариантов реализации масса!
Мне лично нравится писать так, как в приложении.
Как бонус даю еще один вариант, который закомментирован. Можете выбрать любой, какой нравится.
Описывать "рядом стоящую область памяти" просто:
надо буквально выделить буфер следом за исходной строкой...
Обратите внимание, хоть строка имеет длину 15 байт, надо учитывать еще один байт - завершающий $,
Т.о. имеем фактическую длину 16 байт.
Приложение:
Data SEGMENT ;Открыть сегмент данных
strin DB 'KalininllinKami$' ;исходная строка длины 15 байт + $
strout db 16 dup (0) ;сюда будем писать
Data ENDS ;Закрыть сегмент данных
Ourstack SEGMENT Stack ;Открыть сегмент стека
DB 100h DUP (?) ;Отвести под стек 256 байт
Ourstack ENDS ;Закрыть сегмент стека
ASSUME CS:Code, DS:Data, ES:Data, SS:Ourstack ;Назначить сегментные регистры
Code SEGMENT ;Открыть сегмент кодов
Start: mov AX, Data ;Инициализировать
mov DS, AX ;сегментный регистр DS
mov ES, AX ;сегментный регистр ES
lea si, strin ;адрес (DS:SI) откуда брать
lea di, strout ;адрес (ES:DI) куда писать
mov cx, 16 ;длина строки + завершающий $
rep movsb ;копируем cx байт ds:si -> es:di
; mov cx, 16 ;длина строки
; xor si, si ;индекс
;CLoop: ;цикл
; mov al, strin[si] ;читаем байт
; mov strin[si+16],al ;пишем со смещением 16, как раз в strout
; inc si ;индекс следующего байта
; loop CLoop ;cx=cx-1, если не 0, то повторяем
mov AH, 09h
mov DX, OFFSET strout
int 21h
mov ax, 4C00h ;Завершить программу
int 21h ;с помощью DOS
Code ENDS ;Закрыть сегмент кодов
END Start ;Конец исходного модуля.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен