| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1196 人关注过本帖
标题:win32汇编invoke伪指令的问题,究竟是不是编译器的bug?
取消只看楼主 加入收藏
xietao1233
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2011-9-19
结帖率:100%
收藏
已结贴  问题点数:0 回复次数:0 
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
快速回复:win32汇编invoke伪指令的问题,究竟是不是编译器的bug?
数据加载中...
 
   



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

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