我有一个512字节长的数据的二进制块,我想知道如果我想将它转移一次,最有效的方法是什么。我现在最好的猜测是(现在对程序集来说很新),我将不得不首先检查一个块(可能是int),看看它会移出什么,移位,然后进入前一个int会发生什么变化然后继续执行这个数据下移。有更容易的方法吗?如果我必须使用这种携带技术,我可以移动的最大块是什么?双字?四字?8086装配中的大二进制位移?
2
A
回答
2
如果您只想移位一次,请使用旋转进位指令。
首先,确保进位标志为零。然后:
- 拉4个字节到寄存器
- RCR
- 下一个4个字节
0
的x86处理器有一个奇妙的作品为进位标志写回
scr
和scl
。 http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Shift_With_Carry_Instructions
1
即使对于大型内存结构,在x86下移动也非常简单。
1)设置或清除进位标志取决于你不会作为结果的第一位(LSB)。
2)没有必要拉数据寄存器你可以一次过像内存直接换档32位:
rcr dword ptr[edx], 1
甚至更好
rcr dword ptr[edx + ecx *4], 1
其中ECX是一个循环计数器和edx一个内存指针。
2)储存最后移进位
编辑: 在内存,你可以在一次32位转移,不要忘记对内存aligment,移位32位双字aligend提高执行速度。
相关问题
- 1. 装配 - 二进制炸弹
- 2. 在C++中移位二进制数字
- 3. 如何从二进制数总成8086
- 4. int的二进制移位不可能
- 5. 二进制位的参数匹配
- 6. 装配8086程序 - 装配错误
- 7. C#二进制移位自动旋转
- 8. 通过移位显示二进制数
- 9. 8086程序集读写二进制文件的中断?
- 10. 装配8086 - TD卡住
- 11. 装配GAS转换器十六进制的二进制
- 12. One的二进制补码8位有符号的大小,以二进制
- 13. 如何在16位二进制,32位二进制和64位二进制中编写整数值“60”
- 14. C++将二进制转换为大于64位的位的十进制
- 15. 8086装配时间打印中断
- 16. 拆分以二进制个位数2个位数二进制
- 17. 程序集8086:将8位二进制数转换为其灰数相等?
- 18. 装配8086 |一个数组的总和,打印多位数字
- 19. Arduino中的二进制移位寄存器操作
- 20. 如何按位移动java中的二进制字符串?
- 21. Python中的二进制相移键控
- 22. 移在C++中的二进制数据
- 23. 使用按位和位移转换为二进制
- 24. 装配移位操作?
- 25. 二进制十进制负数位集
- 26. 偏移二进制格式
- 27. 蛇组装8086:无法正确移动
- 28. C中的位图,二进制运算
- 29. C中BigInteger的二进制/位操作#
- 30. 大十六进制到二进制