如何仅使用位移和加法进行乘法和除法?
我该怎么办......
乘以两个64位数
乘以两个16位十六进制数
......使用汇编语言.
我只允许使用寄存器%eax,%ebx,%ecx,%edx和堆栈.
编辑:哦,我在x86
EDIT2 上使用ATT语法:不允许反编译成程序集...
假设我想在汇编中将一个大数乘以另一个(可能很小)的数。大数(被乘数)DX:AX保存在BX. 该MUL指令仅对 进行操作AX。那么该怎么办DX呢?
例如,数字是0001:0000H(65536),我想将其乘以 2。
number dw 0000h, 0001h
...
mov ax, [number]
mov dx, [number+2]
mov bx, 2
mul bx ; it is ax*2 or 0000*2
Run Code Online (Sandbox Code Playgroud)
所以结果为零!对此有什么想法吗?
我什至在启动问题的解决方案时遇到问题。我曾尝试考虑乘法是重复加法算法,但无论我考虑什么算法,我似乎都专注于一个问题——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
Run Code Online (Sandbox Code Playgroud)
.....填写代码.......
在这一点上,我被卡住了。即使是轻微的代码提示或算法也将不胜感激。
我如何将汇编中的两个 32 位数字或一个 32 位与另一个 16 位相乘,有人知道算法吗?
data1 dw 32bit
data2 dw 32bit
mov ax,data2
Mul data1
Run Code Online (Sandbox Code Playgroud)