我尝试从c程序调用以下x86过程:
PUBLIC _funcf
_TEXT SEGMENT WORD PUBLIC 'CODE'
_funcf PROC
push EBP
mov EBP, ESP
sub ESP, 4 ; make space for x (4)
mov EAX, DWORD PTR 4[ebp] ; move v1 into EAX
...
pop EBP
ret
_funcf ENDP
_TEXT ENDS
END
其名称如下:
extern "C" int funcf( int32_t v1, int32_t v2, int32_t v3 );
int main( int argc, char *vargs[] )
{
...
output = funcf( v1, v2, v3 );
...
}
但是,在运行时,mov EAX
命令会收到访问冲突。我使用调试器查看了内存视图,并且存储在ebp+4
处的内存是预期的参数,因此我对导致崩溃的原因感到困惑。我注意到访问冲突给定的内存地址与ebp+4
不同,在查看我的汇编代码的反汇编后,我发现它已被翻译为
mov ax,word ptr [di+4]
其中di
指向一个完全不同的地址,并且是该异常给出的地址。这只是反汇编工作方式的一种误导性产品,还是我的代码实际上已更改为此意外操作?无论如何,崩溃的根源对我来说还是未知的。
答案 0 :(得分:3)
事实证明,ResultsViewModel
的默认设置为SEGMENT
而不是USE16
/ USE32
,这导致它以16位模式进行了汇编,尽管解释不多在documentation中。
正如迈克尔所说,汇编文件可以简化为:
FLAT
为了简化与c代码的集成。