| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1196 人关注过本帖
标题:win32汇编invoke伪指令的问题,究竟是不是编译器的bug?
只看楼主 加入收藏
xietao1233
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2011-9-19
结帖率:100%
收藏
已结贴  问题点数:0 回复次数:4 
win32汇编invoke伪指令的问题,究竟是不是编译器的bug?
同样的函数,为什么使用invoke时L2-L1结果是10,而用call时L2-L1得到的结果是5,这个5才是大家认知的结果?
程序代码:
.386
.Model Flat, StdCall
Option Casemap :None
Include        windows.inc
Include        kernel32.inc
IncludeLib    kernel32.lib
Include        user32.inc
IncludeLib    user32.lib
.DATA
    lpFomat    db "%lu",0
.DATA?
    hInstance        dd ?
    AA    byte 16 dup (?)
    BB    byte 16 dup (?)
.CODE
L1:
call L2    ;向后面标号CALL时L2-L1=10,向前面标号CALL时L2-L1=5,为什么,怎么解决?
L2:
pop eax
ret

START:
;原始写法----------------------------------------------------
    push L2-L1                                ;这里L2-L1算出的是 5
    push offset lpFomat
    push offset AA
    call wsprintf
    add esp,0Ch
;伪指令invoke写法--------------------------------------------
    invoke wsprintf,offset BB,offset lpFomat,L2-L1    ;这里L2-L1算出的是 10
   
    invoke MessageBox,0,offset AA,offset BB,0        ;为了直观用信息框显示
    invoke ExitProcess,0
END START
再贴上反汇编的代码:
程序代码:
00401000   .  E8 00000000   call    00401005
00401005  /$  58            pop     eax
00401006  \.  C3            retn
00401007 >/$  68 05000000   push    5                      ; /<%lu> = 5               直接L2-L1,结果是5
0040100C  |.  68 00304000   push    00403000                         ; |Format = "%lu"
00401011  |.  68 08304000   push    00403008                         ; |s = test1.00403008
00401016  |.  E8 3B000000   call    <jmp.&USER32.wsprintfA>          ; \wsprintfA
0040101B  |.  83C4 0C       add     esp, 0C
0040101E  |.  68 0A000000   push    0A                               ; /<%lu> = A (10.)
00401023  |.  68 00304000   push    00403000                         ; |Format = "%lu"
00401028  |.  68 18304000   push    00403018                         ; |s = test1.00403018
0040102D  |.  E8 24000000   call    <jmp.&USER32.wsprintfA>          ; \wsprintfA
00401032  |.  83C4 0C       add     esp, 0C                                        ; invoke这里计算的是10
00401035  |.  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
00401037  |.  68 18304000   push    00403018                         ; |Title = ""
0040103C  |.  68 08304000   push    00403008                         ; |Text = ""
00401041  |.  6A 00         push    0                                ; |hOwner = NULL
00401043  |.  E8 14000000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
00401048  |.  6A 00         push    0                                ; /ExitCode = 0
0040104A  \.  E8 01000000   call    <jmp.&KERNEL32.ExitProcess>      ; \ExitProcess


 










[ 本帖最后由 xietao1233 于 2011-9-27 16:59 编辑 ]
搜索更多相关主题的帖子: 编译器 伪指令 
2011-09-27 16:55
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
好问题 不过我也不知道为啥

你去aogo的论坛问问 www. 那的高手多 或者看雪也行 呵呵
2011-09-27 19:04
编程的乐趣
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:229
专家分:1027
注 册:2011-4-4
收藏
得分:0 
?
2011-09-27 19:06
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
跟高手交流了一下

1 是bug 某些版本异常 就好像masm一个比较经典的例子一样

mov ax,[0001] 编译成了mov ax,1   、、、、、

2 masm 快走向死亡了 32位汇编也快成为历史了

masm不会独挡一面了

3 你发现的这个问题很好
2011-09-27 19:29
chinasmu
Rank: 2
等 级:论坛游民
帖 子:50
专家分:22
注 册:2009-10-31
收藏
得分:0 
回复 4楼 zklhp
32位汇编成为历史?
原因呢?
我还在学习32位汇编。。。
2011-10-16 15:08
快速回复:win32汇编invoke伪指令的问题,究竟是不是编译器的bug?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019153 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved