我是汇编的新手,我正在尝试交换两个数组之间的内容。我目前有这段代码,经过测试,我已经验证了它的工作原理。但是,我想知道这是否是获得所需结果的最有效的方法,或者是否有其他更有效的解决方案?
arrW WORD 100h, 200h, 300h
arrSW SWORD -140, 200, -300
mov ax, arrW
xchg ax, arrSW
xchg ax, arrW
mov ax, [arrW +2]
xchg ax, [arrSW +2]
xchg ax, [arrW +2]
mov ax, [arrW + 4]
xchg ax, [arrSW +4]
xchg ax, [arrW +4]
1条答案
按热度按时间5gfr0r5j1#
第一个让我印象深刻的是第二个
xchg
。在下面的指令中,在加载AX之前加载AX寄存器是没有意义的。因此,第一个重写也使8086的速度提高了20%,它是:避免使用
xchg
指令的解决方案在8086上不划算,但在x86上通常是可行的。例如,下一个代码片段在8086上运行速度慢10%:循环无法击败当前展开的代码,但如果数组变得更大,那么它可能会像下面这样:
如果数组 arrW 和 arrSW 在内存中彼此跟随,则相同的循环最好写为:
如果CPU支持32位寄存器,那么使用这些双字可以将所需的迭代次数减半。如果元素的计数是奇数,我们剥离一个字大小的交换:
上面的代码在循环开始时剥离了一个字大小的交换。正如@PeterCordes在这个答案下面的注解中所写的,通常把剥离的交换放在最后更好(出于数据对齐的原因)。下一个是这个版本: