我有一个简单程序的示例代码,用于检查鼠标位置,记下X和Y坐标,并检查鼠标左键是否已关闭。
.386
.model flat, stdcall
option casemap :none
include bones.inc
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke InitCommonControls
invoke DialogBoxParam, hInstance, IDD_MAIN, 0, offset DlgProc, 0
invoke ExitProcess, eax
DlgProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,uMsg
.if eax == WM_INITDIALOG
.elseif eax == WM_LBUTTONDOWN ; when left button is down
invoke SetDlgItemText, hWin, 1001, addr Msg1
.elseif eax == WM_LBUTTONUP ; when left button is up
invoke SetDlgItemText, hWin, 1001, addr Msg2
.elseif eax == WM_MOUSEMOVE
xor ecx, ecx ; clear ecx register
mov cx, WORD PTR lParam ; copy low-word of lParam to cx <---- this is line that is bothering me
invoke SetDlgItemInt, hWin, 1002, ecx, FALSE ; set integer in control
xor ecx, ecx ; zerujemy rejestr ecx
mov cx, WORD PTR lParam+2 ; copy high-word of lParam to cx <--- this line is bothering me as well
invoke SetDlgItemInt, hWin, 1003, ecx, FALSE ; set integer in control
.elseif eax == WM_CLOSE
invoke EndDialog, hWin, 0
.endif
xor eax,eax
ret
DlgProc endp
end start
这是我在第一行感兴趣的断点上的ollydebugger屏幕截图:
我的问题是:
1)这一行究竟是什么:MOV CX,WORD PTR SS:[EBP + 14]? 是这样的:复制到CX寄存器的单元格号EBP + 14的值?所以,如果EBP显示1号细胞,那么源细胞数是15?
2)因此,在我的情况下,如果截图:EBP值是(0001 1001 1111 1011 1011 0000)(19FBB0h)是低字(0000 0000 0001 1001)和高字(1111 1011 1011 0000)?如果不是,我怎么能学到这个?
3)作者如何知道正确的值分别是高低字?
4)为什么mov cx,WORD PTR lParam + 2?这个+2困扰着我。如果lParam是DWORD(32位),为什么偏移量是+2?高句子不应该是+16吗?
提前谢谢
编辑:如果需要,这是bones.inc文件:
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc ;windows common controls
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib ;windows common controls
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.const
IDD_MAIN equ 1000
.data
Msg1 db "Lewy przycisk myszy jest wciśnięty",0
Msg2 db "Lewy przycisk myszy jest zwolniony",0
.data?
hInstance dd ?
答案 0 :(得分:4)
ebp=19FBB0h
ebp+14h=19FBC4h
004200CFh
,其内容为</a>
。