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

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


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

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

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

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

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

Номер выпуска:1454
Дата выхода:30.05.2011, 03:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:216 / 64
Вопросов / ответов:2 / 2

Вопрос № 183311: Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы: Дана двухбайтовая двоичная строка. Найти в ней все сочетания из трех единиц (сочетание 11111 считать за три повторения). Задача для TASM, model small. Как ...


Вопрос № 183321: Добрый день, уважаемые эксперты! Прошу помочь с программой, не могу понять, как её реализовать: Матрица (размерность 4х4). Найти номера строк, в которых есть числа, кратные пяти, и сформировать из них отдельный массив (номера не должны повторятьс...

Вопрос № 183311:

Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы:
Дана двухбайтовая двоичная строка. Найти в ней все сочетания из трех единиц (сочетание 11111 считать за три повторения).
Задача для TASM, model small.
Как я понимаю, можно двигать младший бит в CF. Но не могу понять как настроить счетчики.
Заранее спасибо.

Отправлен: 24.05.2011, 14:07
Вопрос задал: Валитов Ринат Харисович (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Airyashov (Студент) :
Здравствуйте, Валитов Ринат Харисович!
вариант решения
Код :
.model small ; модель пямяти для программы типа EXE
stack 100h  ; сегмент стека

data   ; сегмент данных
 Sbit dw 1111011100011111b  ; битовая строка

code   ; сегмент кода

 start:   ; точка входа в программу
 mov ax,@data; инициализация семента данных
 mov ds,ax

 xor cx,cx  ; cx=0 тут считаем кол-во групп
 mov dx,Sbit  ; данные, загрузим битовую строку в регистр
 mov ax, 111b ; ax=группа которую ищем
 next:
 mov bx,dx   ; поместить строку во временный регистр
 and bx,ax   ; сдклать логическое И с группой
 cmp bx,ax   ; сравнить группу и результат предыдущей операции
 jne @net_sovp  ; если не совпадают переход
  inc cx   ; иначе, увеличить счетчик
 net_sovp:
 shl ax,1   ; сдвинуть группу на разряд влево
 jnc @next  ; проверяем, все ли групы прошли, нет продолжить цикл

; кол-во групп в cx
 
 mov ax,4c00h ; номер функции DOS и параметр, завершить программу, код ошибки 0
 int 21h   ; вызов DOS 
end @start   ; точка входа

Ответ отправил: Airyashov (Студент)
Ответ отправлен: 25.05.2011, 13:50
Номер ответа: 267371
Россия, Казань
Адрес: Казань
ICQ # 317748666

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


  • Вопрос № 183321:

    Добрый день, уважаемые эксперты! Прошу помочь с программой, не могу понять, как её реализовать:
    Матрица (размерность 4х4). Найти номера строк, в которых есть числа, кратные пяти, и сформировать из них отдельный массив (номера не должны повторяться).
    Матрицы для меня темный лес на АСМе. Все это дело на TASM
    Большое спасибо.

    Отправлен: 24.05.2011, 19:43
    Вопрос задал: Сонечкин Илья Федорович (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Сонечкин Илья Федорович!
    Предлагаю такой вариант решения.
    Вообще говоря, можно было воспользоваться тем, 4 - степень двойки, деление релизовать через сдвиг,
    но я сделал через деление, как более универсальный способ

    Код :
     .model small
    
    N equ 4
     .data
    array dw 125, 34, 67, 5
     dw 1, 3, 98, 100
     dw 4, 64, 67, 3
     dw 78, 9, 10, 2
    div5 dw N dup (?)  ;сюда запишем номера строк элементов матрицы, кратных 5
    count dw ?   ;их количество
    
     .code
    main proc
     mov ax, @DATA
     mov ds, ax
     mov es, ax
    
     lea di, div5  ;адрес, куда писать
     xor bx, bx   ;база матрицы, одновременно индекс строки
     mov cx, N   ;число строк
     mov count, 0  ;число чисел, кратных 5
     mov bp, 5   ;будем делить на 5
    
    RowLoop:    ;цикл по строкам
     push cx   ;сохраним счетчик строк
     mov cx, N   ;число элементов в строке
     xor si, si   ;индекс в строке
    
    ColLoop:    ;цикл по колонкам в строке
     mov ax, array[bx+si] ;очередной элемент
     cwd    ;превращаем в двойное слово dx:ax
     idiv bp   ;делим на 5
     test dx, dx   ;проверяем остаток
     jnz next   ;не делится нацело - пропускаем
     cmp count, 0  ;если еще ничего нет,
     je SaveRow   ; то сразу пишем
         ;проверим, чтобы номера строк не повторялись
     push di   ;сохраним использованные регистры
     push cx
     mov ax, bx   ;сформируем номер строки 0-4
     mov cl, N*2   ;разделим на длину строки в байтах
     div cl   ;разделится нацело, поэтому ah=0
     mov cx, count  ;число запомненных номеров строк
     lea di, div5  ;адрес номеров строк
     repne scasw   ;ищем, пока не равно
     pop cx
     pop di
     jz next   ;нашли - пропускаем элемент в строке
    SaveRow:    ;сохраняем
     mov ax, bx   ;сформируем номер строки 0-3
     mov cl, N*2
     div cl   ;ax = 0, 1, 2, 3
     stosw    ;и сохраняем
     inc count   ;считаем
     jmp NextRow   ;дальше идти нет смысна - переходим на следующую строку
    next:     ;на следующий элемент в строке
     inc si   ;у нас слова, по 2 байта
     inc si   ;2 inc-а короче, чем add si,2   
     loop ColLoop   ;по колонкам
    NextRow:    ;переходим на следующубю строку
     add bx, N*2   ;смещаем базу на 4 элементов
     pop cx   ;восстанавливаем счетчик строк
     loop RowLoop   ;по всем строкам
    
     mov ax, 4c00h  ;выходим в ДОС 
     int 21h
    main endp
    
     end main
    

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

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

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


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

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

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

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

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

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

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



    В избранное