VC6中内嵌汇编的问题 __ASM{} ?

housisong 2002-08-24 09:46:09
VC6中支持内嵌汇编
如:

long double Hypot(long double x,long double y)
{
__asm
{
fld x
fmul st,st(0)
fld y
fmul st,st(0)
faddp st(1),st
fsqrt
}
}
// 该函数完成z=sqrt(x*x+y*y)功能

在Delphi中支持全汇编的函数(和过程)
但在VC6中我想写一个全汇编的函数,应该怎样办啊!
上面的程序vc6编译时会形成一些接口指令:
PUSH ebp
mov ebp,esp
.......

接口部分和出口部分还有很多不必要的指令,我想自己来形成接口部分,望高手指教!

...全文
223 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhk1124 2002-09-08
  • 打赏
  • 举报
回复
我在别的社区发过这贴
我COPY过来MASM 5.1以上与C混合编程的程序头

.MODEL SMALL,C ;小模式,用于从C调用
.CODE
.STACK ;如只给C调用可以不用
EXTERN _Cprog: NEAR ;同上
EXTERN ans: DWORD ;说明ans是long int 的变量

PUBLIC Cfuncion ;说明能被C调用
Cfuncion PROC USES si di,x:WORD,y:WORD ;如果要被C调用而有二个参数时
LOCAl u ;说明局部变量 如果要被C调用时用要用局部变量时说明
;寄存器自动保存
MOV AX,WORD PTR [BP+2] ;==X 这是SMALL模式如是中模式和

;大模式第一个参数在[BP+4]
ADD AX,WORD PTR [BP+4] ;===X+Y 是第二个参数 因前一个参数是
;int 加2个地址
;如果数据是long int 加4个地址 long double加8个地址 ***注意寄存器的使用char
;加一个地址
MOV WORD PTR [BP-2], AX ;U===X+Y,U 是局部变量必须
;是[BP-2];
;如果这时返回C这时可以不用因为返回值在AX中
;说明C调用ASM有返回值是int或charASM把值放在AX中就可以了以后是C内部的事
;如返回值是 long int ASM把值放在AX, BX中
;如返回值是 long double
ASM把值放在AX,BX,CX,DX中
;如果ASM调用C时有返回值时
;ASM也是从这几个寄存器中取值
;以上说明了全部C和ASM数据接口

;用户程序
;********************************************************

;以下是ASM调用C函数的说明
MOV AX,421
PUSH AX ;压常数 fact3
PUSH imax ;压变量 fact2
LEA AX,xval
PUSH AX ;压入变量地址 fact
CALL _Cprog ;调用C程序
ADD SP, 6 ;现在是三个参数全是WORD所以是6 (恢复堆栈用)
MOV ans,AX ;如象C调用 ans=Cprog( );
MOV ans+2,DX ; 调用结果 (是LONG型)
;如是指针调用要用多值变化,而且还要用返回值时在定义C和ASM参数时多设一个空参数
;以保存调用结果(但这不是必要的只要你记住SP的状态包括 ADD SP,6)对内存的操作
;是ASM的长处如PUSH AX PUSH BX ........POP DX POP AX 有必要时SP可以这
;样使用

;*************************************************************************

;寄存器自动恢复
ret
Cfuncion ENDP
END

;*******************************************************************************
;C中原型说明
;long Cprog(int *fact,int fact2,int fact3);


;以上这ASM程序头可以根据需要修改应用于
;ASM调用C或C调用ASM以及有参调用和过和调用




liubear 2002-09-07
  • 打赏
  • 举报
回复
可以单独写一个.asm文件,用tasm-->.obj,再连到.exe中
housisong 2002-09-07
  • 打赏
  • 举报
回复
怎样链接汇编函数啊
glassshark 2002-09-07
  • 打赏
  • 举报
回复
如果全部用汇编写,就失去了用内嵌式汇编的意义,不如用汇编写一个函数再链接进来更方便些,省得把时间都浪费在这些研究编译接规则的问题上。
housisong 2002-09-07
  • 打赏
  • 举报
回复
如果全部用汇编写,应该怎样写汇编单元?
glassshark 2002-08-31
  • 打赏
  • 举报
回复
to: housisong(侯子)
》》接口部分和出口部分还有很多不必要的指令,我想自己来形成接口部分,
》》望高手指教
你没看清他说的,难道他说自己来形成接口部分也是“vc6的调用约定是固定的(可以声明函数调用约定如stdcall),完全可以自己形成接口部分,只要按约定就可以了,并不会破坏C或系统”,文不对题。
glassshark 2002-08-31
  • 打赏
  • 举报
回复
非也,非也。
gosirius 2002-08-31
  • 打赏
  • 举报
回复
进口主要是保存现场,出口则是恢复现场,和返回值。
调用协议的不同有时还要考虑清栈。
blh 2002-08-30
  • 打赏
  • 举报
回复
你直接用汇编写不就行了,本来vc就不是用来写汇编的,你这不是强人所难吗?
housisong 2002-08-24
  • 打赏
  • 举报
回复
汇编无所不能!!!
但现在VC好像不支持全汇编函数,这应该向Delphi学习
bailingke 2002-08-24
  • 打赏
  • 举报
回复
请教一下:

如果两个函数,只有行参不一样的,能否用汇编实现?
housisong 2002-08-24
  • 打赏
  • 举报
回复
to :glassshark(glassshark)
vc6的调用约定是固定的(可以声明函数调用约定如stdcall),完全可以自己形成接口部分,只要按约定就可以了,并不会破坏C或系统
glassshark 2002-08-24
  • 打赏
  • 举报
回复
>>接口部分和出口部分还有很多不必要的指令,我想自己来形成接口部分
不同意你的看法,在这种情况下可能是不必要的,但是如果你将这些接口的指令去掉,可能造成对外部环境的影响和破坏,(未必是改动,可能是某种约定),尤其可能对其它不可预料的调用者或被调用者产生伤害,除非你自己在写操作系统或底层库,不然你就不应该成为协定的改变者(接口只是其中一部分),而应该作为遵守者。
一种很危险的想法。
WIN-TC免费版是一个turbo C2 WINDOWS平台开发工具,最大特点是支持文界面,支持鼠标操作,程序段复制,WIN-TC免费版为初学c语言、对高等编程环境不熟悉的同志们非常有帮助。 WIN-TC免费版使用turbo C2为内核,提供WINDOWS平台的开发界面,因此也就支持WINDOWS平台下的功能,例如剪切、复制、粘贴和查找替换等。而且在功能上也有它的独特特色例如语法加亮、C内嵌汇编、自定义扩展库的支持等。并提供一组相关辅助工具令你在编程过程更加游刃有余,如虎添翼。WIN-TC简繁双语版可以正常运行于98及其以上的简体及繁体WINDOWS操作系统上。 主要功能: 1、在WINDOWS下编辑TC代码,可以充分利用WINDOWS的支持剪贴版和文的特点;   2、Include和Lib路径自动定位,告别TC设置路径的历史;   3、编译错误捕捉功能,编译时不会出现烦人的DOS窗口;   4、支持C内嵌汇编从而实现C/ASM混合编程;   5、支持C扩展库(自定义LIB库);   6、错误警告定位功能、出现编译错误时双击输出框里的出错行信息可以自动寻找到错误的行,就像DOS的TC那样;   7、支持语法加亮功能,并可以自定义设置;   8、没有目录路径限制,你甚至可以安装到带有空格的路径文件夹里;   9、允许自定义设置输入风格,能够实现VC类似的输入风格;   10、可选择是否生成ASM、MAP或OBJ文件,你甚至可以指定只生成EXE文件;   11、稳定的文件操作功能,支持历史记录列表和使用模板;   12、撤消和重复功能,并可以按照自己内存情况设置最多撤消次数(最多允许999次);   13、具有行标计数的功能,并可以设置样式。
[Trial version] 加密解密技术内幕.htm [Trial version] 目录.htm [Trial version] 第1章 PE文件格式深入研究 [Trial version] 1.1 PE文件格式格式纵览 [Trial version] PE文件格式一览.html [Trial version] 1.2 PE文件结构 [Trial version] 1. 检验PE文件的有效性.html [Trial version] 2. File Header (文件头).html [Trial version] 3. Optional Header.html [Trial version] 4. Section Table(节表).html [Trial version] 5. Import Table(引入表).html [Trial version] 6. Export Table(引出表).html [Trial version] 7.Debug信息节.htm [Trial version] DocNet 学习笔记之Anti ILDASM 研究.htm [Trial version] PE 档的基底重定位(Base Relocations).htm [Trial version] PE 格式学习总结(一)-- PE文件概述.htm [Trial version] PE 格式学习总结(二)-- PE文件的输出函数.htm [Trial version] PE 格式学习总结(三)-- PE文件的输入函数.htm [Trial version] PE 格式学习总结(四)-- PE文件的资源.htm [Trial version] TLS.htm [Trial version] 基址从定位.htm [Trial version] 异常处理.htm [Trial version] 第2章 PE分析工具编写 [Trial version] 关于PE可执行文件的修改.htm [Trial version] 手工构造一个超微型的 PE 文件.htm [Trial version] 第3章 Win32 调试API [Trial version] 病毒是如何抗动态测试.htm [Trial version] 3.1 Win32调试API原理 [Trial version] Win32调试API第一部分.htm [Trial version] Win32调试API第二部分.htm [Trial version] Win32调试API第三部分.htm [Trial version] Win32调试API学习心得(一).htm [Trial version] Win32调试API学习心得(二).htm [Trial version] win32调试API学习心得(三).htm [Trial version] 用调试函数跟踪API.htm [Trial version] 3.2 利用调试API编写脱壳机 [Trial version] DEF分析与打造其脱壳软件----我的一篇析文.htm [Trial version] 用调试函数跟踪API.htm [Trial version] 3.3 利用调试API制作内存补丁 [Trial version] 利用DebugAPI做一些原先手工完成的动作,我用这种方法做过内存补丁,内存注册机等,完全VC编译.htm [Trial version] 第4章 Windows下的异常处理 [Trial version] 4.1 基本概念 [Trial version] SEH基本概念.htm [Trial version] 什么是异常.htm [Trial version] 4.2 结构化异常处理(SEH) [Trial version] 初步实战演习.htm [Trial version] 4.3 异常处理程序设计 [Trial version] 传递给异常处理例程的参数.htm [Trial version] 异常处理的堆栈展开.htm [Trial version] 4.4 SEH的简单应用 [Trial version] Win9x下利用SEH进ring0.htm [Trial version] 利用SEH实现对自身的单步自跟踪.htm [Trial version] 异常死亡进程的自动复活.htm [Trial version] 用 SEH 技术实现 API Hook.htm [Trial version] 4.6 VC是如何封装系统提供的SEH机制的 [Trial version] VC++编译器怎么实现异常处理.htm [Trial version] 4.7 Windows XP下的向量化异常处理(VEH [Trial version] windows XP下的向量化异常处理.htm [Trial version] 第5章 软件加密技术 [Trial version] 5.1 反调试技术(Anti-Debug) [Trial version] 5.1.1 句柄检测.htm [Trial version] 5.1.4 ICECream子类型.htm [Trial version] 5.1.5 判断NTICE服务是否运行.htm [Trial version] anti-debug技术探讨.htm [Trial version] AntiSoftICE.htm [Trial version] VB实现检测ICE.htm [Trial version] 测试ICE是否在运行.htm [Trial version] 检测debugger的方法补遗.htm [Trial version] 另外一种检测SOFTICE的方法.htm [Trial version] 通过PEB实现AntiDebug.htm [Trial version] 5.2 反跟踪技术(Anti-Trace) [Trial version] tELock的SEH反跟踪代码.htm [Trial version] 利用SEH改变程序流程以达到反跟踪的目的.htm [Trial version] 5.2.3 SMC技术实现 [Trial version] 浅析SMC技术.htm [Trial version] 5.3 反加载技术(Anti-Loader) [Trial version] VB anti-loader 2种常用方法介绍.htm [Trial version] 5.3.1 利用TEB检测 [Trial version] 浅谈利用 TEB 实现的反跟踪.htm [Trial version] 5.4 反DUMP技术(Anti-Dump) [Trial version] 理论知识.htm [Trial version] 5.5 文件完整性检验 [Trial version] PE 头部校验和(checksum)的计算.htm [Trial version] 5.5.1 CRC校验实现 [Trial version] 矛与盾的较量(1)——CRC原理篇.htm [Trial version] 矛与盾的较量(2)——CRC实践篇.htm [Trial version] 5.7 反静态分析技术 [Trial version] Fooling Disassemblers.htm [Trial version] 5.7.2 花指令 [Trial version] 矛与盾的较量(1)——花指令.htm [Trial version] 5.8 代码与数据结合技术 [Trial version] 与破解过招,保护你的共享软件.htm [Trial version] 5.9 软件保护的若干忠告 [Trial version] WIN下动态注册码实现方法.htm [Trial version] 安全程序设计.htm [Trial version] 如何用简单方法防止破解.htm [Trial version] 第6章 加壳软件编写 [Trial version] 6.1 外壳编写基础 [Trial version] 加壳软件实现.htm [Trial version] 6.2 加壳程序综合运用的实例 [Trial version] 浅谈壳的加载步骤及手动脱壳。.htm [Trial version] 第7章 如何让壳与程序融为一体 [Trial version] 7.2 欺骗检查壳的工具 [Trial version] 让侦测工具把壳识别为VC++.htm [Trial version] 7.4 使用sdk把程序和壳溶为一体 [Trial version] 实现调用加壳的外壳的子程序的一点见解.htm [Trial version] 7.5 后记关于壳和程序的思考 [Trial version] 加壳技术探讨-加壳时处理IAT.htm [Trial version] 第8章 Visual Basic 6 逆向工程 [Trial version] VB的Native Code的传奇.htm [Trial version] VB网址大全.htm [Trial version] Visual Basic 6 逆向工程与反逆向工程 (1).htm [Trial version] Visual Basic 6 逆向工程与反逆向工程 (2).htm [Trial version] 《真是想不到系列》.htm [Trial version] 关于VB P-CODE的一些总结.htm [Trial version] 关于在VB进行COM组件的开发(一、了解COM).htm [Trial version] 未公开API函数揭秘--通用对话框.htm [Trial version] VB与COM [Trial version] 如何用VB6写COM组件(一).htm [Trial version] 如何用VB6写COM组件(二).htm [Trial version] 附录A 在Visual C++使用内联汇编 [Trial version] Visual C++ 内嵌汇编.htm [Trial version] Visual C++ 内嵌汇编二.htm [Trial version] 附录B 在Visual Basic使用汇编 [Trial version] 完全用VB进行ASM编程的示例.htm [Trial version] 附录C COM技术 [Trial version] 《COM 原理与应用》学习笔记 - 第一部分 COM原理.htm [Trial version] 附录D 通过崩溃地址找出出错的代码行 [Trial version] 如何通过崩溃地址找到出错的代码行.htm [Trial version] 附录E 堆栈修正 [Trial version] 堆栈修正.htm

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