eax == IDM_BIG 这样比较没有错误吗?
;资源文件定义如下:#include <resource.h>
#define IDM_BIG 0x2201 ;这里定义的IDM_BIG应该是16位的吧??
IDM_MAIN menu discardable ;定义菜单
BEGIN
popup "图标和光标(&I)"
BEGIN
menuitem "大图标(&G)", IDM_BIG
END
END
;在程序中又有如下代码:
.elseif eax == WM_COMMAND
mov eax, wParam
movzxeax, ax
.if eax == IDM_BIG ;这里的eax是32位的吧?32位的与16位的可以进行比较吗?
上述程序是书中的源码,我把里面的 movzx eax, ax 去掉,把后面的eax改成ax, 变成 ax == IDM_BIG 也能通过编译并执行,
好像和原来并没有什么区别。
不管movzx对eax执行了什么操作,eax总是32位的吧?我总觉得32位的eax与16位的IDM_BIG比较是错误的。
有人给解释一下吗?
.elseif eax == WM_COMMAND
mov eax, wParam
movzxeax, ax
.if eax == IDM_BIG
movzx eax,ax指令就是把EAX寄存器的低16位赋值为AX的值。高位填充0
所以
movzx eax,ax
.if eax==IDM_BIG等价于直接
.if ax==IDM_BIG,区别就是eax的高位被改变了
你定义IDM_BIG 为0x2201
eax==IDM_BIG在编译的时候会被编译器替换成
eax==0x2201
这里就是你要的问题了,eax可以为1吧。那eax应该就可以与1进行比较了
比如.if eax==1 .if eax==0x1 .if eax==0x2 .if eax==2
.if eax==0x10
.if eax==16
红色标记的两句是等价的
这里只是eax同数值进行比较而不是eax同其他寄存器的数值进行比较.if eax==ax像这样就不行了
由于不清楚楼主是哪里不清楚。所以回答了很多东西。楼主自己看下
メ㊣逆ご帅☆ 发表于 2014-7-11 21:36
.elseif eax == WM_COMMAND
mov eax, wParam
movzxeax, ax
谢谢你的回答。我想我明白了。回答的很好,一看就开窍了。 メ㊣逆ご帅☆ 发表于 2014-7-11 21:36
.elseif eax == WM_COMMAND
mov eax, wParam
movzxeax, ax
谢谢你的回答。我想我明白了。回答的很好,一看就开窍了。
页:
[1]