问题描述
请帮助,我需要使用DEBUG-DOSBox中的汇编编程,将前5个数字的平方和。这是一个2 ^ 2的示例:
-a 100 </i>
15BC:0100 mov ax,1
15BC:0103 mov bx,2 ; Base Number
15BC:0106 mov cx,2 ; Exponent
15BC:0109 ;bucle 109:
15BC:0109 mov dx,0
15BC:010C mul bx
15BC:010E loop 109
15BC:0110 int 20
15BC:0112
-g 110
解决方法
指令mul bx
将ax
的内容(总是)与bx
寄存器(参数)的内容相乘。因为是16位寄存器,结果最多可以有32位。此结果的低16位放在ax
中,高16位放在dx
中。因此,您不必在dx
之前清除mul
。这仅对div
有用。
用于计算ax = 3²
的代码(通常为ax = bx
cx
)将是:
mov ax,1
mov bx,3 ; Base Number (that is multiplied by itself cx plus one times)
mov cx,2 ; Exponent (how often the multiplication should be repeated)
expLoop:
mul bx
loop expLoop
如果仅要计算平方,则不再需要循环,并且可以简化代码:
mov ax,3 ; Base Number (that is multiplied by itself one time)
mul ax
这将计算3²
(通常为ax²
)。请注意,这里不再使用bx
和cx
。
正如迈克尔已经提到的那样,如果要求平方和,就必须在这之后总结结果。原因cx
不再使用,它可以与loop
一起使用以迭代所有要平方的数字。 bx
可用于存储平方和:
xor bx,bx ; Sum is initialised to zero
mov cx,5 ; Iterate from 5 down to 1
iterate:
mov ax,cx
mul cx ; Calculate the square of the acutal number
add bx,ax ; Sum up the squares in bx
loop iterate