首页
社区
课程
招聘
[求助]汇编里如何对局部变量进行字符串赋值
发表于: 2013-3-29 22:11 9754

[求助]汇编里如何对局部变量进行字符串赋值

2013-3-29 22:11
9754
如下面的代码:

_WinProc proc
                local @szText

                ;在这里如何将字符串"user32.dll"赋给@szText啊?
_WinProc endp

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 53
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
局部变量的作用域是单个子程序,在进入子程序的时候,通过修改栈指针esp来预留出需要的空间,在用ret指令返回主程序之前,同样通过恢复esp丢弃这些空间,这些变量就随之无效了.
显然,局部变量是无法在定义的时候指定初始化值的,对局部变量的初始化一般在子程序中同指令完成.

定义格式:
local   变量名1[[重复次数]] [:类型], 变量名2[[重复次数]] [:类型]…
local伪指令必须紧接在子程序定义的伪指令proc后,其他指令开始前.
例:
Local    loc1[1024]: Byte       ;1024长的字节数组
Local    loc2                   ;默认为dword类型的局部变量
Local    loc3:WNDCLASS          ;一个结构体类型
2013-3-30 20:44
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这些我知道,我想知道的是具体的实例是怎么写的
2013-3-31 18:36
0
雪    币: 55
活跃值: (531)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
写个数组吧,字符串一般都是静态的常量。
2013-4-1 13:04
0
雪    币: 55
活跃值: (531)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
mov eax,addr szText
mov byte ptr [eax],'u'的编码
inc eax
mov byte ptr [eax],'s'的编码。
2013-4-1 13:08
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
invoke RtlMoveMemory,offset szText,addr @szBuf,sizeof szText
2013-4-3 05:22
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=hrpirip;1160378]mov eax,addr szText
mov byte ptr [eax],'u'的编码
inc eax
mov byte ptr [eax],'s'的编码。[/QUOTE]

这个也知道,可是字符串要在子程序里定义,如何定义szText呢?好像要报错啊...
2013-4-3 07:34
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我想知道的是如何把字符串放进szText里面,譬如'user32.dll'这个字符串
2013-4-3 07:35
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
.const
szText db "user32.dll",0
.code
Test proc
local @szBuf[64]
invoke RtlMoveMemory,addr szText,addr @szBuf,sizeof szText
ret
Test endp
2013-4-3 08:16
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=誓言剑;1161054].const
szText db "user32.dll",0
.code
Test proc
local @szBuf[64]
invoke RtlMoveMemory,addr szText,addr @szBuf,sizeof szText
ret
Test endp...[/QUOTE]

这样我知道,我指的是将字符串放在子程序里,这样就可以只用几个简单的参数就能完成一个独立的功能,如果字符串放在外面的话,那对子程序就有了限制
2013-4-3 21:08
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
.code
Test proc
local @szBuf[64]
.const
szText db "user32.dll",0
.code
invoke RtlMoveMemory,addr szText,addr @szBuf,sizeof szText
ret
Test endp
2013-4-4 10:22
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=誓言剑;1161493].code
Test proc
local @szBuf[64]
.const
szText db "user32.dll",0
.code
invoke RtlMoveMemory,addr szText,addr @szBuf,sizeof szText
ret
Test end...[/QUOTE]

在子程序里用数据段会不会出问题啊?还有就是如果外面已经定义了这个段怎么办啊?还有就是善后工作,需要清理内存什么的吗?
2013-4-4 18:43
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
回去好好看书,搞懂基本概念再来写程序,好吗?
Google就在那,不想看书就去自己找
2013-4-5 04:13
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
编译器没有提供这样的功能,5L的方案是正解,可以解决楼主的问题
另外"user32.dll"占10个字节,所以应该是local szText[10]:byte
2015-4-26 21:08
0
雪    币: 661
活跃值: (1652)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
15
myproc proc
jmp bbb
aaa:
db "kernel32.dll",0
bbb:
invoke messagebox,0,addr aaa,0,0
ret

myproc endp
2015-6-30 00:50
0
游客
登录 | 注册 方可回帖
返回
//