我正在尝试在桌面应用程序中实现鼠标功能。我已经成功实现了自定义引导加载程序,它将控件传输到桌面应用程序。问题是它无法显示我想要打印的完整设计。如果有人可以帮忙,我会感谢你.. 我面临的另一个问题是我不能使用" seg"二进制文件中的命令(.bin)。它给我们一个错误,平面二进制不允许段基参考。如果有另一种方法加载自定义段(ES)寄存器,请告诉我。我想这样做来实现我在下面发布的鼠标代码。此代码位于单独的文件中。它仅显示背景颜色。它不会在屏幕上显示任何字符或数字。
提前致谢
bits 16
jmp main
left db "Left Mouse Button Pressed at Coordinates: ","$"
right db "Right Mouse Button Pressed at Coordinates: ","$"
move db "Mouse Moved at Coordinates: ","$"
next_line db 0DH,0AH, "$"
x_coord dw 0
y_coord dw 0
coord dw 0
;.code
main:
cli
mov ax,cs
mov ds, ax
mov es, ax
mov ss, ax
sti
call clrrg ; Clear Data/General Registers
; Changing Video Mode as Per Requirement
mov ah,00h ; Change Video Mode
mov al,12h ; AL=12h, Video Mode 640*480
int 10h
mov ah,0Bh
mov bh,0
mov bl,09h
int 10h
; Show Mouse Cursor on Screen
mov ax,2 ; show Mouse Cursor Functionj
int 33h ; Mouse Interrupt
call clrrg ; Clear Registers
mov dx,cs ; Load Segment Address
mov es,dx ; Store contents of dx in es
mov dx, [mouse_handler] ; Load Offset of Function (mouse_handler)
; Step # 02
.mloop:
mov cx, 00001011b ; CX=00001011b tells, we want to generate Interrupt
; if Left Mouse Button OR Right Mouse Button is Pressed
call mouse_handler
mov ax,000Ch ; Setup Interrupt Vector Entry for Specific Mouse Event
int 33h ; Call Mouse Interrupt
call clrrg ; Clear Registers
jmp .mloop
mouse_handler:
;if ax==00000010b ; Means Left Mouse Button is Pressed
cmp ax, 2
jne .next
mov [x_coord],dx
mov [y_coord],cx
;mov dx,[left] ; Print Message
;mov ah,09h
;int 21h
mov dx,word x_coord
mov [coord], dx ; Passing as Argument in Variable
call print_coord ; Print X Coordinates
mov al,"," ; Print Comma
mov ah,0eh
int 10h
mov dx,word y_coord
mov [coord], dx ; Passing as Argument in Variable
call print_coord ; Print Y Coordinates
;mov dx,[next_line] ; Print Next Line
;mov ah,09h
;int 21h
.next:
;if ax==00001000b ; Means Right Mouse Button is Pressed
cmp ax, 00001000b
jne .next1
mov [x_coord],dx
mov [y_coord],cx
;mov dx,[right] ; Print Message
;mov ah,09h
;int 21h
mov dx,word x_coord
mov [coord], dx ; Passing as Argument in Variable
call print_coord ; Print X Coordinates
mov al,"," ; Print Comma
mov ah,0eh
mov bx, 0
int 10h
mov dx,word y_coord
mov [coord], dx ; Passing as Argument in Variable
call print_coord ; Print Y Coordinates
;mov dx,[next_line] ; Print Next Line
;mov ah,09h
;int 21h
.next1:
;if ax==00000001b ; Means Mouse is Moved
cmp ax, 1
jne .next2
mov [x_coord],dx
mov [y_coord],cx
;mov dx,[move] ; Print Message
;mov ah,09h
;int 21h
mov dx,word x_coord
mov [coord], dx ; Passing as Argument in Variable
call print_coord ; Print X Coordinates
mov al,"," ; Print Comma
mov ah,0eh
mov bh, 0
mov bl, 4
int 10h
mov dx,word y_coord
mov [coord], dx ; Passing as Argument in Variable
call print_coord ; Print Y Coordinates
;mov dx,[next_line] ; Print Next Line
;mov ah,09h
;int 21h
.next2:
ret
;*******************************
; Procedure to Print Coordinates
;*******************************
print_coord:
call clrrg ; Clear Data Registers
mov ax,coord ; Move "coord" in 'ax' (Numerator goes in ax)
mov bx,10 ; Move 10 in bx (Denominator goes in bx)
; If value is ZERO
cmp ax, 0
jne .looping
add al,48
mov ah,0eh
mov bx, 0
mov bl, 4
int 10h
jmp .return
; For Values other than ZERO
.looping:
mov dx,0
div bx
push dx
inc cx
cmp ax, 0
jne .looping
.p:
pop dx
add dl,48
mov al, dl
mov ah,0eh
mov bx, 0
mov bl, 4
int 10h
loop .p
.return:
ret
clrrg:
mov ax,0
mov bx,0
mov cx,0
mov dx,0
ret