assembly 如何在8086汇编中不使用MUL或DIV而在5行中将一个数乘以42?

nsc4cvqm  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(137)

我遇到了这样的问题,我被要求在不使用任何muldiv指令的情况下将BX乘以42,可能是使用了shlshr。它还需要在5行中完成。
你怎么会做这种事?
我没有尝试任何东西,但上面的要求是在1行中将BX乘以32,所以我只使用了SHL BX, 5

7eumitmz

7eumitmz1#

因子42(十进制)等于0101010(二进制),在此表示法中,1的顺序为1、3、5,因此结果为

21 * N + 23 * N + 25 * N = 42 * N

该代码假定CPU Intel 186或更高,并且因子N加载在BX中;产品也以BX形式返回。
不幸的是,它需要六条指令,我没有设法抽出一条线。

SHL BX,1   ; BX=2*N
MOV AX,BX  ; AX=2*N
SHL BX,2   ; BX=8*N
ADD AX,BX  ; AX=2*N + 8*N
SHL BX,2   ; BX=32*N
ADD BX,AX  ; BX=2*N + 8*N + 32*N = 42*N
ebdffaop

ebdffaop2#

三个解决方案,有6行,可以在emu 8086上运行,因为该模拟器允许立即计数移位,与真实的的8086 CPU所允许的相反!
在输入BX = N时

shl bx, 1   ; BX = N * 2 
mov ax, bx  ; AX = N * 2
shl bx, 2   ; BX = N * 8
add bx, ax  ; BX = N * 10
shl bx, 2   ; BX = N * 40
add bx, ax  ; BX = N * 42

mov ax, bx  ; AX = N
shl bx, 2   ; BX = N * 4
add ax, bx  ; AX = N * 5
shl bx, 2   ; BX = N * 16
add bx, ax  ; BX = N * 21
shl bx, 1   ; BX = N * 42

但上述要求是在1行中将BX乘以32

mov ax, bx  ; AX = N
shl bx, 5   ; BX = N * 32
shl ax, 1   ; AX = N * 2 
add bx, ax  ; BX = N * 34
shl ax, 2   ; AX = N * 8
add bx, ax  ; BX = N * 42

相关assembly 8086 multiply 41 without using MUL

相关问题