如何在汇编中得到一个数的平方

How to get the square of a number in assembly

我正在尝试计算 09 之间的数字的平方,然后我将使用 number 创建 矩形 height

我试过的是使用求和方法 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的值(矩形长度);

并且当插入数字 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 兼容。

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

I am wondering if this correct because when I insert the number 7 (7*7) = 49 I think it exceeds the value of 50 (length of the rectangle);

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

您有 2 个选择。

  • 要么少做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
    

And when the number 0 is inserted this strange behaviour happens:

因为递减 dec bl 将从 0 循环到 255,这次您的程序将执行 256 次 0 的加法,得到 0 结果。
稍后你的绘图例程将使用这个 0 而不检查并循环 256 次。


指令集有乘法指令。您的代码变为:

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

Why is the result of the multiplication stored in ax?

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