x86汇编牛顿平方根算法寄存器为1#IND

Some_Dude

我试图在下面编写C程序的汇编版本。它的意思是取9的平方根。直到第3次通过我的循环,所有东西似乎都在起作用,然后当我的上,下值被压入堆栈时,它们的上,下值就变成1#IND。我不知道为什么,因为它正确地打印在标签whileLoop下方,但是我在第二次在标签notAccurateEnough之后直接打印时得到了错误的值,即使这两个标签之间的值没有变化并且也能正常工作在之前的迭代中。
下面的屏幕截图显示了如何成功打印一次,然后在同一迭代中第二次打印失败。

成功推入

现在坏了

汇编代码:

.586
.MODEL FLAT
.STACK 4096                 
n=550
.data
    PUBLIC _sqrtX

upper REAL4 9.0
accuracy REAL4 0.00001
lower REAL4 1.0
guess REAL4 1.0
multValue REAL4 1.0
num REAL4 9.0
two DWORD 2

.code

_sqrtX  PROC

        finit   ;initialize fpu

        whileLoop:
        fld upper    ;push upper onto stack
        fld lower    ;push lower onto stack
        fsub         ;subtract upper-lower

        fld accuracy          ;push accuracy onto stack
        fcom                  ;compare accuracy with upper-lower

        fstsw ax              ;copy condition code bits to AX
        sahf                  ;shift condition code bits to flags
        jna notAccurateEnough ;jump if accuracy is greater
        jmp endnewt           ;end algorith, is less than accuracy

        notAccurateEnough:
        ;**************************
        ;************  Logic to implement:   guess = (lower + upper) / 2;
        ;**************************
        fld upper      ;push upper onto stack
        fld lower      ;push lower onto stack
        fadd           ;(lower + upper)
        fidiv two      ;divide by 2
        fstp guess     ;set guess to first stack element. guess = (lower + upper) / 2
        ;**************************

        ;**************************
        ;************  Logic to implement:  if((guess * guess) > number)
        ;**************************
        fld guess ;push guess onto stack as first element
        fld guess ;push guess onto stack again, it is now first and second element
        fmul      ;multiply first and second element
        fcom num  ;compare 9 to product of guess*guess:
        fstsw ax  ;copy condition code bits to AX
        sahf      ;shift condition code bits to flags
        jna SetLower ;if guess is less than num, call set lower and set lower = guess;
        ;*** else, guess > num
        fld guess ;push guess onto the stack
        fstp upper ;set upper equal to top of stack: upper = guess
        jmp whileLoop
        ;**************************

        setLower:
        fld guess   ;push guess onto stack
        fstp lower  ;store guess in lower
        jmp whileLoop

        endnewt:
        mov eax, 0
        ret

_sqrtX ENDP
END

我尝试在Assembly中编写的C算法:

double sqrtX (double x)
{
    const double ACCURACY=0.00001;
    double lower, upper, guess;
    double number;

    number = x;
    lower = 1;
    upper = number;

    while ((upper-lower) > ACCURACY)
    {
        guess = (lower + upper) / 2;
        if((guess * guess) > number)
        {
            upper = guess;
        }
        else
        {
            lower = guess;
        }
    }
    return (lower + upper)/2;
}
Some_Dude

堆栈溢出。每次迭代后使用清除堆栈finit,现在可以使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或and?

x86汇编寄存器和mov指令以及跳转偏移

有什么方法可以分析x86汇编源代码中寄存器的“类型”?

x86汇编gcc调用约定esp寄存器

C ++中功能钩子:获取寄存器值并跳回[Windows上的x86汇编]

带地址或寄存器的表,汇编程序x86

汇编x86寄存器已签名或未签名

在汇编x86中寄存器和堆栈的大小真正意味着什么

将字符串放入 EAX 寄存器的 x86 汇编代码

用汇编语言x86将32位寄存器[esi]的内存地址移至8位低寄存器

x86汇编编程(GAS语法):数据部分中定义的变量存储在哪些寄存器中?

x86汇编语言:如何打印十六进制寄存器值作为十进制输出?

在x86汇编中,最好使用两个单独的寄存器作为imul?

x86寄存器标志的缩写

观察x86寄存器的依赖性

使用Nasm x86 Assembly计算平方根时输出不正确

牛顿近似平方根的方法

用牛顿法确定平方根

x86_64汇编器中RBP寄存器的用途是什么?

在x86汇编中,如何将有效地址中的寄存器算术编译为字节码?

现在还值得在 x86-64 上使用 Quake 快速逆平方根算法吗?

x86_64汇编:中断标志和TPR寄存器的作用

Scheme或Common Lisp中的牛顿平方根方法

牛顿法求平方根的时间复杂度

ESP寄存器解除引用分段错误,x86

NASM x86使用不存在的段寄存器7

x86 ASM上读取寄存器的延迟语义

在寄存器中存储未签名的字符(x86程序集)

strcmp会评估哪些寄存器?x86组装