移位指令在汇编Win32消息处理中的一些问题

大家在处理有些字节拼装的消息时,一定是用Shr等指令来移位,这里有一个小问题,要注意:

如WM_MOUSEWHEEL消息,它的wParam的高字节保存了当前的鼠标滚动的方向,-120表示向上滚动,120表示向下滚动,此时,这样处理是错的:

mov eax,wParam
shr eax,16
.if eax==-120
... ..

为什么?因为移位指令移位的同时,把最高位也移动了,此时,符号位到了ax的最高位,结果判断eax自然总是正数,此时,应该直接判断ax,或使用扩展指令。如:

... ...
.if ax==-120

就行了,这一般只在高位或低位会为负的情况下注意,因为正数移位后判断eax仍然行得通。

时间: 2024-11-02 07:37:48

移位指令在汇编Win32消息处理中的一些问题的相关文章

win32程序中简单应用mfc

今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入<afx.h>就好了.注意这个时候如果出来 #ifdef _DLL #ifndef _AFXDLL #error Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please

c++-win32编程中基于对话框的程序和普通的窗口程序有什么区别?

问题描述 win32编程中基于对话框的程序和普通的窗口程序有什么区别? 很疑惑,既然窗口可以直接编写,为什么还要基于对话框来写程序? 解决方案 这就好比你将滚动条用于窗口一部分和使用滚动条控件,效果最终一样,但是后者Windows会为你处理一些鼠标和键盘上的逻辑,使得编程更容易,对话框中一般使用大量控件,Windows会为你处理比如输入焦点转移.键鼠等逻辑.

在WIN32 DLL中使用MFC

最近用WIN32 DLL,为了方便要用到MFC的一些库,又不想转工程,就网上找了很多方法,发现没有详细的介绍,有的也行不通,现在成功在WIN32 DLL中使用了MFC,记录一下以防以后用到忘记   一.修改预编译头文件(stdafx.h) 在stdafx.h文件中添加下面代码,包含一些MFC的头文件,这些可以在一个MFC工程中复制过来 1 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将为显式的 2 3 #include

c++-关于win32 api中宏定义有一处不理解

问题描述 关于win32 api中宏定义有一处不理解 #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 这段代码我知道:宏定义,用KEYDOWN(vk_code)替代((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 但是不可思议的来了,它直接这样写: KEYDOWN(VK_UP) 我可以理解这是什么意思,就是说((GetAsyncKeyState(VK_

在WIN32 DLL中使用MFC库遇到的问题

今天写了一个DLL,DLL中用到的一个类里用到的MSXML的COM组件,所以在DLL中要包含afx.h头文件,也就不可避免的要用到MFC的类库了,但在编译时出现了错误:mfcs42d.lib(dllmodul.obj) : error LNK2005:_DllMain@12 already defined in NetDriverConfig.obj, 在http://topic.csdn.net/t/20010911/10/281452.html 处的贴子里找到了以下回答,试了一个原来是文件里

从汇编看c++中的多态详解_C 语言

在c++中,当一个类含有虚函数的时候,类就具有了多态性.构造函数的一项重要功能就是初始化vptr指针,这是保证多态性的关键步骤. 构造函数初始化vptr指针 下面是c++源码: class X { private: int i; public: X(int ii) { i = ii; } virtual void set(int ii) {//虚函数 i = ii; } }; int main() { X x(1); } 下面是对应的main函数汇编码: _main PROC ; 16 : in

一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数

Windows是一个消息驱动的操作系统,在系统中发生的所有消息均需要通过消息处理过程(或叫窗口过程)进行处理.由于C++给我们在程序设计中带来更多的灵活性(如继承.重载.多态等),所以我们都希望能够使用C++的类来封装Windows中的窗口过程函数,但是Windows规定了窗口过程函数必须定义为一个全局函数,也就是说需要使用面向过程的方法来实现,为了使用面向对象的技术来实现消息处理,我们必须另辟它径.目前我们在网络上见得比较多的方式是使用Thunk将即将传递给窗口过程的第一个参数(HWND hW

win32汇编-WIN32汇编键盘钩子截获全部键盘

问题描述 WIN32汇编键盘钩子截获全部键盘 普通的键盘钩子只能截获普通的键盘操作,但是不能截获到shift等系统键,求问怎么样截获所有的键盘操作 解决方案 http://www.cnblogs.com/zudn/archive/2010/12/15/1906374.html 解决方案二: win32程序测试键盘钩子win32程序测试键盘钩子

vba win32 api-vba 中调用win 32 的api接口

问题描述 vba 中调用win 32 的api接口 ※ 下面问题本人也在网上找了很久的答案,可是均不行,希望各位看官能帮帮忙.谢谢. 其中 i 找了win32的返回值为字符串的win32 api的VBA接口调用 => 测试成功,方法这里就不说了 i 找了win32通过参数返回字符串的win32 api的VBA接口调用 =>测试成功,方法这里就不说了 i 找了通过参数返回字符串数组的自定义C的api的VBA接口调用 =>没测试 例如: C的test.dll接口: void test(cha