2

所以,首先,这是一个我正在帮助的朋友的任务,虽然我已经有一段时间没有做 C 语言了,但这不是问题(或者至少我不认为是问题),问题是汇编代码。赋值必须使用内联汇编编写的函数,将用户输入后传递给函数的两个数字相加,并返回值,然后将其输出。在运行我的代码时,我在读取或写入 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;

}
4

2 回答 2

3

我不确定所有 push 和 pop 的用途,但这有效:

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

    __asm{  mov eax, val2        ;
            mov ebx, val1        ;
            add eax, ebx         ;
            mov val3, eax        ;
         }
    return val3;
}
于 2012-11-18T22:09:50.253 回答
0

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

于 2017-04-02T04:36:36.217 回答