Сборка неверный результат экспоненциальной мощности процедуры - PullRequest
2 голосов
/ 11 мая 2011

Это было задание из 2 частей. сначала я должен был выяснить, как отправить опорный параметр в процедуру, называемую pow, используя стек, что, я думаю, я сделал правильно, используя push offset result Во второй части этого задания я совершенно не в себе, я прочитал и прочитал в своем тексте но я все еще не могу понять, как я могу сделать то, что мне нужно сделать. После отправки ссылочного параметра мне нужно, чтобы сделать результат вычислений в порядке ПР стать хранящимися в эталонном параметре, поэтому он может быть выведен в программе позже. Я пробовал несколько разных вещей, но безрезультатно. Код комментируется, поэтому те, кто знаком со сборкой, должны понимать, что я пытаюсь сделать. Если кто-нибудь может мне помочь, я буду очень признателен. спасибо

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 Ответ

3 голосов
/ 11 мая 2011

Хорошо, поскольку вы используете прототип функции в стиле C, я думаю, вы знаете C. Теперь, когда вы передаете указатель на функцию, вам нужно разыменовать этот указатель для доступа к ее данным. Другими словами, разыменование - это та звездочка, которую вы ставите перед именем переменной. Пример:

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

Эти звездочки означают: «захватить значение по адресу a (или b) вместо значения a (или b)». Это то, что вам нужно сделать в своей программе, чтобы сохранить результат.
В сборке есть специальный способ указать «адрес» вместо «значение», и это .......... Как только вы это знаете, все будет в порядке;)

EDIT

Как только вы получите результат в регистре, просто загрузите в другом регистре смещение и примените [] к этому регистру:

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

или, в C:

*pointer = result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...