WMmail.ru - сервис почтовых рассылок

среда, 5 октября 2011 г.

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

 
Если выпуск не отображается, вы можете прочесть его на сайте Отказаться от рекламы
  
  
Снижение цен на ступицы КАМАЗ от 5% до 30%
  
  
  

  Мои подписки      Мои группы      Мои новости     
        Автор 
Калашников О.А.
      
  
Компьютеры и интернет   →   Софт   →   Программирование   →   RFpro.ru: Ассемблер? Это просто! Учимся программировать
  
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 благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
 
Комментировать выпуск
     В избранное

Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать    26 сентября 2011, 08:33
RFpro.ru: Ассемблер? Это просто! Учимся программировать    25 сентября 2011, 10:14
RFpro.ru: Ассемблер? Это просто! Учимся программировать    21 сентября 2011, 11:37

Все выпуски рассылки

6 октября 2011 отмечают:
День российского страховщика
Всемирный день охраны мест обитаний
День архивиста Беларуси
День армии Египта
День поминовения жертв землетрясения 1948 года в Туркменистане

Именины: Андрей, Иван, Иннокентий, Николай, Петр, Раиса
 
 
  
Добавь остроты! Добавь остроты!
Эротическое белье от 150 руб. Регулярные распродажи!

  Снаряжение для кемпинга Снаряжение для кемпинга
Большой выбор палаток, спальников, мебели и посуды для кемпинга

  Дистанционное обучение для мам! Дистанционное обучение для мам!
Не теряй времени, получи диплом по психологии государственного образца!

 
  

Subscribe рекомендует
 
Компьютеры и интернет  →   рассылки   и   группы
  
Программирование на Паскале. Новая методика обучения.
Программирование на языке Паскаль. Эффективная методика обучения начинающих.
Подписчиков: 431
  Программирование. Форум !!!
Задайте здесь любой вопрос по программированию - и Вы получите ответ. Участвуйте в оживленных дискуссиях, обсуждайте интересные темы. Давайте ответы сами. Ведь это форум !!! Здесь просто интересно ! Присоединяйтесь !
Подписчиков: 501
  Фильмы, игры и программы от Бендера
Ежедневный блог новинок, фильмов, игр и других новостей интересной информации в сети интернет
Подписчиков: 130
 
 
 
Подписан адрес: admin10383.deep@blogger.com
Код этой рассылки: comp.prog.assembler
Архив рассылки
Отписаться:  На сайте  Почтой
Поддержка подписчиков
Убрать рекламу
Другие рассылки этой тематики
Другие рассылки этого автора
 
Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности

Комментариев нет:

Отправить комментарий