📌  相关文章
📜  8086程序找到完美平方根的平方根|套装2(1)

📅  最后修改于: 2023-12-03 15:13:09.881000             🧑  作者: Mango

8086程序找到完美平方根的平方根|套装2

简介

这是一个使用8086汇编语言编写的程序,能够找到完美平方数的平方根。完美平方数是指可以表示成某个数的平方的自然数。例如,4、9、16、25、36等都是完美平方数。

实现

该程序使用了二分查找的思想,逐步逼近目标值。具体实现如下:

输入

用户需要输入一个整数n,程序将会找出小于等于n的所有完美平方数的平方根。

mov ah, 01h ; 读取键盘输入字符
int 21h ; 中断21h
sub al, 30h ; 将字符转换为数值
mov [n], al ; 存储n的值
查找

接下来,程序将会从0开始枚举所有的数字,同时使用二分查找算法来逼近目标值。在每一次循环中,程序将会计算当前数字的平方,判断其是否小于等于n。如果小于等于n,程序将会进行二分查找,逼近目标值。如果等于目标值,程序将会将当前数字压入栈中,最后统一输出所有完美平方数的平方根。

; 枚举当前数字
mov cx, 0 ; 存储当前数字
.loop:
  push cx

  ; 判断当前数字的平方是否小于等于n
  mov dx, cx
  imul dx
  cmp dx, [n]
  ja .done

  ; 二分查找目标值
  fld1 ; 压入1.0
  fld st0 ; 复制1.0
  mov bx, 11 ; 迭代次数
  .iter:
    ; 计算中间值
    fadd st0, st1
    fld1
    fdiv st0, st1
    fld dx ; 当前数字的平方
    fdiv st0, st1 ; 计算当前猜测的平方根
    fstp st0
    fmul st0, st0 ; 计算当前猜测的平方
    fsubp st1, st0 ; 计算与目标值的差值

    ; 判断是否需要继续迭代
    fcomp st0, st0
    fstsw ax
    sahf
    jz .finish
    jb .too_small
    fsub st0, st1
    .too_small:
      fxch st1
    .finish:

  ; 判断是否找到完全平方数
  fstp st0 ; 弹出差值
  test ax, 0x44 ; 判断状态字
  jnz .loop

  ; 找到完全平方数,将其存入栈中
  fstp st0 ; 弹出中间值
  fstp st0 ; 弹出1.0
  fxch st1
  push cx ; 压入完全平方数

.done:
  pop cx ; 弹出当前数字
  inc cx ; 枚举下一个数字
  cmp cx, [n]
  jle .loop
输出

最后,程序将会弹出栈中所有的完美平方数的平方根,并输出它们的值。

; 输出结果
mov ah, 02h ; 输出字符
mov dx, 0 ; 存储结果的指针
.loop:
  pop cx ; 弹出完全平方数
  mov al, '.' ; 输出小数点
  int 21h ; 中断21h
  mov al, '0' ; 输出整数部分
  add al, cl
  int 21h ; 中断21h
  mov al, '.' ; 输出小数点
  int 21h ; 中断21h
  mov dx, 2 ; 存储小数部分的长度
  lea si, [decimal] ; 存储小数部分的指针
  .decimal_loop:
    mov al, byte ptr [si] ; 输出小数部分的每一位
    int 21h ; 中断21h
    inc si
    dec dx
    jnz .decimal_loop
  mov al, ' ' ; 输出空格
  int 21h ; 中断21h
  cmp sp, bp ; 判断栈是否为空
  jne .loop
结语

该程序展示了使用8086汇编语言实现二分查找算法的方法,并且同时展示了如何在8086汇编语言中进行浮点运算。程序可以寻找小于等于输入值的所有完美平方数的平方根,并展示出结果。