查看完整版本: [-- [灌水] Table[(addr)>>29]|((addr)&0x0FFFFFFF 的X86汇编? --]

-> 同人游戏创作/Doujin Games Workshop -> [灌水] Table[(addr)>>29]|((addr)&0x0FFFFFFF 的X86汇编? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

littlewater 2010-01-23 08:42

[灌水] Table[(addr)>>29]|((addr)&0x0FFFFFFF 的X86汇编?

很久没在这里发帖灌水

已知 UINT32 Table[];

如何对Table[(addr)>>29]|((addr)&0x0FFFFFFF手动X86汇编?

自己的写法(这样写,然后用的是nasm汇编器,在VC下面跑出来的反汇编指令恰好一样(才知道可能会不一样|||)):


  1. mov ecx, eax
    and eax, 0x0FFFFFFF            ; addr & 0xFFFFFFF
    shr ecx, 29                               ; addr >> 29
    or  eax, [_Table + ecx * 4]     ; _Table[addr >> 29] | (addr & 0xFFFFFFF)


但是水水知道汇编代码需要考虑每个指令(字节)长度、还有指令顺序之类的……
想一并请教一下~

sjmind 2010-01-23 17:26
没看懂问题
nasm本身距离标准的X86就远的去了,很多问题可以不用考虑的
话说,"字节长度、指令顺序"你想说的是什么问题?
eax系列都是以字为单位的,但是字节长度是什么意思?标准x86貌似都是8bits
指令顺序是指为了减少流水线损耗调整指令顺序?nasm的话可以不考虑这个,nasm默认就是两遍优化,包含了处理器优化的(貌似)但实际上,在CISC里面考虑这个问题没大意义

littlewater 2010-01-23 18:04
=x= 我外行人嘛^^

原来它内部也会重新修改代码? 可是好像编出来的和我写的也没差别呀^^

sjmind 2010-01-23 22:10
まっ
nasm本身就是比较高级的汇编,这种东西考虑得少点反而会比较好。
(其实如果不强求自己写汇编的话,可以用高级语言的优化,只要不涉及类相关的代码,优化的结果绝大部分都是最优解了)
当然如果是给RISC编程、或者用gas汇编的话,再开始考虑这种问题会比较好。

ryuka 2010-01-24 22:51
很奇怪水水姐这个代码是来做啥的=v= 哪个问题需要这样的code,貌似用addr做个伪handle还是啥..

littlewater 2010-01-30 09:35
有些东西,去研究它并没有太多意义了……譬如猜测出处=_,=+

好像这个的确没有啥可以改进的吧?

sjmind 2010-01-30 11:33
这么短的代码,总共也没几个解
应该是最优解没错了(除非后续代码可能会使得这个局部最优解不能导致全局最优解)

littlewater 2010-01-30 19:51
那下次再来问好了嗯^^


查看完整版本: [-- [灌水] Table[(addr)>>29]|((addr)&0x0FFFFFFF 的X86汇编? --] [-- top --]


Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.024817 second(s),query:2 Gzip enabled