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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

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

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 1387
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1127
∙ повысить рейтинг »
Jimhucksly
Статус: 5-й класс
Рейтинг: 793
∙ повысить рейтинг »

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

Номер выпуска:1267
Дата выхода:26.10.2009, 15:00
Администратор рассылки:Лысков Игорь Витальевич, Модератор
Подписчиков / экспертов:433 / 66
Вопросов / ответов:1 / 2
IRC-канал по теме:#assembler

Вопрос № 173466: Помогите написать программу на ассемблере Программа,которая выводит на экран закрашенный квадрат 5х5 пикселей,а затем убирает его. Координаты центра квадрата задаються нажатием левой кнопки мыши. Удаление квадрата с экрана по нажатию правой кнопки...



Вопрос № 173466:

Помогите написать программу на ассемблере
Программа,которая выводит на экран закрашенный квадрат 5х5 пикселей,а затем убирает его. Координаты центра квадрата задаються нажатием левой кнопки мыши. Удаление квадрата с экрана по нажатию правой кнопки мыши. Выход из программы происходит после нажатия любой клавиши на клавиатуре.

Заранее спасибо от души!!!!
(программа в текстовом файле,и .asm .obj)

Отправлен: 20.10.2009, 15:30
Вопрос задал: sergVDVMIN, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, serg1987146.
Программа в приложении
Работаем в режиме 13h = 320х200х256
По левой кнопке рисуем в позиции курсора розовым цветом, по правой рисуем черным цветом, как бы вытираем
Чтобы не было некоректностей на границе экрана (рисуем слева экрана, а рисуется справа),
проверяем на граничные условия и корректируем данные. Низ экрана можно не проверять.

Приложение:

-----
Удачи!

Ответ отправил: Лысков Игорь Витальевич, Модератор
Ответ отправлен: 23.10.2009, 11:38
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru
Абонент Skype: igorlyskov

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

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

    Код:
    .model small
    .386
    JUMPS
    .stack 200h

    .data
    scr_copy db 320*200 + 1 dup (0) ; здесь будем формировать образ экрана, а потом его копировать

    ToQuit db 0 ; флаг выхода
    MouBtnCount db 0
    MouFlag db 0
    MyExitCode db 0

    scrSize equ 320*200 + 1

    VideoBuf dd 0A000h:0000 ; адрес видеобуфера
    backgr db 145

    mouX dw 0
    mouY dw 0
    .code
    start:
    mov ax, @data
    mov ds, ax

    mov ax, 13h
    int 10h

    xor ax, ax
    int 33h
    cmp ax, 0FFFFh
    je @@_install_mouse_event
    inc ToQuit ; раз мышь не устновилась - ставим флаг на выход
    inc MyExitCode ; чтобы код выхода был не ноль
    jmp @@_quit ; так сложно, чтобы с дебагером можно было определить, почему не работает


    @@_install_mouse_event:
    ; самая элегантная работа с мышью через процедуру - обработчик событий от мыши
    mov mouBtnCount, bl ; заодно сигнал, что обработчик установлен - для анализа при выходе
    mov ax, 0Ch ; функция установки
    mov cx, 30 ; обработка только отпускания левой и правой кнопки мыши
    push cs
    pop es
    mov dx, OFFSET mou_handler
    int 33h
    inc MouFlag
    ; CALL ChangeScreen
    CALL ShowMouse

    @@_event_loop:
    ; CALL ChangeScreen

    mov ah, 1
    int 16h
    jn z @@_Quit ; если была нажата клавиша - выход

    mov ah, ToQuit
    or ah, ah
    jnz @@_quit
    CALL ChangeScreen
    jmp @@_event_loop

    @@_quit:
    mov bl, mouBtnCount
    jz @@_no_handler
    xor cx, cx
    mov ax, 0Ch
    push cs
    pop es
    mov dx, OFFSET mou_handler
    int 33h
    @@_no_handler:
    mov ah, 4Ch
    mov al, MyExitCode ; ненулевой код выхода = ошибка
    int 21h

    mou_handler proc far ; FAR - обязательно!
    mov ax, SEG mouX
    mov ds, ax
    test bx, 010b
    jnz @@_right_button
    jmp @@_left_button
    @@_right_button:
    inc ToQuit
    jmp @@_mou_ret
    @@_left_button:
    shr CX, 1
    mov mouX, CX
    mov mouY, DX
    inc MouFlag
    @@_mou_ret:
    ret
    mou_handler endp

    ShowMouse proc
    push ax
    mov ax, 1
    int 33h
    pop ax
    ret
    ShowMouse endp

    HideMouse proc
    push ax
    mov ax , 2
    int 33h
    pop ax
    ret
    HideMouse endp

    ; заполняет образ экрана и устанавливает scr_changed
    ChangeScreen proc
    push ax
    mov al, MouFlag
    or al, al
    jnz @@_fill
    jmp @@_ret
    @@_fill:
    push bx dx cx si di
    push ds
    pop es
    cld

    lea di, scr_copy
    mov cx, scrSize
    mov al, backgr
    REP stosb

    ; все копируем на экран, точнее, в видеобуфер
    ; это очистка экрана
    mov cx, 160*100
    lea si, scr_copy
    les di, VideoBuf
    CALL HideMouse
    REP movsd
    CALL ShowMouse
    ; теперь прямо на экран рисуем квадратик
    ; ищем координату мыши в массиве отображаемом
    mov bx, 320
    mov ax, mouY
    mul bx
    mov di, ax ; это начало строки
    add di, mouX
    sub di, 320
    sub di, 320

    ; начало закрашиваемой области
    ; поскольку видеобуфер = непрерывная область - вычисл им, сколько на строке отображать
    mov dx, 5 ; число строк
    mov cx, dx ; длина закрашиваемой строки
    ; выход за преде лы строки
    mov ax, mouX
    cmp ax, 3 ; ближе 2 пикселов к левой части экрана?
    ja @@_2
    mov cx, ax ;уменьшаем длину строки
    sub di, cx
    jmp @@_draw
    @@_2:
    sub di, 2 ; смещение слева от курсора
    cmp ax, 317 ; теперь к правому 317 = 319 - 2
    jb @@_draw
    mov cx, 322
    sub cx, ax
    @@_draw:
    mov al, 4 ; красный цвет
    CALL HideMouse
    @@_line:
    push cx
    push di
    REP stosb
    pop di
    pop cx
    add di, 320
    dec dl
    or dl, dl
    jnz @@_line
    CALL ShowMouse

    ; очищаем флаг события - обработано
    xor al, al
    mov MouFlag, al
    pop di si cx dx bx
    @@_ret:
    pop ax
    ret
    ChangeScreen endp

    end start

    -----
    Вывод - то место в тексте, где вы устали думать

    Ответ отправил: Boriss, Академик
    Ответ отправлен: 24.10.2009, 13:34

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


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

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

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

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

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

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

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


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.10 от 26.10.2009

    В избранное