
可以。具体方式,在不同的C编译系统里可能有细节的规定。
这里举TI的CC2000下的C语言作为例子,如下:
(1)汇编语言程序中所用的符号命名,要等同于C语言调用时用的符号前面加一个下划线。例如汇编中定义的变量地址标号叫_vv,那么C语言调用这个变量就可以叫vv;汇编中定义的子程序地址标号叫_ss,那么C语言把这个子程序当做C函数调用时,函数就可以叫ss。
(2)汇编语言中定义的符号,凡是允许C语言程序将它当变量或函数来引用者,如上述的_vv、_ss等,应该声明为global型。
(3)C语言程序中引用汇编语言里的变量或函数时,必须先适当声明。例如上述变量和函数,假如vv是一个10个整数的数组,ss是一个无返回值也无参数的函数,那么,在引用之前可以如此声明:
extern int vv[10];
void ss();
也可以将这些声明做成一个“头文件”,凡是需要引用这些符号的C程序文件里,均在开头用#include将这个“头文件”包含进来,即可。
(4)汇编语言中,必须由程序员自行适当设计,使得上述变量和函数符合C语言的编译要求。例如在地址_vv后必须留够10个int型数据的存放空间;又如子程序_ss的入口、出口及现场保护必须符合该C语言系统的统一约定。
(5)在编译命令文件(mak文件)中,将上述C文件和汇编文件纳入一个项目(project)中,以便在连接时可以将其生成一个目标文件。
堆栈的压入顺序是从高位地址向低位地址延伸,局部变量的分配方向也是这样,这个是关键。
每个函数开始一般有push bp、mov bp, sp两条指令,局部变量的分配地址都在bp之下,访问也是通过bp-n,而bp+2(32位汇编中是esp+4)才是栈顶,所以局部变量不会破坏栈顶数据,ret之前有pop bp,则栈顶数据就是call的时候压入堆栈的返回地址,没有什么“寻找返回地址”的活儿要干。
好厉害!
VB可以用ASM语言吗?
第一次听说
有 With asm 。。。这样的语句
具体没做过,没有发言权。
不过,一般 asm的调用都是用的 INVOKE 伪代码,(具体可能还根据传递参数声明的方式而定)
PUSH 。。。。来压栈传递参数,方式的,
JMP 。。。
之前,汇编要生成,链接等 *** 作。不是简单一个语句就OK的。
所以,VB有一个 Declare 语句,专门为dll调用准备的。MSDN 有语法大全。不必买书。
如果用的是 VB90 (VBNET),还有其他方式。
no!no!
比如下列反汇编代码:
------地址--------指令----
0046D4EE----- mov eax,2
0046D4F3----- call 004063E8
0046D4F8----- mov eax,3
call就是进入一个函数,那么004063E8就是这个函数的入口地址,而函数执行完要返回到mov eax,3这句继续执行,所以0046D4F8为那个函数的返回地址
这个有很多办法,我先给你列举最简单的:
typedef void (WINAPI PGNSI)(LPSYSTEM_INFO);void TestFunc()
{
PGNSI pGNSI;
SYSTEM_INFO si;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
hMoudle = LoadLibrary("ntdlldll");
//pGNSI的值就是函数的地址
pGNSI = (PGNSI)GetProcAddress(hModule,"ZwQueryInformationProcess");
}
还有从内存中载入,PE分析,对比输出表中的函数等,稍微复杂一些!楼主感兴趣可以自己去查
以上就是关于c语言可不可以调运,汇编里申请的地址,变量。 如果可以,如何调用全部的内容,包括:c语言可不可以调运,汇编里申请的地址,变量。 如果可以,如何调用、关于汇编指令call和ret的具体细节 *** 作!、vb 汇编 jmp 函数问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)