我要拔掉头发因为被困在这么小的问题上......
我需要将2乘以3与4乘以5在一个语句中并将其存储在bl寄存器中。到目前为止我的代码是:
TITLE PA2.asm
INCLUDE Irvine32.inc
.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode : DWORD
.data
product BYTE ?
.code
main PROC
product = 2*3*4*5
mov bl, product
exit
main ENDP
END main
我得到的错误是 错误A2005:符号重新定义:产品
答案 0 :(得分:2)
那是因为你已经定义了两次“product”:一次是包含BYTE的内存位置的名称,另一种是(等等,oops)作为具有特定“编译时”值的“等同”。这个双重定义是不允许的,但这与您是否或如何要求汇编程序完成乘法无关。
汇编程序可以通过两种不同的方式实现“倍增”:
在您的示例中,您似乎正在尝试进行汇编时间乘法。如果你不纠结于双重定义,这将很好。要修复您的示例,请按以下步骤进行更改:
...
main PROC
product2 = 2*3*4*5
mov bl, product2
exit
main ENDP
这应该可以阻止双重定义投诉。或者,您可以简单地删除包含BYTE声明的行;它在这个计划中没有用处。
然而,我怀疑这不是你真正想做的事情。我猜你是一名学生,有人希望你写一个在运行时倍增的程序。
在这种情况下,您需要使用乘法指令而不是等号。
您可以通过编写以下内容来实现:
mul <constant>
在运行时将EAX乘以在汇编时定义的常量值。 MUL指令的其他变体乘以其他寄存器或存储器位置的运行时值;作为一名学生,你应该去了解一下,了解你的选择。这个简短的讨论可以帮助您理解为什么使用它有点笨拙:Intel instruction set: multiply with EAX, EBX, ECX or EDX?。如果您想了解CPU可以真正做什么的有用细节,您应该阅读英特尔参考手册;既然你提到“Irvine.32.inc”(我的母校),我猜,但不知道有关于Irvine32的相关文档以及你更了解的相关课程。欢迎来到studentville,你所选择的其他职业可能会有什么感受(“不知道这个话题?去找出来”)。
由于这似乎是作业,我将以上述提示离开你。您需要更多指令(不多)来设置EAX,并将值与其相乘,并将答案移至BL。
答案 1 :(得分:0)
汇编程序可以为你增加。
试试这个......
Mov BL, (2*3*4*5)