用于x86处理器的MASM 32位:递归,END与ENDP和错误MSB3721

时间:2017-07-01 21:19:30

标签: assembly x86 masm masm32

本周做了另一项任务,虽然我已经编写了我的代码的第一稿,但我还没有能够调试它,因为我对此感到困惑的几个错误,以及避免&# 39;在这种情况下找到任何看似有用的东西。我本周应该使用三个.asm文件 - Binomial.asm,IntegerIO.asm和主要的Program.asm。 Binomial.asm是包含两个错误的文件。

Binomial.asm应该在堆栈上接受两个整数,计算两个数字的二项式系数,然后在EAX寄存器中返回结果。我们对程序使用的内容有一些限制 - 它不能使用.IF,.REPEAT或.WHILE指令。不可否认,我对编程的递归感到非常不稳定,所以我很难解决这两个问题,所以我可以开始调整我的代码。

关于END指令,Binomial.asm中的第一个错误是A2088。我对这个有点困惑,因为我的IntegerIO.asm以与Binomial.asm文件相同的方式结束(使用ENDP)。 ENDP是我们被教导使用的,END在主Program.asm(调用此函数)中。如果我使用END指令它会消失,我想我可以在课程的上下文中使用它,但我仍然想了解为什么END指令有效并且ENDP不在此实例

第二个错误对我来说更加模糊 - MSB3721,并且位于masm.targets中 - 所以我非常不确定这里的根本问题是什么。

实际描述是

  

命令" ml.exe / c / nologo / Zi /Fo" ;Debug \ Biinial.obj" /Fl"Program.lst" /我" C:\ Irvine" / W3 / errorReport:prompt /Ta" .......Irvine'Week 8 \ Binomial.asm""退出代码1.

我将发布以下代码用于Binomial.asm,因为其他两个.asm文件似乎没问题。正如我所提到的,这仍然是我的初稿,所以我希望代码本身在递归方面存在问题,我只需要弄清楚如何首先调试它 - 但是如果你想贡献一些有帮助的东西你在早年就明白这一点,我当然不会介意其他信息。我的教科书完全废话。

TITLE Binomial Calculator          (Binomial.asm)

;  This file supports Program.asm. This portion of that program accepts two integers on
; the stack, then calculates the binomial coefficients of (a+b)^n using Pascal's Rule,
; which states (n-1)!/(k-1)! + (n-1)!/k!. It then returns the result to Program in the
; EAX register. This program uses recursion. Any other supporting functions, if
; necessary, will be contained within this file.

INCLUDE Irvine32.inc

.code

Binomial PROC

 push ebp
 mov ebp,esp

 push edi
 push esi

 cmp esi,0
 je Stop

 cmp edi,esi
 jne Continue

 Stop:
      mov eax,1
      jmp Exit

 Continue:     ; Pascal's Rule for (a+b)^n: (n-1)!/(k-1)! + (n-1)!/k!
      mov eax,[esp]     ; This is the k value
      dec eax     ; k - 1
      mov edx,eax     ; EDX = k - 1
      mov eax,[esp + 8]     ; This is the n value
      dec eax     ; n - 1
      mov esi,edx     ;  ESI register = k - 1
      mov edi,eax     ;  EDI = n - 1

      call Binomial

      mov ebx,eax
      mov eax,[esp + 8]     ; This is the n value
      dec eax
      mov edx,eax
      mov eax,[esp]     ; This is the k value
      mov esi,eax
      mov edi,edx

      call Binomial

      add eax,ebx     ; (n-1)!/(k-1)! + (n-1)!/k!

 Exit:
      add esp,16
      pop ebp
      ret

Binomial ENDP

0 个答案:

没有答案