Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2011, 22:50   #1
YTP0
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 21
По умолчанию 2 сегмента данных

Прошу помочь мне хотя бы начать я многое не понимаю.. Мне надо создать прогу с 2мя сегментами данных, и переслать строку данных из одного в другой, а затем её вывести через видеобуфер. Я знаю что надо создать прогу с моделью памяти типа MEDIUM. Настроить DS и ES на 2 сегмента данных(незнаю как это делать). Сама пересылка строки делается командой MOVSB. Я знаю алгоритм, но незнаю как это написать. прошу помогите хотя бы начать. Заранее спасибо.
YTP0 вне форума Ответить с цитированием
Старый 17.11.2011, 12:09   #2
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от YTP0 Посмотреть сообщение
прошу помогите хотя бы начать.
Начинаем:

Код:
Data_01 segment
	
s_1	db 'this is the test', '$'
Len	equ $ - s_1

Data_01 ends

Data_02 segment
	
s_2	db 128 dup('$')

Data_02 ends

Code segment

start proc
	assume cs:code

	mov ax, data_01 ; настраиваем DS на первый сегмент данных
	mov ds, ax
	assume ds:data_01

	mov ax, data_02 ; , а ES - на второй ...
	mov es, ax
	assume es:data_02
	
	lea si, s_1
	lea di, s_2
	mov cx, Len
	cld
	rep movsb ; строка перенесена из Data_01 в Data_02

	; Здесь будет вывод скопированной строки ...
	
	mov ax, 4c00h
	int 21h
start endp

Code ends
	end start

Последний раз редактировалось Karpinsky; 17.11.2011 в 12:14.
Karpinsky вне форума Ответить с цитированием
Старый 17.11.2011, 14:55   #3
YTP0
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 21
По умолчанию

ого, большое спасибо, сейчас попробую доделать!
YTP0 вне форума Ответить с цитированием
Старый 17.11.2011, 15:17   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

YTP0
только model не medium (несколько кодовых сегментов и один сегмент данных), а compact (несколько сегментов данных и один сегмент кода)
еще так можно
Код:
; masm dos exe #
.286
.model compact
.code
start:	mov ax,@data
	mov ds,ax
	mov ax,@fardata
	mov es,ax
	mov si,offset x
	mov di,offset y
;       cld не обязательно, так как при старте программы DF=0
	mov cx,128
	rep movsw
	mov ah,4Ch
	int 21h
.data
x db 256 dup(1)
.fardata
y db 256 dup(0)
end start

Последний раз редактировалось Mikl___; 17.11.2011 в 15:43.
Mikl___ вне форума Ответить с цитированием
Старый 17.11.2011, 18:00   #5
YTP0
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 21
По умолчанию

Код:
Data_01 segment
	
s_1	db 'this is the test', '$'
Len	equ $ - s_1

Data_01 ends

Data_02 segment
	
s_2	db 128 dup('$')

Data_02 ends

Code segment

start proc
	assume cs:code

	mov ax, data_01 ; настраиваем DS на первый сегмент данных
	mov ds, ax
	assume ds:data_01

	mov ax, data_02 ; , а ES - на второй ...
	mov es, ax
	assume es:data_02
	
	lea si, s_1
	lea di, s_2
	mov cx, Len
	cld
	rep movsb ; строка перенесена из Data_01 в Data_02

	mov ax, 0B800h ; настройка на базовый адрес видеобуфера
	mov es, ax
	mov cx, len
	mov si, 0
	mov di, 0 ;начало строки с левого верхнего угла экрана

m1:
	mov al, s_1 [si] ;очередной символ в al
	mov es:[di], ax
	inc si
	inc di
	inc di
	loop m1
	
	mov ax, 4c00h
	int 21h
start endp

Code ends
	end start
так?
YTP0 вне форума Ответить с цитированием
Старый 17.11.2011, 18:11   #6
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Цитата:
так?
Вообще-то, задание предполагало вывести не s_1, а скопированную строку, то есть, s_2. Или нет?

P.S. TASM-ом приведенный код компилироваться не будет. Так что "не так" - в любом случае
Karpinsky вне форума Ответить с цитированием
Старый 17.11.2011, 18:17   #7
YTP0
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 21
Вопрос

просто я поставил семерку вчера сейчас пытаюсь скомпилировать на masm 6.11 пишет линк не совместим

Код:
Data_01 segment
	
s_1	db 'this is the test', '$'
Len	equ $ - s_1

Data_01 ends

Data_02 segment
	
s_2	db 128 dup('$')

Data_02 ends

Code segment

start proc
	assume cs:code

	mov ax, data_01 ; настраиваем DS на первый сегмент данных
	mov ds, ax
	assume ds:data_01

	mov ax, data_02 ; , а ES - на второй ...
	mov es, ax
	assume es:data_02
	
	lea si, s_1
	lea di, s_2
	mov cx, Len
	cld
	rep movsb ; строка перенесена из Data_01 в Data_02

	mov ax, 0B800h ; настройка на базовый адрес видеобуфера
	mov es, ax
	mov cx, len
	mov si, 0
	mov di, 0 ;начало строки с левого верхнего угла экрана

m1:
	mov al, s_2 [si] ;очередной символ в al
	mov es:[di], ax
	inc si
	inc di
	inc di
	loop m1
	
	mov ax, 4c00h
	int 21h
start endp

Code ends
	end start
так?

Последний раз редактировалось rpy3uH; 17.11.2011 в 18:45.
YTP0 вне форума Ответить с цитированием
Старый 21.11.2011, 17:21   #8
Fedor666
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 71
По умолчанию

Пиши под винду и никаких сегментов вообще не понадобится .
Fedor666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перенос сегмента кода за сегмент данных Федор777 Общие вопросы C/C++ 2 20.04.2010 18:43
сортировка данных (пересчет возможных вариантов комбинаций, перенос данных в таблицу) Vitalik85 Microsoft Office Excel 4 12.08.2009 00:30
Ошибка в использовании сегмента Miller-1981 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 10.06.2009 16:04
Помогите с алгоритмом построения сегмента DjDizzy Помощь студентам 4 10.02.2009 20:46