标题:汇编中怎么样才可以写出像__declspec(nake)那样的函数
只看楼主
Otoboku
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-3-27
 问题点数:0 回复次数:7 
汇编中怎么样才可以写出像__declspec(nake)那样的函数
我使用ML是
Microsoft (R) Macro Assembler Version 6.14.8444
有些需要需要写一些完全控制的函数过程,换句话说,过程中不能有自动生成的任何代码
下边是我写的一个函数,要求连push eax都不能有
TestProc1 proc uses eax
    jmp TestProc
TestProc1 endp



搜索更多相关主题的帖子: 怎么样 Microsoft 
2012-03-27 21:51
Otoboku
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-3-27
得分:0 
乱搞找到方法了,直接call 行号就ixng
2012-03-27 22:09
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
uses eax 会自动生成push pop来保护寄存器

如果写成函数也会自动生成堆栈处理的代码段

你这个call行号的方法不错 呵呵
2012-03-28 09:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
还有 我发现你的标题貌似有错。。
2012-03-28 09:52
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
__declspec(naked)
2012-03-28 09:53
GoldenSpider
Rank: 2
等 级:论坛游民
威 望:3
帖 子:17
专家分:77
注 册:2010-5-15
得分:0 
程序代码:
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE

    align 16

arrget proc arr:DWORD,indx:DWORD

    mov eax, [esp+4]         ; write array adress to EAX
    mov ecx, [esp+8]         ; write required index to ECX

    mov eax, [eax+ecx*4]     ; write array member address to EAX
    ret 8

arrget endp

OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef 

还有更简单,更自由的形式(个人比较喜欢):
程序代码:
    align 16
arrget:
    mov eax, [esp+4]         ; write array adress to EAX
    mov ecx, [esp+8]         ; write required index to ECX

    mov eax, [eax+ecx*4]     ; write array member address to EAX
    ret 8

以上对函数arrget的调用是一样的。
2012-04-06 11:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用GoldenSpider在2012-4-6 11:22:57的发言:

OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
 
    align 16
 
arrget proc arr:DWORD,indx:DWORD
 
    mov eax, [esp+4]         ; write array adress to EAX
    mov ecx, [esp+8]         ; write required index to ECX
 
    mov eax, [eax+ecx*4]     ; write array member address to EAX
    ret 8
 
arrget endp
 
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
还有更简单,更自由的形式(个人比较喜欢):    align 16
arrget:
    mov eax, [esp+4]         ; write array adress to EAX
    mov ecx, [esp+8]         ; write required index to ECX
 
    mov eax, [eax+ecx*4]     ; write array member address to EAX
    ret 8
以上对函数arrget的调用是一样的。
膜拜大牛
2012-04-06 19:15
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
得分:0 
回复 6楼 GoldenSpider
厉害

最基础的往往是你最容易忽略的!
2012-04-07 12:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-364513-1-1.html




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

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