装配错误的指数动力程序结果

时间:2011-05-11 19:01:51

标签: assembly x86 masm irvine32

这是一个2部分的任务。首先,我必须弄清楚如何使用堆栈将参考参数发送到一个名为pow的过程,我认为我使用push offset result正确地完成了这项任务的第二部分让我完全无能为力,我已阅读并阅读我的文字,但我仍然无法弄清楚如何完成我需要做的事情。在发送参考参数之后,我需要使pow程序中的计算结果存储在参考参数中,以便稍后在程序中输出。到目前为止,我尝试了一些不同的东西,但无济于事。代码被评论,所以那些熟悉汇编的人应该理解我正在尝试做什么。如果有人能帮助我,我会非常感激。感谢

INCLUDE Irvine32.inc
.data
XPrompt BYTE "Enter the value of the base(X):",0
YPrompt BYTE "Enter the value of the exponent(Y):",0
ResultMessage BYTE "X to the power of Y is",0
result DWORD ?

.code
main PROC
    call Clrscr

   ;;;;Prompt for X 
    mov  edx,OFFSET XPrompt
    call WriteString

    call ReadInt
    push eax     ;;;;pass the 1st number to POW
                 ;;;;this will represent the base

   ;;;; Prompt for Y 
    mov  edx,OFFSET YPrompt
    call WriteString

    call ReadInt
    push eax            ;;;;pass the 2nd number to POW
                        ;;;;this will represent the EXPONENT

    push OFFSET result  ;;;;pass the third parameter to pow, using offset makes it a reference parameter                         

    call Pow
                             ;;; Print Result (Assumes the answer is in eax)
    mov  edx,OFFSET ResultMessage
    call WriteString

    ;;;;;;;;;;;;;;;;;NOTE: NEW "POW" MODIFICATIONS HERE;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    mov eax,result     ; If the pow function correctly returns it answer by reference
                       ; then this should be all that's necessary to print
                       ; the answer with the call to "WriteInt"
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                     
    call WriteInt
    call ReadInt             ;;;; screen pause
    exit
main ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pow PROC
COMMENT !
PUT FUNCTION CODE IN THIS SECTION

This current  pow function returns its answer via register "eax." Modify it as necessary
so that it returns its answer by a reference parameter. In C++ the function interface/prototype
would look like:

 void pow(int base,int exp, int & result)

where "base" is the base and "exp" is the exponent. In other words "pow" should calculate "base" to the
power of "exp," then return the answer via "result."  Let your function return its result via a
3rd REFERENCE parameter "result." Which will be a REFERENCE parameter on the stack. 
 !

 base EQU DWORD PTR [ebp + 12]
 exponent  EQU DWORD PTR [ebp + 8]

 push ebp
 mov ebp, esp
 push ecx  ;<------------ecx must also be preserved since it is modified
           ; by the "loop" instruction.

 mov ecx, exponent ;set ecx as our counter
 mov eax, 1        ; eax will be our multiplier
 L1:
  mul base
  loop L1

pop ecx  ;<------------restore ecx
pop ebp  ;<------------restore ebp

ret 8
Pow ENDP
END main

1 个答案:

答案 0 :(得分:3)

好的,既然你正在使用C风格的函数原型,我猜你知道C.现在,当你传递指向函数的指针时,你需要取消引用该指针来访问它的数据。换句话说,解除引用是在变量名称之前放置的星号。一个例子:

void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

那些星号表示:“获取地址a(或b)的值而不是a(或b)的值”。这是您在程序中需要执行的操作,以存储结果 在汇编中,有一种特殊的方式来指定“地址”而不是“价值”,它是..........一旦你知道这一点,你应该没问题;)

修改

将结果存入寄存器后,只需将偏移量加载到另一个寄存器中,然后将[]应用于该寄存器:

mov eax, pointer
mov ecx, result
mov [eax], ecx

或,在C:

*pointer = result;