首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

关于addr和offset的有关问题

2012-02-14 
关于addr和offset的问题FindWindow,addrszDestClass,NULLwsprintf,addrszBuffer,addrszStart,addrszTextSe

关于addr和offset的问题
FindWindow,addr   szDestClass,NULL
wsprintf,addr   szBuffer,addr   szStart,addr   szText
SendMessage,hWnd,WM_SETTEXT,0,addr   szText
中为何用的都是addr   它们之后的变量都是全局变量啊
为何不用offset?

以下是源代码

.386
.model   flat,stdcall
option   casemap:none
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
;   Include   文件定义
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
includewindows.inc
includeuser32.inc
includelibuser32.lib
includekernel32.inc
includelibkernel32.lib
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
;   数据段
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
.data
hWnddd?
szBufferdb256   dup   (?)

.const
szCaptiondb 'SendMessage ',0
szStartdb 'Press   OK   to   start   SendMessage,   param:   %08x! ',0
szReturndb 'SendMessage   returned! ',0
szDestClassdb 'MyClass ',0;目标窗口的窗口类
szTextdb 'Text   send   to   other   windows ',0
szNotFounddb 'Receive   Message   Window   not   found! ',0
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
;   代码段
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
.code
start:
invokeFindWindow,addr   szDestClass,NULL
.ifeax
movhWnd,eax;找到目标窗口则发送消息
invokewsprintf,addr   szBuffer,addr   szStart,addr   szText
invokeMessageBox,NULL,offset   szBuffer,offset   szCaption,MB_OK
invokeSendMessage,hWnd,WM_SETTEXT,0,addr   szText
invokeMessageBox,NULL,offset   szReturn,offset   szCaption,MB_OK
.else
invokeMessageBox,NULL,offset   szNotFound,offset   szCaption,MB_OK
.endif
invokeExitProcess,NULL
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >


endstart


[解决办法]
因为addr表示传递的是变量的指针(因此,我认为用offset代替也是可以的),可以被修改后作为输出参数使用,因为这些过程是在主过程之中被调用的,所以他们必须是全局变量,因为主过程内似乎不能使用局部变量,另外,如果子过程调用这些过程,理论上局部变量也是可以的,除非编译器不支持“addr 局部变量”这种格式,这种情况是可能发生的,因为毕竟局部变量是在堆栈上创建的,具有动态性,而且是用SS:SP来寻址,和全局变量有很大的差异。

热点排行