Консультация № 121582
04.02.2008, 13:45
50.00 руб.
0 4 1
Здравствуйте! Надо на ассемблере написать программу: двигаем курсором по экрану и получаем координаты курсора в данный момент. (примерно как в Paint).
Есть код программы, но она написана на emu8086 4.00b7, а надо выполнить на TASM.

Спасибо.

Приложение:
; mouse testname "mouse"org 100hprint macro x, y, attrib, sdatLOCAL s_dcl, skip_dcl, s_dcl_end pusha mov dx, cs mov es, dx mov ah, 13h mov al, 1 mov bh, 0 mov bl, attrib mov cx, offset s_dcl_end - offset s_dcl mov dl, x mov dh, y mov bp, offset s_dcl int 10h popa jmp skip_dcl s_dcl DB sdat s_dcl_end DB 0 skip_dcl: endmclear_screenmacro pusha mov ax, 0600h mov bh, 0000_1111b mov cx, 0 mov dh, 24 mov dl, 79 int 10h popaendmprint_space macro num pusha mov ah, 9 mov al, ‘ ‘ mov bl, 0000_1111b mov cx, num int 10h popaendmjmp startcurX dw 0curY dw 0curB dw 0start:mov ax, 1003h ; disable blinking. mov bx, 0 int 10h; hide text cursor:mov ch, 32mov ah,1int 10h; reset mouse and get its status:mov ax, 0int 33hcmp ax, 0jne okprint 1,1,0010_1111b, " mouse not found"jmp stopok:clear_screenprint 7,7,0010_1011b," note: in the emulator you may need to press and hold mouse buttons "print 7,8,0010_1011b," because mouse interrupts are not processed in real time. "print 7,9,0010_1011b," for a real test, click external->run from the menu."print 10,11,0010_1111b," click/hold both buttons to exit... "; display mouse cursor:mov ax, 1int 33hcheck_mouse_buttons:mov ax, 3int 33hcmp bx, 3 ; both buttonsje hidecmp cx, curXjne print_xycmp dx, curYjne print_xycmp bx, curBjne print_buttonsprint_xy:print 0,0,0000_1111b,"x="mov ax, cxcall print_axprint_space 4print 0,1,0000_1111b,"y="mov ax, dxcall print_axprint_space 4mov curX,cxmov curY, dxjmp check_mouse_buttonsprint_buttons:print 0,2,0000_1111b,"btn="mov ax, bxcall print_axprint_space 4mov curB, bxjmp check_mouse_buttonshide:mov ax, 2 ; hide mouse cursor.int 33hclear_screenprint 1,1,1010_0000b," harware must be free! free the mouse! "stop:; show box-shaped blinking text cursor:mov ah, 1mov ch, 0mov cl, 8int 10hprint 4,7,0000_1010b," press any key...."mov ah, 0int 16hretprint_ax proccmp ax, 0jne print_ax_r push ax mov al, ‘0‘ mov ah, 0eh int 10h pop ax ret print_ax_r: pusha mov dx, 0 cmp ax, 0 je pn_done mov bx, 10 div bx call print_ax_r mov ax, dx add al, 30h mov ah, 0eh int 10h jmp pn_donepn_done: popa ret endp

Обсуждение

Неизвестный
04.02.2008, 14:44
общий
Поскольку Paint все-таки графический, то закономерный вопрос - на текстовом экране или на графическом?
Неизвестный
04.02.2008, 17:34
общий
Ну так как с преподавателем мы это не обговаривали, то скорее всего в текстовом.
Неизвестный
05.02.2008, 13:04
общий
это ответ
Здравствуйте, Draconit!
Ну, тогда можно так, как в приложении. На всякий случай исходник прикрепил также
Ваш код не стал анализировать (в лом) - написал свой с использованием процедуры-обработчика событий от мыши
Есть небольшие комментарии - если что не понятно будет - где спросить, знаете :))

