首页
社区
课程
招聘
[旧帖] [求助]汇编局部变量的问题,求解啊 0.00雪花
发表于: 2010-11-21 01:30 1203

[旧帖] [求助]汇编局部变量的问题,求解啊 0.00雪花

2010-11-21 01:30
1203
本人是新手,在练习汇编代码的各种写法,遇到个问题,不明白怎么回事,请帮助解答一下,谢谢~

         format PE GUI 4.0

	 include 'win32a.inc'


	 SciCalc      db      'SciCalc', 0
	 hCalc        dd      ?
	 ;@Wintext     db      ?


	 entry $

	        invoke FindWindow, SciCalc, NULL
		mov    [hCalc], eax

		stdcall GetCaption, [hCalc]

		invoke MessageBox, 0, eax, SciCalc, 0

		invoke ExitProcess, 0


	 proc GetCaption hCalcp

	        local @Wintext : BYTE     ;换成全局   @Wintext     db      ?   编译通过

		invoke SendMessage, [hCalcp], WM_GETTEXT, MAX_PATH, @Wintext

		mov    eax, @Wintext

		ret

	 endp


	 data import

	        library user32, 'user32.dll', \
		        kernel32, 'kernel32'

		import user32, \
		       FindWindow, 'FindWindowA', \
		       SendMessage, 'SendMessageA', \
		       MessageBox, 'MessageBoxA'

		import kernel32, \
		       ExitProcess, 'ExitProcess'

         end data


以上代码是获取计算器窗口名的,编译不通过。
我想封装独立过程,所以不想用全局变量,db 等于 byte的啊,哪里错了?求解

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
什么编译器???
什么错误?

@Wintext 是个 byte 型 你确定 全局变量 时 mov eax,@Wintext  正确编译?
2010-11-21 02:28
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
fasm编译器,提示的是这个局部变量错误。弄成全局的就通过,程序运行也正常。
2010-11-21 11:18
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
fasm 的话 没用过 不过 在 MASM 里 的话 mov eax,@Wintext  
会错误

你把 @Wintext  改成dword 试试
2010-11-21 12:15
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
贴上高级语言<Delphi>的过程
function GetCaption(hWnd: LongWord): string;
var
  szWindowText: array[0..254] of Char;
begin
  SendMessage(hWnd, WM_GETTEXT, MAX_PATH, Integer(@szWindowText[0]));
  Result := szWindowText;
end;


我是按照这个在汇编里写过程的,请帮我写成masm或fasm看看,我看看是怎么来写的,谢谢了。
2010-11-21 13:22
0
雪    币: 590
活跃值: (177)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
6
.data ?
szWindowText        db  dup(256)

invoke        SendMessage,hWnd,WM_GETTEXT,MAX_PATH,addr szWindowText

或者使用GetWindowText
2010-11-21 13:36
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不要使用全局的啊,我想的是写一个proc过程,独立的。现在我在学习代码格式
2010-11-21 13:42
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
8
首先讲修改你这个程序代码让它编译通过
   proc GetCaption hCalcp

    local @Wintext:BYTE    ;换成全局   @Wintext     db      ?   编译通过
   lea eax,[@Wintext]
    push eax
    invoke SendMessage, [hCalcp], WM_GETTEXT, MAX_PATH,eax
    pop eax
    ret

   endp


再讲你的错误

#define WM_GETTEXT 0x000D
Parameters
wParam
The maximum number of characters to be copied, including the terminating null character.

ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to conversion from ANSI to Unicode.

lParam
A pointer to the buffer that is to receive the text.
  

你这里有buffer吗?你应该将@Wintext的定义修改为

local @Wintext[260]:BYTE

因为MAX_PATH通常情况下被定义为260

要想学好编程,首先得打好基础,要不然就搞不清楚为神马,搞出来的都是浮云
2010-11-21 14:02
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
刚才 下载 了fasm 真是另一番天地啊-- 呵呵 挺有意思的

与 MASM 语法 有许多不同

比如

mov   eax,@Wintext  ;把变量@Wintext 的地址 送 eax ,人家fasm就是这种语法 变量名就是 变量的地址
push  @Wintext      ;就是 把变量 地址 压栈

变量名等价于 地址
而 MASM 中 上面的相当于 mov eax,@Wintext[0]
是内存单元的内容
fasm这样安排挺好的 省的 MASM 里总有人搞不清变量名到底是啥

还有 这个@Wintext 是局部变量 的 时候 不能用 mov 直接 获得 地址的
push @Wintext  也是错误的
这样的 这也就是它的 语法规则吧 --

那就变通一下啊

这样  lea  eax,[@Wintext]
这样  eax 就是 变量的地址了嘛

	 proc GetCaption hCalcp

	        local @Wintext [MAX_PATH]: BYTE     

		lea  eax,[@Wintext]
		invoke SendMessage, [hCalcp], WM_GETTEXT, MAX_PATH,eax

		lea  eax,[@Wintext] 	;不能用 mov (mov    eax, @Wintext)

		ret

另 缓冲区 @Wintext 要够大 不要只是一个 byte 要不然-- 溢出
2010-11-21 14:41
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
恩,谢谢指点,我也是新手,正在学习。
以下代码我是这样理解的,是否正确?

	 proc GetCaption hCalcp

	        local @Wintext[260] : BYTE

		lea    eax, [@Wintext]   ;获取@Wintext的位置
		push   eax     ;这个push是为了pop平衡,没什么作用。

		invoke SendMessage, [hCalcp], WM_GETTEXT, MAX_PATH, eax
		pop    eax      ;SendMessage函数最后一个参为是push eax  我们取出来当返回值。

		ret

	 endp
2010-11-21 15:06
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
push   eax     ;这个push是为了保存此时eax的值即变量地址
    invoke SendMessage, [hCalcp], WM_GETTEXT, MAX_PATH, eax
    pop    eax      ;取出刚才保存的值到eax
2010-11-21 15:21
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=风萧兮;892789]push   eax     ;这个push是为了保存此时eax的值即变量地址
    invoke SendMessage, [hCalcp], WM_GETTEXT, MAX_PATH, eax
    pop    eax      ;取出刚才保存的值到eax[/QUOTE]

哦,谢谢。对概念还是有点模糊,请问你的QQ是多少,以后方便交流啊。
2010-11-21 15:34
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不是很懂,学习中
2010-11-21 17:50
0
游客
登录 | 注册 方可回帖
返回
//