魔诀 发表于 2014-7-9 08:38:41

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比较是错误的。
有人给解释一下吗?

メ㊣逆ご帅☆ 发表于 2014-7-9 08:38:42

.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-12 20:25:42

メ㊣逆ご帅☆ 发表于 2014-7-11 21:36
.elseif   eax == WM_COMMAND
            mov      eax, wParam
            movzxeax, ax


谢谢你的回答。我想我明白了。回答的很好,一看就开窍了。

魔诀 发表于 2014-7-12 20:26:50

メ㊣逆ご帅☆ 发表于 2014-7-11 21:36
.elseif   eax == WM_COMMAND
            mov      eax, wParam
            movzxeax, ax


谢谢你的回答。我想我明白了。回答的很好,一看就开窍了。
页: [1]
查看完整版本: eax == IDM_BIG 这样比较没有错误吗?