Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 1477 | Дата выхода: | 05.10.2011, 20:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 198 / 61 | Вопросов / ответов: | 2 / 3 | Консультация # 184121: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:помогите написать программу "определения количества слов в строке введенной с клавиатуры и вывести сообщение о полученном результате в символьной форме".Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что Вы мне поможете.... Консультация # 184122: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:помогите написать программу. Дан массив двухразрядных десятичных чисел.Создать второй массив, содержащий квадраты этих чисел;результат в символьной форме переслать в видео буфер.Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что Вы мне поможете. ... Консультация # 184121: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:помогите написать программу "определения количества слов в строке введенной с клавиатуры и вывести сообщение о полученном результате в символьной форме".Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что Вы мне поможете. Дата отправки: 30.09.2011, 19:48 Вопрос задал: Дмитрий (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Дмитрий! Вот Вам программа, решающая Вашу задачу. Программа считает словами последовательности из цифр, английских (больших и малых), кириллицы (больших и малых, и с учетом дополнительных буковок украинского и белорусского алфавита) Все остальное считается разделителями.
Будут вопросы - милости просим в мини-форум.
Код : .model small .stack 100h .data sEnter db 'Enter string: $' sWCnt db 0ah,'Words count = ' sNum db 8 dup (0) ;сюда запишем число слов sPress db 0ah,'Press any key$' buf label byte ; буфер для приема строки с клавиатуры (по ф-и 0ah) max db 128 ; максимальная длина строки len db 0 ; реальная длина введенной строки string db 128 dup (?) ; сама строка .code main proc mov ax, @DATA ;настроим сегментные регистры mov ds, ax ;на сегмент данных mov es, ax lea dx, sEnter mov ah, 9 int 21h ; приглашение ввести строку lea dx, buf mov ah, 0ah int 21h ; вводим строку xor bx, bx ; bh - флаг наличия слова, bl - число слов lea si, string ; сама строка main_loop: ; основной цикл lodsb ; очередной символ cmp al, 0dh ; конец строки ? je print_result ; на конец обработки cmp al, '0' ; цифры ? jb separ_found ; меньше - разделитель cmp al, '9' jbe word_found ; часть слова cmp al, 'A' ; большие латинские ? jb separ_found ; меньше - разделитель cmp al, 'Z' jbe word_found ; часть слова cmp al, 'a' ; малые латинские ? jb separ_found ; меньше - разделитель cmp al, 'z' jbe word_found ; часть слова cmp al, 80h ; кириллица А-п jb separ_found ; меньше - разделитель cmp al, 0afh jbe word_found ; часть слова cmp al, 0e0h ; кириллица р-я,Ё,ё,украинские,белорусские буковки jb separ_found ; меньше - разделитель cmp al, 0f7h jbe word_found ; часть слова separ_found: ; найден разделитель cmp bh, 0 ; было ли перед этим слово je main_loop ; повтор разделителей mov bh, 0 ; сбросим флаг слова inc bl ; увеличим счетчик слов jmp main_loop ; на основной цикл word_found: ; слово mov bh, 1 ; установим флаг jmp main_loop ; на чтение очередного символа print_result: ; встретили конец строки add bl, bh ; посчитаем самое последнее слово (если оно есть) ;преобразуем число слов в строку mov al, bl ; число слов lea di, sNum ; адрес строки call itoa ; преобразуем lea dx, sWCnt mov ah, 9 int 21h ; выведем число слов lea dx, sPress mov ah, 9 int 21h mov ah, 0 int 16h ; чтобы сразу не убегало с экрана mov ax, 4c00h int 21h main endp itoa proc ; преобразование числа из al в строку xor cx, cx ; счетчик цифр mov bl, 10 ; будем делить на 10 div_loop: mov ah, 0 ; сбросим предыдущий остаток div bl ; делим ax/bl push ax ; сохраним остаток ah в стеке inc cx ; посчитаем cmp al, 0 ; делим, пока al не 0 jnz div_loop pr_loop: ; цикл вывода pop ax ; восстановим из стека очередную цифру mov al, ah ; в al or al, '0' ; сделаем из числа символ stosb ; запишем по адресу [di++] loop pr_loop mov ax, 0a0dh ; перевод строки stosw mov al, '$' ; для 9 функции stosb ret itoa endp end main Консультация # 184122: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:помогите написать программу. Дан массив двухразрядных десятичных чисел.Создать второй массив, содержащий квадраты этих чисел;результат в символьной форме переслать в видео буфер.Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что Вы мне поможете.
Дата отправки: 30.09.2011, 19:53 Вопрос задал: Дмитрий (Посетитель) Всего ответов: 2 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Дмитрий! Вот Вам такой вариант. Исходные числа рассматриваются, как обычные двоичные числа. Т.к. они по условию двуразрядные, то для хранения достаточно одного байта. Для квадратов же необходимо два байта-слово.
Код : .model small .stack 100h Color equ 07h ;цвет выводимых данных .data sNumbers db 'Numbers: ',0 sSquares db 'Squares: ',0 sPress db 'Press any key',0 Numbers db 21, 34, 99, 10, 15, 16 ;примерный массив чисел lenNumbers equ $-Numbers ;длина массива Square dw lenNumbers dup (?) ;массив слов квадратов чисел sNum db 8 dup (?) ;буфер для преобразования числа в строку .code main proc mov ax, @DATA ;настроим сегментные регистры mov ds, ax ;DS - сегмент данных mov ax, 0b800h mov es, ax ;ES - сегмент видеобуфера mov ah, 3 ;необходимо, чтобы под ХР правильно int 10h ;работала прямая запись в видеопамять call CalcSquare ;посчитаем квадраты call PrintResult ;выведем результат работы lea si, sPress ;Press any key mov di, 3*80*2 ;в начале четвертой строки call print ;выводим mov ah, 2 ;установим курсор mov dx, 0400h ;в начале пятой строки mov bh, 0 int 10h mov ah, 0 ;ждем "any key" int 16h ;чтобы сразу не убегало с экрана mov ax, 4c00h int 21h main endp CalcSquare proc ;расчет квадратов lea si, Numbers ;адрес массива однобайтных чисел lea di, Square ;адрес массива двубайтных чисел mov cx, lenNumbers ;количество чисел CalcLoop: ;цикл по всем числам lodsb ;читаем al=ds:[si],si=si+1 mul al ;ax=al*al mov [di], ax ;сохраняем ds:[di]=ax inc di ;увеличиваем на 2 индекс квадратов inc di ;stosw не годится, т.к. es - видеобуфер! loop CalcLoop ret CalcSquare endp PrintNum proc ;вывод числа на экран из ax, ;начиная с позиции es:[di] ;после выхода di указывает на ;следующую позицию в строке push si ;сохраним индекс в массиве чисел push di ;сохраним индекс в видеобуфере lea di, sNum ;адрес временного буфера mov si, di ;запомним для вывода на экран call itoa ;преобразуем ax в строку ds:[di] pop di ;восстановим адрес на экране call print ;выводим ds:[si] на экран es:[di] mov al, ' ' ;отделим пробелом, ah = Color stosw pop si ;восстановим индекс в массиве чисел ret PrintNum endp PrintResult proc ;вывод результата работы lea si, sNumbers ;адрес строки 'Numbers: ',0 xor di, di ;с начала первой строки call print ;выводим lea si, Numbers ;адрес массива однобайтных чисел mov cx, lenNumbers ;число чисел PrNumLoop: xor ax, ax ;обнулим ah, чтобы получилось слово lodsb ;ax = слову, равному байту call PrintNum ;выводим ax за выведенной ранее строкой loop PrNumLoop ;по всем ;выведем квадраты lea si, sSquares ;адрес строки 'Squares: ',0 mov di, 1*80*2 ;с начала второй строки call print ;выводим lea si, Square ;адрес массива квадратов mov cx, lenNumbers ;количество PrSquareLoop: lodsw ;читаем слово call PrintNum ;выводим loop PrSquareLoop ;по всем ret PrintResult endp print proc ;вывод на экран строки ds:[si] ;по адресу es:[di] mov ah, Color ;атрибут (цвет) printLoop: lodsb ;очередной cmp al, 0 ;конец строки? je printRet stosw ;выводим jmp printLoop printRet: ret print endp itoa proc ;преобразование числа из ax в строку ;по адресу ds:[di] push cx ;сохраним счетчик чисел xor cx, cx ;счетчик цифр mov bx, 10 ;будем делить на 10 div_loop: xor dx, dx ;сбросим предыдущий остаток div bx ;делим dx:ax/bx push dx ;сохраним остаток dx в стеке inc cx ;посчитаем test ax, ax ;делим, пока ax не 0 jnz div_loop pr_loop: ;цикл вывода pop ax ;восстановим из стека очередную цифру or al, '0' ;сделаем из числа символ mov [di], al ;запишем по адресу [di++] inc di loop pr_loop mov byte ptr [di], 0;закроем строку нулем pop cx ;восстановим счетчик чисел ret itoa endp end main Консультирует Зенченко Константин Николаевич (Модератор): Здравствуйте, Дмитрий!
Ещё один вариант решения Вашей задачи. Выводится все квадраты чисел от 10 до 99, с форматированием вывода. 100% tasm(2.00+), masm код просто не скомпилирует. Удачи! Приложение:
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий