【发布时间】:2019-08-24 10:12:04
【问题描述】:
即使启动问题的解决方案,我也遇到了问题。我尝试过考虑乘法是重复加法算法,但无论我考虑什么算法,我似乎都专注于一个问题——8086 中的最大寄存器大小是 16 位。
data segment
num1 dw 0102h,0304h,0506h,0708h
num2 dw 0102h,0304h
res dw ?,?,?,?,?,?
data ends
code segment
assume CS:CODE, DS:DATA
start:
mov ax,DATA
mov DS,ax
.............填写代码............
此时我被卡住了。即使是轻微的代码提示或算法也将不胜感激。
【问题讨论】:
-
将你的数字分成 16 位块,使用你的 cpu 的 16x16=>32 乘法并酌情累积部分结果。请记住,您可以使用移位轻松乘以 2 的幂,或者在这种情况下简单地索引您的单词。
-
@Jester 我几乎是汇编编程的初学者,但会进一步探索它。如果你能用更简单的语言向我解释你的答案,可能还有一些代码片段,我将非常感激。
-
(a*2^48+b*2^32+c*2^16+d) * (e*2^16+f)。所有字母都是 16 位数字。执行乘法并将结果分组。 -
@Jester 很抱歉再次给您带来困扰,但我仍然不知道如何在代码中实现乘法
-
@JackMorton - 虽然最大寄存器大小为 16 位,但乘法指令在 dx:ax 中产生 32 位乘积。扩展精度乘法的基本算法类似于进行长手乘法。首先看看你是否能弄清楚如何将 32 位数乘以 16 位数,然后将 64 位数乘以 16 位数,然后将 64 位数乘以 32 位数。
标签: algorithm assembly x86-16 bigint extended-precision