如何在汇编中得到一个数的平方
How to get the square of a number in assembly
我正在尝试计算 0 和 9 之间的数字的平方,然后我将使用 number 创建 矩形 的 height。
我试过的是使用求和方法 Ex: 5*5 = 25
和 5+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
指令得到了增强,因此它可以使用任何通用寄存器来保存结果。
我正在尝试计算 0 和 9 之间的数字的平方,然后我将使用 number 创建 矩形 的 height。
我试过的是使用求和方法 Ex: 5*5 = 25
和 5+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
指令得到了增强,因此它可以使用任何通用寄存器来保存结果。