本周做了另一项任务,虽然我已经编写了我的代码的第一稿,但我还没有能够调试它,因为我对此感到困惑的几个错误,以及避免&# 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