gpt4 book ai didi

指数幂过程的 assembly 错误结果

转载 作者:行者123 更新时间:2023-12-04 06:26:40 24 4
gpt4 key购买 nike

这是一个两部分的作业。首先,我必须弄清楚如何使用堆栈将引用参数发送到名为 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

最佳答案

好的,由于您使用的是 C 风格的函数原型(prototype),我猜您知道 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;

关于指数幂过程的 assembly 错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5969263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com