【发布时间】:2021-07-06 00:42:26
【问题描述】:
我目前正试图弄清楚如何将指针寄存器SI 指向的内存中的第一个字节添加到AX 寄存器的当前内容中。
因此,如果SI 拥有某个地址,并且该地址在内存中的值是:00 和 01,我希望将 00 添加到 AX 寄存器中。
我的组装新手自己尝试的第一条指令是add ax, byte ptr [SI],但当然不是骰子,因为我正在尝试添加不同大小的操作数。
我目前的解决方法是
mov dx,0000h ;empty the contents of dx
mov dl,byte ptr [si] ;get the value of the first byte in a register
add ax,dx ;perform the originally desired addition
但这非常浪费,并且真的会影响我执行的指令计数(这是运行多次的子程序的一部分)。
我仅限于 8086 指令集,所以 this question/answer by Peter Cordes 建议 movzx 压缩我的前两行很遗憾是不可行的。
【问题讨论】:
-
xor dx, dx将是一个较短的编码。如果您必须完全减少指令数,则必须找到一些高 8 位已经为零的寄存器。也许有一个您没有使用的寄存器,您可以在程序的生命周期内将高 8 位保留为零。 -
谢谢你,如果可行,我会尝试实施并关闭问题。
-
似乎指令计数只减少了少量(讲师提供了一个驱动程序,该程序执行分级并计算作为该指标的一部分执行的指令)不幸的是,也是因为驱动程序(这是我的子例程 [callee] 的调用者er)我不确定在程序的生命周期内哪个寄存器可能是空的。感谢您的帮助 - 看来我必须查看我的决策逻辑以进一步减少计数。
-
我认为我需要一个正式的答案来结束这个问题 - 我很乐意这样做,因为这确实帮助我减少了我提供的信息的指令数。
标签: assembly x86-16 masm micro-optimization zero-extension