内联汇编语言
Posted
技术标签:
【中文标题】内联汇编语言【英文标题】:Inline assembly language 【发布时间】:2013-04-30 07:50:33 【问题描述】:我正在做 64 位迁移,我需要将内联汇编代码移植到 cpp 这是他的代码
void ExternalFunctionCall::callFunction(ArgType resultType, void* resultBuffer)
// I386
// just copy the args buffer to the stack (it's already layed out correctly)
int* begin = m_argsBegin;
int* ptr = m_argsEnd;
while (ptr > begin)
int val = *(--ptr);
__asm push val
我想将此 __asm push val 迁移到 cpp。这个函数被调用了四次,每次调用我们得到不同的 m_argsBegin 和 m_argsEnd 值(m_argsBegin 和 m_argsEnd 都是动态数组)。 每次调用此“callFunction”函数时,此 while 循环执行 4 次。因此,总共 4x4 = 16 个值将存储在“连续内存位置”中,这就是我猜的“__asm push val”。我需要在 c++ 中实现它。我尝试了所有可能的方法(堆栈、数组、Lnked 列表、队列甚至将其分离到一个单独的 asm 文件中,但没有一个有效) 有人可以帮忙吗?
我将这个内联汇编函数分离到一个单独的汇编文件中。代码如下:
.386
.model c,flat
public callFunction_asm
CSEG segment public 'CODE'
callFunction_asm PROC
push ebp
mov ebp, esp
mov ecx, [ebp+8] ;val
push dword ptr [ecx]
mov esp, ebp
pop ebp
RETN
callFunction_asm ENDP
CSEG ends
END
其中 callFunction_asm 是一个外部函数,我将其声明为:
外部“C” void callFunction_asm(int val);
我将此函数称为:
while (ptr > begin)
int val = *(--ptr);
callFunction_asm(val); //possible replacement
但即使这样也行不通,谁能告诉我哪里出错了。我是汇编编码的新手。
【问题讨论】:
On the stack. 你真的需要推送吗?如果要将代码移植到 C++,为什么不将 'val' 的值存储在先前定义的数组或向量中? (如 std::vector__asm pop something
?
编译器为栈上的局部变量保留内存。您应该发布完整的代码,否则很难说函数真正在做什么,所以如果您发布整个函数(可能还有调用者)会很有帮助。
好吧,这没有任何意义。它假装为调用设置了参数,但它甚至没有进行调用。争论消失了,什么也没有发生。
【参考方案1】:
push
将其操作数放入堆栈,同时将堆栈指针递减。
如果您查看堆栈指针加 1 (1($sp)
),您应该会看到该值(但如果您想要返回,您通常会使用 pop
)。
【讨论】:
我知道它会将值压入堆栈,但我想知道该堆栈在内存中的位置 @user2165634 见第二段,我在这里解释。 我无法使用 __asm pop val 访问值,因为您看到 val 在 while 循环内声明,我想在循环外访问它的值而且我无法在循环外定义它导致我的代码的逻辑那样不行 @user2165634 研究一下堆栈指针是什么以及寻址模式是什么。 您可以使用__asm pop eax
然后__asm mov val, eax
其中val
是仍在范围内的任何变量的标识符(您可以在推送循环之外创建另一个val
,移动原始val
在该循环之前声明,或将val
更改为其他变量。以上是关于内联汇编语言的主要内容,如果未能解决你的问题,请参考以下文章