assembly 只使用add/mov/shift指令乘以46?关于如何改进代码的想法

jyztefdp  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(152)

我正在学习Asm.8086在我自己从一个在线课程,并有一个任务平方的数字46(46^2=2116)只使用添加,移动和移位命令.
我已经做到了,但我很想知道我是否可以做得更好:)
变量:

X dw 46d
 Y dw 0

代码:

mov cx, [X]
shl cx, 5 // cx=1472d
add [Y], cx // Y=1472d
sar cx, 2 // cx=368d
add [Y], cx // Y=1840d
sar cx, 1 // cx=184d
add [Y], cx // Y=2024d
sar cx, 1 // cx=92d
add [Y], cx // Y=2116d

最后,我检查了变量Y,根据需要它是2116,但是因为这是我第一次在Assembly上这样做,所以我相信有更好的方法来做这样的事情(考虑到只使用add、mov和shift命令的限制:)

holgip5t

holgip5t1#

......想知道我是否能做得更好。

mov cx, [X]
add [Y], cx
add [Y], cx
add [Y], cx
add [Y], cx

最好使用AX寄存器来读取或写入内存。编码较短。
不要将第一个值addY 变量中,而是将其mov到那里。
在寄存器中构建结果,并将寄存器存储在 Y 变量中。

8086...仅使用addmovshift计算46平方的任务

shl cx, 5
sar cx, 2

8086不允许立即数移位。移位一次或使用CL寄存器中指定的计数移位。
46天== 00101110b

46 * 46
<=> 46 * (2 + 4 + 8 + 32)
<=> (46 * 2) + (46 * 4) + (46 * 8) + (46 * 32)
<=> (46 << 1) + (46 << 2) + (46 << 3) + (46 << 5)

24字节的8086解决方案:

mov  ax, [X]    ; AX =   46
shl  ax, 1      ; AX =   92
mov  bx, ax     ; BX =   92
shl  ax, 1      ; AX =  184
add  bx, ax     ; BX =  276
shl  ax, 1      ; AX =  368
add  bx, ax     ; BX =  644
shl  ax, 1      ; AX =  736
shl  ax, 1      ; AX = 1472
add  ax, bx     ; AX = 2116
mov  [Y], ax    ;  Y = 2116
zzwlnbp8

zzwlnbp82#

如果允许使用sub

;compute 2(16x+7x) = 2*23x = 46x
mov cx,46
mov dx,cx   ;back up cx
shl cx,4    ;46 * 16
mov bx,dx   ;back up dx
shl dx,3    ;46 * 8 (one too high, we'll reduce it to 46 * 7)
sub dx,bx   ;46 * 7
add dx,cx   ;(46 * 16) + (46 * 7)
add dx,dx   ;2 * ((46 * 16) + (46 * 7))

如果没有:

mov ax,46
mov bx,ax
mov cx,ax
mov dx,ax  ;four copies of the input.

shl ax,4
shl bx,2
shl cx,1
;(16x + 4x + 2x + x)
add ax,bx
add ax,cx
add ax,dx
add ax,ax ;multiply by 2, result is in ax

相关问题