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

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


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

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

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

Boriss
Статус: Академик
Рейтинг: 2507
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 1998
∙ повысить рейтинг »
vladisslav
Статус: 6-й класс
Рейтинг: 1230
∙ повысить рейтинг »

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

Номер выпуска:1375
Дата выхода:24.10.2010, 08:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:227 / 66
Вопросов / ответов:1 / 1

Вопрос № 180367: Здравствуй эксперты, возник вопрос по заданию. Основное: х86(специальных функций не нужно), платформа доса, Тасм, размер переменных вот тут с проблемой. для работы с программой необходимо ввести дескриптор на клавиатуру. задание вот как звуч...



Вопрос № 180367:

Здравствуй эксперты, возник вопрос по заданию.
Основное: х86(специальных функций не нужно), платформа доса, Тасм, размер переменных вот тут с проблемой.
для работы с программой необходимо ввести дескриптор на клавиатуру.
задание вот как звучит: " Необходимо реализовать программу работы со строками. Исходная строка вводится с клавиатуры, результат выводится на экран. Слова в строке могут быть разделены пробелами и знаками препинания.В каждом слове строки заменить 1-ую букву на последнюю, 2-ую на предпоследнюю и т.д. "
Идею предложить не могу, все мысли отходят к си++.

Отправлен: 19.10.2010, 08:22
Вопрос задал: Мельников (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Мельников!
Вот Вам программа под Tasm, расчитана под формат COM
Т.е. компилируем так:
Код:
tasm name
tlink name /t
Удачи в освоении языка Ассемблера!
PS Все операции ввода-вывода сделал через работу с устройствами stdin, stdout

Код:

.model tiny
.code
.startup
mov bx, 1 ;выведем соо бщение через стандартное выходное устройство - монитор
lea dx, prompt
mov cx, len_prt
mov ah, 40h
int 21h

xor bx, bx ;строку считываем через стандартное входное устройство - клавиатуру
lea dx, string
mov cx, 256 ;длину взял побольше, чтобы наверняка хватило :)
mov ah, 3fh
int 21h

lea si, string ;адрес строки
mov bx, ax ;длина принятой строки
sub bx, 2 ;последние 0dh, 0ah нам не нужны

push bx ;сохраним длину строки для вывода на экран

start_sep: ;старт с позиции разделителя
mov dl, 0 ;dl=0: предыдущее состояние - разделитель
main_loop: ;цикл считывания очередного символа
lodsb ;читаем, si автоматом инкрементируется
cmp al, 0dh ;проверим на конец строки
je finish ;прошли до конца
call separator ;проверим код на разделитель
jz sep_cmp_step ;FZ=1 - встретился разделитель
cmp dl, 0 ;не разделитель, проверяем предыдущее состояние
jne main_loop ;не разделитель - на чтение следующего символа
lea bx, [si+1] ;разделитель - начинается новое слово, запоминаем позицию
; на 2 больше начала слова! (для чего - см дальше)
mov dl, 1 ;и помечаем состояние слова
jmp main_loop ;на ввод следующего символа
sep_cmp_step: ;встретили разделитель
cmp dl, 0 ;если были в позиции разделителя,
je main_loop ; то на ввод следующего символа
call rotate ;были в позиии слова - значит оно закончилось
; при этом si указывает на символ за первым разделителем за словом
; т.к. адрес последнего символа слова = [si-2],
; отсюда и начало слова по адресу [bx-2]
jmp start_sep ;опять начинаем с позиции разделителя
finish: ;дошли до конца
call rotate ;последнее слово надо тоже перевернуть

mov bx, 1 ;выводим заголовок строки
lea dx, result
mov cx, len_res
mov ah, 40h
int 21h

pop cx ;сохраненная длина введеной строки
mov bx, 1 ;выведем преобразованную строку
lea dx, string
mov ah, 40h
int 21h

mov bx, 1 ;сообщение "Press any key"
lea dx, press_any
mov cx, len_press
mov ah, 40h
int 21h

mov ah, 8 ;ждем "any key" :)
int 21h

.exit 0 ;выход

;проверка на разделители
;результат: FZ=1 - код в al - разделитель
separator proc
lea di, sep_string ;строка кодов разделителей
mov cx, len_sep_string ;длина
repne scasb ;ищем
ret
separator endp

;переворот слова
;[bx-2] - адрес первого символа слова
;[si-2] - адрес последнего
rotate proc
push si ;сохраним для продолжения анализа
rotate_loop:
cmp bx, si ;адреса "встретились"?
jae rotate_ret ;да, выходим
mov al, [bx-2] ;меняем местами
xchg al, [si-2]
mov [bx-2], al
inc bx ;"голову" вперед
dec si ;"хвост" назад
jmp rotate_loop ;на повтор
rotate_ret:
pop si ;восстановим адрес конца
lea bx, [si] ; необходимо для случая, когда строка заканчивается разделителями
ret
rotate endp

;данные
.data
press_any db 0dh,0ah,&# 39;Press any key for exit'
len_press equ $-press_any

;все возможные разделители
sep_string db 9,' ,.:;?!-+=\/()[]{}'
len_sep_string equ $-sep_string

prompt db 'Enter string: '
len_prt equ $-prompt

result db 'Result: '
len_res equ $-result

;зарезервируем буфер для вводимой строки в неинициализируемом сегменте,
; чтобы не занимать место в результируещем EXE-файле
.data?
string db 256 dup (?)

end

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 19.10.2010, 15:34
Номер ответа: 263551
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263551 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.22 от 18.10.2010

    В избранное