Консультация № 159543
03.02.2009, 22:16
0.00 руб.
0 2 1
Доброго времени суток, уважаемые эксперты! Помогите решить задачу: "составить пограмму производящую копирование строки из 15 символов в стоящую рядом область памяти". В апреле 2008 эта тема поднималась в рассылке, пример решения ниже, но я так и не понял как описать эту самую "рядом стоящую область памяти"?

Приложение:
Data SEGMENT ;Открыть сегмент данных
strin DB 'KalininllinKamil$',0
Data ENDS ;Закрыть сегмент данных

Ourstack SEGMENT Stack ;Открыть сегмент стека
DB 100h DUP (?) ;Отвести под стек 256 байт
Ourstack ENDS ;Закрыть сегмент стека
ASSUME CS:Code, DS:Data, SS:Ourstack ;Назначить сегментные регистры
Code SEGMENT ;Открыть сегмент кодов
Start: mov AX, Data ;Инициализировать
mov DS, AX ;сегментный регистр DS
mov DI, 16 ;сохраняем в DI счётчик
mov strin[DI+16], 0
Next: dec DI ;переход к след. элементу
xor BX, BX ;очищаем BX
mov BH, strin[DI] ;сдвигаем символы на BH
mov strin[DI+15], BH
jnz Pass ;
Pass: or DI, DI ;если счетчик не обнулился,
jnz Next ; то переходим к следующему
mov AH, 09h
mov DX, OFFSET strin
int 21h
mov AL, 0
mov AH, 4Ch ;Завершить программу
int 21h ;с помощью DOS
Code ENDS ;Закрыть сегмент кодов
END Start ;Конец исходного модуля.

Обсуждение

давно
Старший Модератор
31795
6196
03.02.2009, 23:26
общий
Если у Вас строка из 15-ти символов, то область куда будете копировать должна иметь этот размер.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
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 ;Конец исходного модуля.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа