Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2744
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2624
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2152
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1478
Дата выхода:06.10.2011, 21:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:198 / 61
Вопросов / ответов:1 / 1

Консультация # 184125: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Задание: Нужно построить схему алгоритма решения задачи, а затем написать программу с подробными комментариями на ассемблере. Переслать строку символов, введенных с клавиатуры, из одного сегмента данных в другой и отобразить на экран с использованием видео буфера. Прогр...


Консультация # 184125:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Задание:
Нужно построить схему алгоритма решения задачи, а затем написать программу с подробными комментариями на ассемблере. Переслать строку символов, введенных с клавиатуры, из одного сегмента данных в другой и отобразить на экран с использованием видео буфера. Программа должна состоять из сегментов данных, кода и стека.

Дата отправки: 01.10.2011, 14:25
Вопрос задал: Ermak (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 382071!
Такой "схемы алгоритма решения задачи" достаточно?



Сама программа...
Для вывода используется прямая запись в видеобуфер
Для ввода строки (и ее отображения при вводе!) - функция 0ah.
Для согласования позиции курсора с выводимой информацией
применена функция установки позиции курсора по смещению в видеобуфере

Код :
;Переслать строку символов, введенных с клавиатуры, 
;из одного сегмента данных в другой и отобразить на экран 
;с использованием видео буфера. 

stk segment para stack ;Сегмент стека с выравниваем на 10h (para)
 dw 256 dup (?)
stk ends

Color equ 07h  ;атрибут (цвет) выводимых символов

data1 segment
sEnter db 'Enter string: ',0 ;Все сообщения в сегменте data1
sResult db 'Duplicate string: ',0
sAny db 'Press any key',0

;данные для ввода строки с помощью функции 0ah
max1 db 128  ;размер буфера
cnt db ?  ;длина введенной строки
str1 db 128 dup (?) ;сама введеная строка
data1 ends

data2 segment
str2 db 128 dup (?) ;сюда запишем введенную строку
data2 ends

code segment
assume cs:code, ds:data1, ss:stk
main proc
 mov ax, data1 ;ds = data1
 mov ds, ax
 mov ax, 0b800h ;es = video
 mov es, ax

        mov ax,3  ;необходимо под ХР для прямой
        int 10h    ;записи в видеобуфер

 lea si, sEnter ;Enter string:
 xor di, di  ;в начале первой строки
 call Print  ;выводим
 call SetPos  ;установим позицию курсора за строкой

    ;ввод строки при помощи функции 0ah
 lea dx, max1 ;адрес буфера в dx
 mov ah, 0ah  ;номер функции ввода строки
 int 21h  ;вызов функции
 xor bx, bx  ;запишем в конце строки 0,(там сейчас код 0dh)
 mov bl, cnt  ;длина ввеленной строки
 mov str1[bx], 0 ;пишем 0

    ;скопируем введенную строку в сегмент data2
 push es  ;сохраним сегмент видео
 mov ax, data2 ;es = data2
 mov es, ax
 lea si, str1 ;ds:[si] - исходная строка
 lea di, str2 ;es:[di] - сюда копируем
 lea cx, [bx+1] ;cx=bx+1 - длина строки + завершающий 0
 rep movsb  ;копируем
 pop es  ;восстановим сегмент видео

 lea si, sResult ;Duplicate string:
 mov di, 80*2 ;в начале второй строки
 call Print  ;выводим

    ;выведем строку из сегмента data2
 push ds  ;сохраним сегмент data1
 mov ax, data2 ;ds = data2
 mov ds, ax
 lea si, str2 ;выводим строку ds:[si]
 call Print
 pop ds  ;восстановим сегмент data1

 lea si, sAny ;выводим строку Press any key
 mov di, 2*80*2 ;в начале третьей строки
 call Print  ;выводим
 call SetPos  ;установим курсор за строкой

 mov ah, 0  ;ждем "any key"
 int 16h

 mov ax, 4c00h
 int 21h
main endp

print proc   ;вывод на экран строки ds:[si]
    ;по адресу es:[di]
 mov ah, Color ;атрибут (цвет)
printLoop:
 lodsb   ;очередной
 cmp al, 0  ;конец строки?
 je printRet
 stosw   ;выводим
 jmp printLoop
printRet:
 ret
print endp

SetPos proc   ;установка позиции курсора 
    ;в нулевой странице видеопамяти
    ;на входе di - смещение в видеопамяти
 mov ax, di  ;позиция в видеобуфере
 xor dx, dx  ;подготовимся к делению
 mov cx, 80*2 ;число байт на одну строку
 div cx  ;dx:ax / cx
 shr dl, 1  ;dl = колонке
 mov dh, al  ;dh = строке
 mov ah, 2  ;функция установки позиции курсора
 mov bh, 0  ;0 страница
 int 10h
 ret
SetPos endp

code ends
 end main

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 02.10.2011, 00:15
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное