我正在学习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命令的限制:)
2条答案
按热度按时间holgip5t1#
......想知道我是否能做得更好。
最好使用AX寄存器来读取或写入内存。编码较短。
不要将第一个值
add
到 Y 变量中,而是将其mov
到那里。在寄存器中构建结果,并将寄存器存储在 Y 变量中。
8086...仅使用
add
、mov
和shift
计算46平方的任务8086不允许立即数移位。移位一次或使用CL寄存器中指定的计数移位。
46天== 00101110b
24字节的8086解决方案:
zzwlnbp82#
如果允许使用
sub
:如果没有: