【问题标题】:How to get the square of a number in assembly如何在汇编中获得数字的平方
【发布时间】:2020-04-27 17:47:03
【问题描述】:

我试图得到 09 之间的数字的平方,然后我将使用该 数字 来创建 矩形的strong>高度。

我尝试的是使用 sum 方法 Ex: 5*5 = 255+5+5+5+5 = 25

;Keyboard Input
mov ah, 3Fh
mov bx, 0
mov cx, 1
mov dx, num
int 21h

;Multiplication
sub [num], 48
mov al,[num]
mov bl,[num]
mult:
 add al, [num]
 dec bl
 jnz mult

我想知道这是否正确,因为当我插入数字 7 (7*7) = 49 时,我认为它超过了 50 的值strong>(矩形长度);

当插入数字 0 时,会发生这种奇怪的行为

创建矩形的代码:

mov [height], al
mov cx, [pos_x]
mov dx, [pos_y]

loop_y:

 loop_x:
  mov ah, 0ch
  mov al, [cor]
  mov bh, 0
  int 10h
  inc cx
  dec [length]
  jnz loop_x

 inc [pos_y]
 mov dx, [pos_y]
 mov cx, [pos_x]
 mov [length], 50
 dec [height]
 jnz loop_y 

一切都需要FASM兼容。

【问题讨论】:

  • 是否允许使用 x87 浮点单元?
  • 另外,您确定要 平方根 而不是 平方吗? 要将数字平方(即与自身相乘),请使用mulimul 指令。有关详细信息,请参阅指令集参考。
  • 我想要平方,是的,不是平方根。
  • 然后阅读mulimul 说明。
  • 我能用 mul 做到这一点,谢谢。

标签: assembly x86-16 fasm


【解决方案1】:
  mov al,[num]
  mov bl,[num]
mult:
  add al, [num]
  dec bl
  jnz mult

我想知道这是否正确,因为当我插入数字 7 (7*7) = 49 时,我认为它超过了 50(矩形的长度)的值;

如果您按照加法方案 7+7+7+7+7+7+7 编写此乘法,您会注意到有 6 个加法。您的程序执行 7 加法,因此您得到 56 作为最终结果!

你有两个选择。

  • 要么你少加 1 次

      mov al, [num]
      mov bl, [num]
      dec bl
    mult:
      add al, [num]
      dec bl
      jnz mult
    
  • 或者你从 0 开始结果 (AL)。

      mov al, 0
      mov bl, [num]
    mult:
      add al, [num]
      dec bl
      jnz mult
    

当插入数字 0 时,会发生这种奇怪的行为:

因为减量 dec bl 将从 0 回绕到 255,这一次您的程序将执行 256 次 0 加法,结果为 0。
稍后您的绘图例程将使用此 0 而不进行检查,并且还会循环 256 次。


指令集有一个乘法指令。你的代码变成:

mov al, [num]
mul al           ; -> AX = AL * AL

为什么将乘法的结果存储在ax中?

为了适应乘法的最大可能结果。
考虑计算 255 * 255,其乘积为 65025。您需要一个 16 位容器来存储这个整体。它是AX 寄存器,因为CPU 的设计者通过mul 选择专门使用累加器进行乘法运算。在后来的 x86 架构中,imul 指令得到了增强,因此它可以使用任何通用寄存器来保存结果。

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多