【发布时间】:2016-11-21 22:40:48
【问题描述】:
我有一个使用内联汇编的函数,它基本上调用一个 C 函数,获取返回值,并将该值作为参数传递给另一个返回字符的函数。
void convertText(FILE *arch, FILE *result)
{
int i = 0;
int n = arch->size;
_asm {
mov esi, 0
whileS:
cmp esi, n
jge end
mov ebx, result
mov ebx, [ebx]result.information ; Pointer to an array of characters
push esi ; Push parameters to get5bitsFunc
push arch ; Push parameters to get5bitsFunc
call get5bitsFunc
pop arch ; Restore values
pop esi ; Restore values
push eax ; push get5bitsFunc returned value to codify as parameter
call codify
mov edi, eax ; <- HERE move returned value from codify to edi register
pop eax ; restore eax
inc esi
jmp whileS
end:
}
}
将编码视为类型的函数
unsigned char codify(unsigned char parameter) {
unsigned char resp;
// Do something to the parameter
resp = 'b'; // asign value to resp
return resp;
}
我已经测试了 codify 并且可以正常使用 C 代码返回我想要的值。问题是,当我在标记为“-> Here”的行中运行和调试内联汇编中的convertText代码时,eax中返回的值是3424242类型的东西,而不是ascii表中的97或以上我需要。
如何获取 char 值?
【问题讨论】:
-
unsigned char只有 1 个字节,而eax是 32 位(4 字节)寄存器。如果codify()只返回一个字节,那么返回值将存储在al(eax的第一个字节)中,而eax的其余部分保持不变(这将导致垃圾)。我会在调用codify()之前推荐xor eax, eax,以便在将返回值存储在其中之前知道寄存器是干净的。 -
@BrendonBoldt 是的,谢谢你是对的,你能发表你的评论作为答案,以便我检查你的正确吗?
-
你为什么
pop eax ; restore eax?当然这只是为了重新平衡堆栈,因为下一次迭代在调用get5bitsFunc破坏它之前不会读取它。所以指令是正确的,但评论完全错误/误导。同样,该调用之后的 POP 非常奇怪(并且弹出到内存中的速度比需要的慢)。此外,EDI 似乎没有被任何东西读取,所以这很奇怪。我假设你从你的真实代码中减少了这个。如果你在 inline-asm 中写这个来提高性能,你可能比优化编译器做得更糟......
标签: c visual-c++ assembly x86 inline-assembly