用于Visual Studio调用的内联汇编程序

时间:2012-11-18 21:43:12

标签: c visual-studio inline-assembly

所以,首先,这是我正在帮助的朋友的任务,虽然我已经做了一段时间,但这不是问题(或者至少我认为不是),问题是汇编代码。赋值必须使用内联汇编中编写的函数来汇总在用户输入后传递给函数的两个数字,并返回该值,然后输出该值。在运行我的代码时,我得到读取或写入asm函数中找到的内存位置的错误,特别是第二个mov命令,并且程序将在尝试执行该行代码时挂起。跟踪程序,其中一个值将被正确存储(无论用户输入的第二个值,我认为这是正常的,因为在汇编中反向读取值?)而另一个根本没有读取,并且程序崩溃。我花了大约四个小时试图解决这个问题,现在我正在寻求外界的帮助。无论如何,足够的背景,试图彻底,这是代码。我确定我正在做的事情可能是基本的,并且正在盯着我,但任何帮助都会受到赞赏。哦,是的,我确保在视觉工作室中启用了masm。

#include "stdafx.h"
#include "stdio.h"
#include <conio.h>

int sum( int val1, int val2 );
int main (void)
{
int val1=0, val2=0, val3=0;

printf("Hello, this program will add two whole numbers. Please enter the first    number.\n");
scanf("%d",&val1);

printf("Please enter the second number.\n");
scanf("%d",&val2);

val3 = sum(val1, val2);
printf("The sum of %d and %d is %d", val1, val2, val3);
_getch();

return 0;
 }

 int sum ( int val1, int val2 ){
 int val3;

    __asm{  mov eax, val2        ;
            push eax             ;
            mov ebx, val1        ;
            push ebx             ;
            add eax, ebx         ;
            mov ecx, val3        ;
            pop val3             ;
            pop ebx              ;
            pop eax              ;
            pop ecx              ;
            ret                  ;
    }
    return val3;

}

2 个答案:

答案 0 :(得分:3)

我不确定所有推送和弹出的内容是什么,但这有效:

int sum ( int val1, int val2 )
{
    int val3;

    __asm{  mov eax, val2        ;
            mov ebx, val1        ;
            add eax, ebx         ;
            mov val3, eax        ;
         }
    return val3;
}

答案 1 :(得分:0)

加载CPU寄存器时无需使用push和pop。 push指令使值被写入SS:[ESP]寄存器对指向的存储单元,其中SS是16位堆栈段,ESP是32位堆栈指针。这也将ESP减去操作数的大小(以字节为单位)。 pop指令执行逆操作,从SS指向的内存位置读取:[ESP]并以操作数的大小(以字节为单位)递增ESP。