Приложение:
.model tiny LOCALS @@ .386 ; разрешены push < цифра > .code org 100h start: CALL Init cmp btnCount, 0 je @@noMouse @@1: cmp mouFlag, 0 je @@2 push mouX push mouY CALL SetCurs CALL MouPos mov mouFlag, 0 @@2: mov ah, 0Bh int 21h or al, al jz @@1 mov ax, 0Ch ; Убрать обработчик xor cx, cx ; рекомендуется lea dx, MouEvnt ; использую ds = es int 33h jmp @@end @@nomouse: @@end: int 20h Init proc mov ax, 1003h int 10h ; очистка через прокрутку mov ax, 0600h xor cx, cx mov dx, 184Fh mov bh, 1bh int 10h push 0 push 0 CALL SetCurs lea dx, msHello mov ah, 9 int 21h push 0 push 24 CALL SetCurs lea dx, msPressAny mov ah, 9 int 21h CALL MouInit or bx, bx jz @@ret push 15 push 1 CALL SetCurs lea dx, msIsMouse mov ah, 9 int 21h CALL MouShow mov ax, 0Ch ; установка обработчика mov cx, 010100b ; отпускание кнопок мыши lea dx, MouEvnt int 33h @@ret: ret Init endp MouInit proc xor ax, ax int 33h cmp ax, -1 jne @@1 mov btnCount, bl @@1: ret MouInit endp MouShow proc push ax mov ax, 1 int 33h pop ax ret MouShow endp MouHide proc push ax mov ax, 2 int 33h pop ax ret MouHide endp ; установка положения курсора ; координаты черер стек ; ВЫЗОВ: ; push column ; push row ; CALL SetCurs SetCurs proc push bp mov bp, sp push ax push bx push dx mov ah, 2 xor bh, bh ; видеостраница mov dh, BYTE PTR [bp + 4] mov dl, BYTE PTR [bp + 6] int 10h pop dx pop cx pop ax pop bp ret 4 SetCurs endp ; обработчик событий от мыши MouEvnt proc push cs pop ds shr cx, 3 ; делить на 8 shr dx, 3 mov mouFlag, 1 mov mouX, CX mov mouY, DX retf MouEvnt endp MouPos proc ; отображение положения мыши push ax push bx push cs push dx cld lea di, msPos add di, 2 mov cx, 4 mov bx, 10 mov ax, mouX @@1: xor dx, dx div bx push dx LOOP @@1 mov cx, 4 @@2: pop ax add al, ‘0‘ stosb LOOP @@2 mov ax, mouY add di, 3 mov cx, 4 @@3: xor dx, dx div bx push dx LOOP @@3 mov cx, 4 @@4: pop ax add al, ‘0‘ stosb LOOP @@4 push MouMsgX push MouMsgY CALL SetCurs CALL MouHide ; иначе под курсором мыши пропадет lea dx, msPos mov ah, 9 int 21h CALL MouShow pop dx pop cx pop bx pop ax ret MouPos endp BtnCount db 0 mouFlag db 0 mouX dw 0 mouY dw 0 mouMsgX dw 0 mouMsgY dw 23 msHello db ‘Работа начинается‘,13,10,‘$‘ msIsMouse db ‘Мышь обнаружена. Работайте в полноэкранном режиме‘,13,10,‘$‘ msPressAny db ‘Нажмите любую клавишу...$‘ msPos db ‘X:xxxx Y:xxxx$‘ end start
давно
Старший Модератор
31795
6196
05.02.2008, 13:42
общий
1)заголовок программы<font color=blue>; mouse test;name "mouse"masmmodel tiny.186codesegorg 100h</font>2)макрос должен быть в одной строке<font color=blue>endmclear_screen macro pusha</font>3)точка входа<font color=blue>begin:jmp startcurX dw 0curY dw 0curB dw 0start:</font>4)из-за макросов очень длинный переход<font color=blue>cmp bx, 3 ; both buttonsjne no_hidejmp hideno_hide:cmp cx, curX</font>5)конец программы<font color=blue>pn_done: popa ret endp end begin</font>6)все бинарные значения без подчеркивания<font color=blue>00001010b</font>С этими переделками TASM 2, всё скомпилировал
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа