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

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


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

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

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

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

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

Номер выпуска: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

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

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

Консультация # 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

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

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


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, Дмитрий!

Ещё один вариант решения Вашей задачи.
Выводится все квадраты чисел от 10 до 99, с форматированием вывода.
100% tasm(2.00+), masm код просто не скомпилирует.
Удачи!

Приложение:

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 01.10.2011, 23:04
Рейтинг ответа:

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


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

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

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



В избранное