1

我已经编写了一半的程序。问题是我不知道如何编写数学运算部分的m代码n (m^n)。那么,对我这个初学者有什么建议吗?

.MODEL SMALL

.DATA

greet   db 13,10, "Welcome to Simple Calculator: Raise m to the power n. $"
msg1    db 13,10, 0AH,0DH,"Please enter integer (m:-99 to 99): $"
m       db 3,4 dup(?)
msg2    db 10,13, 0AH,0DH,"Please enter power (n:1 to 9): $"
n       db 3,4 dup(?)
total   db 10,13, "Answer: $"


.CODE

START:

mov ax, seg greet
mov ds, ax
mov dx, offset greet
mov ah, 09h     ;Display message
int 21h 

mov ax, seg msg1
mov ds, ax
mov dx, offset msg1
mov ah, 09h
int 21h         ;Print a message

mov ah, 0ah
mov dx, offset m
int 21h         ;Get 'm' value


n_POWER:

mov ax, seg msg2
mov ds, ax
mov dx, offset msg2
mov ah, 09h
int 21h         ;Print a message

mov ah, 0ah
mov dx, offset n    ;Get 'n' value
int 21h

mov ax, m
mov n, ax
mul ax, n
mov total, n

finish:
mov ah, 09h ;Display message
int 21h

mov ax,4c00h    ;Return control to DOS
int 21h         
end start

另外,我怎样才能从用户那里得到负面的输入(例如-99)?

4

2 回答 2

3

您可以重复乘法,如下所示:

int result = 1;  while (exp-->0) { result *= base; } return result;

或者,您可以/应该以二进制表示形式处理指数:

5^13 = 5^(0b1101) = 1*(5^1)*(5^4)*(5^8)

因此,人们可以重复计算以 5 为底的副本:5 -> 25 -> 625 -> 390625,并将在指数的二进制表示中具有相应位设置的那些项相乘

这对于 16 位算术来说可能是多余的,但如果您的教授要求您执行模幂运算(如在非对称密码学中使用的那样),它会很方便。

两种方法都需要使用条件跳转:

有条件地重复cx操作次数,只需简单地执行以下操作:

         mov cx, 13
label:   nop  // put your block of code here
         nop
         loop label;  // The instruction at label will be executed 13 times
         // and cx will end up being zero

要测试正在设置的位,可以这样做

         mov dx, 13      ;; let's have the exponent here
label:   test dx, 1      ;; check if the first bit is zero
                         ;; test performs bitwise _and_ between the operand
                         ;; and sets ZERO flag (among other things)
         jz   notset     
         nop             ;; insert here the statements to be executed
                         ;; when the bit in the exponent is set
notset:  shr dx, 1       ;; shift out the least significant bit -- this also
                         ;; sets the ZERO_FLAG if dx goes to zero
                         ;; (and it eventually does)
         jne label;      ;;

顺便提一句。JNE == Jump if Not Equal 也测试零标志。如果不为零,则跳跃是同义词。

于 2013-04-10T05:59:30.887 回答
1

计算整数幂只是一系列乘法。例如,5^2 == 5*5、2^3 == 2*2*2 等等。

因此,一个简单的乘法循环就足够了:

mov bx,5   ; m
mov cx,3   ; n
mov ax,1   ; Initial result, i.e. m^0
power:
    jcxz power_done
    mul bx
    loop power
power_done:
; ax now contains m^n

请注意,我的示例代码不处理结果增长大于 16 位的情况(除了在最后一次迭代中隐含)。它也不处理m. 我将把它作为练习留给你,让你在需要时查找指令集参考,以了解解决这些问题的方法。

于 2013-04-10T05:34:52.190 回答