NASM:使用段在二进制文件中实现鼠标功能(实现引导加载程序)

时间:2013-11-28 17:54:58

标签: nasm

我正在尝试在桌面应用程序中实现鼠标功能。我已经成功实现了自定义引导加载程序,它将控件传输到桌面应用程序。问题是它无法显示我想要打印的完整设计。如果有人可以帮忙,我会感谢你.. 我面临的另一个问题是我不能使用" 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

0 个答案:

没有答案