如何在装配中繁殖?

时间:2014-09-10 06:23:22

标签: assembly masm irvine32

我要拔掉头发因为被困在这么小的问题上......

我需要将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:符号重新定义:产品

2 个答案:

答案 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)