c语言可不可以调运,汇编里申请的地址,变量。 如果可以,如何调用

c语言可不可以调运,汇编里申请的地址,变量。 如果可以,如何调用,第1张

可以。具体方式,在不同的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 函数问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9675032.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存