首页
社区
课程
招聘
[求助]非常简单的32位汇编问题
发表于: 2008-1-24 17:56 5135

[求助]非常简单的32位汇编问题

2008-1-24 17:56
5135
这几天都在学习32位汇编
书是罗云彬的windows下32位汇编程序设计
今天学到了资源设计中的对话框控件
有几事不明 google无果 还请赐教
mov        eax,hBmp1
xchg        eax,hBmp2
mov        hBmp1,eax
invoke    SendDlgItemMessage,hWnd,IDC_BMP,STM_SETIMAGE,IMAGE_BITMAP,eax
意思就是换图片 不是很理解
第一句是把hbmp1是图片句柄放入eax里 第二句是交换2个的位置 那现在eax里是什么呢?
第三句又是什么意思呢?

第二个问题
invoke        GetWindowLong,hWnd,GWL_STYLE
and        eax,not WS_THICKFRAME
invoke        SetWindowLong,hWnd,GWL_STYLE,eax
.elseif        ax ==        IDC_THICKFRAME
invoke        GetWindowLong,hWnd,GWL_STYLE
or        eax,WS_THICKFRAME
invoke        SetWindowLong,hWnd,GWL_STYLE,eax
意思就是换风格 单选按钮 想问一下这里的and 和or是什么意思 有什么作用呢

第三个问题
.elseif        ax ==        IDC_TITLETEXT
shr        eax,16 ;这里这个右移16位有什么作用呢?

知道这些问题很简单....
希望各位举手之间就给回了吧 困扰偶一天了 谢谢各位~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
第一很简单,就是循环互换hBmp1和hBmp2的值的放置位置。这样做就可以保证做到第一显示第一个图像,第二次显示第二个图像,第三次又重新显示到第一个图像。
第二、and  eax,not WS_THICKFRAME操作是去掉WS_THICKFRAME风格标志,or  eax,WS_THICKFRAME是加上WS_THICKFRAME风格标志
第三、shr eax,16的操作是将eax的高16位转到低16位。如eax == 0ffff0000h的值,shr eax,16之后eax == 0000ffffh,就是将ffff的值从高处转到低处。
2008-1-24 18:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢斑竹~爱死你了
此贴不结贴 以后遇到问题就不从新开贴了
2008-1-24 18:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
.if        eax ==        ID_TIMER1
inc        dwCount
mov        eax,dwCount
and        eax,1
inc        eax
invoke        LoadIcon,hInstance,eax
invoke  SendDlgItemMessage,hWnd,IDC_SETICON,STM_SETIMAGE,IMAGE_ICON,eax
又来麻烦大家了 请问这段代码是计时器的一段代码
用途是每一段时间换个图标
这里这个inc是自加1and是与
dwCount是未赋初始值的变量
组合在一起就糊涂了 他是怎么实现每一次就换个图标的呢
2008-1-25 16:06
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
and eax,1的作用是让eax恒等于0和1(当dwCount是奇数是eax==1,是偶数时eax==0),再inc eax则是让eax恒等于1和2。而程序的Icon资源ID则是1和2,这样做可以让LoadIcon载入的ID1和2的Icon资源轮流载入变换图标。
2008-1-25 16:24
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
看你的问题,可以看出你对汇编的逻辑计算指令不太熟悉,建议你先学习一下逻辑计算指令的运算方式和运算结果,当你掌握这些之后,上面的问题就不属于问题了。
2008-1-25 16:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢斑竹 基础不劳果然不行
我还是学一下16位的再来asm32吧
打扰了
2008-1-25 16:33
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
不学16位的汇编应该不影响学习32位的汇编,他们比较共通的就是指令的作用是差不多的。所以,不管你是学习16位汇编还是32位汇编,指令的功能都应该理解。
2008-1-25 16:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
.elseif        [ebx + NMHDR.code] == TBN_GETBUTTONINFO ;获得工具栏按钮信息
assume        ebx:ptr TBNOTIFY ;将edx 定义为TBNOTIFY结构指针变量
mov        eax,[ebx].iItem ;把 iItem 按钮的位置索引放入eax中
.if        eax < NUM_BUTTONS ;当小于按钮总数时
mov        ecx,sizeof TBBUTTON  
mul        ecx ;乘
add        eax,offset stToolbar
invoke        RtlMoveMemory,addr [ebx].tbButton,eax,sizeof TBBUTTON

再次麻烦大大了 想问2个问题 一个是
mov        ecx,sizeof TBBUTTON  
mul        ecx ;乘
add        eax,offset stToolbar
这段指令有什么作用呢?
第二个是RtlMoveMemory这个函数的的作用是什么呢 移动内存?
把什么移到了什么里 后面那些参数分别代表什么呢?
实在抱歉 API里找不到..
2008-1-31 12:24
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
mov  ecx,sizeof TBBUTTON  
mul  ecx ;乘
add  eax,offset stToolbar
上面一段的意思是取出TBBUTTON[eax*sizeof TBBUTTON]结构数组的某个按钮的TBBUTTON结构。

RtlMoveMemory函数是将来源地址的数据拷贝到目得地缓冲中。
VOID
NTAPI
RtlMoveMemory (
   VOID UNALIGNED *Destination, // 到目得地
   CONST VOID UNALIGNED *Source, // 来源
   SIZE_T Length // 来源数据长度
   );
2008-1-31 14:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
.elseif        eax ==        WM_ACTIVATE
mov        eax,wParam
.if        (ax ==        WA_CLICKACTIVE ) || (ax == WA_ACTIVE)
invoke        SetFocus,hWinEdit
.endif
请问这段代码代表什么意思呢 再次麻烦了
2008-2-1 17:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不用了~谢谢各位
WM_ACTIVE的消息参数

wParam的低阶word指示窗口是被激活还是失去激活:

WA_ACTIVE,被鼠标点击以外的方法激活;

WA_CLICKACTIVE,由鼠标点击激活;

WA_INACTIVE,失去激活;
2008-2-1 17:07
0
游客
登录 | 注册 方可回帖
返回
//