Assembly 如何在MASM x86中添加两个十进制变量并输出总和

Assembly 如何在MASM x86中添加两个十进制变量并输出总和,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我对MASM和汇编非常陌生,我正在编写我的第一个程序。我不知道如何将两个变量相加并输出结果。以下是我目前计划的一部分: INCLUDE Irvine32.inc .data firstNum DWORD ? secondNum DWORD ? sum DWORD ? .code main PROC ;Get Data call ReadInt mov firstNum, eax call

我对MASM和汇编非常陌生,我正在编写我的第一个程序。我不知道如何将两个变量相加并输出结果。以下是我目前计划的一部分:

 INCLUDE Irvine32.inc

 .data
 firstNum   DWORD   ?
 secondNum  DWORD   ?   
 sum        DWORD   ?       

 .code
 main PROC

 ;Get Data

 call      ReadInt
 mov       firstNum, eax
 call      ReadInt
 mov       secondNum, ebx

 ;Calculate Sum

 mov       eax, firstNum
 mov       ebx, secondNum
 add       eax, ebx
 mov       sum, eax

 ;Display Results 

 mov       eax, sum
 call      WriteDec

当我运行这段代码时,它会输出一些长的数字“333420163”,而不是总和应该是7。我还是个新手,所以如果这是一个简单的答案,我很抱歉,哈哈。我做错了什么?

在大多数x86 ABI上,函数的返回值通常在
EAX
寄存器中,如果返回值是64位而不是32位,则较高的32位将在
EDX
寄存器中

你的指示:

call      ReadInt
mov       secondNum, ebx
未从对
ReadInt
的第二次调用中获取返回值,因为它不在
EBX
;它在
EAX


将其替换为
mov secondNum,eax
,因为这将把
ReadInt
中的实际返回值放入
secondNum

我不知道irvine,但是
mov secondNum,ebx
不能正确,如果
mov firstNum,eax
是。如果“ReadInt”将读取的值返回到EAX中,那么第二步应该是
mov secondNum,EAX
谢谢,我很困惑,因为我认为如果我将secondNum移动到EAX中,它将替换第一个变量。我仍然不太清楚这些寄存器是如何工作的。在我做了我所说的之后,它起了作用!“mov”的作用正好相反。如果您写入“mov variable,eax”,则eax的内容将移动到此内存中,而不是从那里;-)显然,“ReadInt”在EAX中重新运行该值,在firstNum中存储该值后,EAX可以自由地再次使用!如果我知道这个网站很容易从像你这样乐于助人的人那里得到答案,我早就开始问问题了。哈哈,你也应该学会使用调试器。在调试器中一步一步地执行代码可以让您自己找到问题的答案。这更容易:如果对
ReadInt
的第一次调用在
EAX
中返回结果,那么第二次调用肯定也会这样做。