首页
社区
课程
招聘
masm32\m32lib目录下strlen.asm文件中的疑惑[求助]
发表于: 2006-10-3 10:45 6495

masm32\m32lib目录下strlen.asm文件中的疑惑[求助]

2006-10-3 10:45
6495
在masm32\m32lib目录下发现strlen.asm文件,有一段内容如下

.....................;我省略了一部分
StrLen proc item:DWORD

    mov     eax,[esp+4]             ; get pointer to string
    push    ebx
    lea     edx,[eax+3]             ; pointer+3 used in the end

.....................;我省略了一部分

由于初学WIN32汇编,实在不知
mov     eax,[esp+4]取的是什么?
不是说语言类型为stdcall的子程序编译器会在前面加上
PUSH BP
MOV  BP,SP
后面加上leave的吗?
那执行invoke StrLen,item后堆栈的内容就是

|BP      |<----SP
|返回地址|
|item    |

mov     eax,[esp+4]就是取的返回地址了啊?
又怎么会是 get pointer to string

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
Stdcall会把参数从右向左压栈, 然后由被调者(子程序)清除参数
和push ebp;mov ebp, esp;不同, 后者是建立栈帧, 不是必须的
2006-10-4 10:12
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
3
最初由 thebutterfly 发布
Stdcall会把参数从右向左压栈, 然后由被调者(子程序)清除参数
和push ebp;mov ebp, esp;不同, 后者是建立栈帧, 不是必须的


我可以这样理解吗?如果子程序中定义了局部变量,那么编译器就会在子程序中加上
PUSH EBP
MOV  EBP,ESP
...........
LEAVE
????????
若没定义局部变量那么编译器就不会加?
2006-10-4 19:09
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
对, 如果没有定义局部变量, 那么编译器就不会建立栈帧
或者如果用
OPTION PROLOGUE:NONE
伪指令的话也不会
2006-10-4 19:17
0
游客
登录 | 注册 方可回帖
返回
//