访问参数时内联汇编过程崩溃

时间:2018-11-02 15:43:40

标签: assembly x86 masm

我尝试从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指向一个完全不同的地址,并且是该异常给出的地址。这只是反汇编工作方式的一种误导性产品,还是我的代码实际上已更改为此意外操作?无论如何,崩溃的根源对我来说还是未知的。

1 个答案:

答案 0 :(得分:3)

事实证明,ResultsViewModel的默认设置为SEGMENT而不是USE16 / USE32,这导致它以16位模式进行了汇编,尽管解释不多在documentation中。

正如迈克尔所说,汇编文件可以简化为:

FLAT

为了简化与c代码的集成。

相关问题