Assembly 如何在MASM x86中添加两个十进制变量并输出总和
我对MASM和汇编非常陌生,我正在编写我的第一个程序。我不知道如何将两个变量相加并输出结果。以下是我目前计划的一部分: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
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
中返回结果,那么第二次调用肯定也会这样做。