|
发表于 2009-2-9 19:15:11
|
显示全部楼层
是的, AMD 的cpu的确有过人的地方,虽然主频不高,但执行效率却远远强于 intel,这点从我以前写vb代码的经验上就感觉到了,特别是循环,感觉那效率要比intel高出N个数量级的效率,我还写过这方面的讨论,在这论坛上发过,但无人理解,被我删了
把我知道的和想起来的再说些,inc 这个指令也是影响标志位的,但有资料说,这个指令是属于基本指令,他具有不可打断的性质,在执行其他指令操作时,都可能因线程切换等其他原因,被系统时钟中断打断,而inc 是无法打断的. 另据资料... 对寄存器的操作,尽量使用 eax 来完成,据说 eax 被特殊优化了,效率要比其他寄存器更高,对于代码的优化,其实不应该只从速度方面考虑,有的速度确实很快,但可能导致指令码长度大量增加,有的很慢,但可能只用两3行就实现了需要的效果.不应该只考虑效率问题,在16时代,指令长度也是个很重要的问题. mov eax,-1 和 or eax,-1 相比.... 理论上来说可能mov可能更快点,因为对标志位的影响也是需要耗时的.
对于 inc 快还是 add 快,我坚持 inc ,原因和楼上发现 amd 的问题,差不多,不同的cpu可能有不同的结果,单纯的测试毫无意义.
以 intel 来说,每个系列的cpu都有他的特殊性,表现在对某些指令执行速度上
对于跳转指令,我认为应该用 ja,jg,jl,je,jo 等单条件跳转指令,向 jne,jng,jle,jnl.... 多重条件指令,我认为单条件指令可能更快.
这些东西我不会去测试,对我来说,我认为基本意义不大,我只简直自己的观点,按自己的认为的可能的情况做了.
我也有个代码,谁有兴趣.一起讨论下,帮我改改
cVal proc cstring
; invoke cVal,ctext("123ad546hsg") , eax = 123546
; ErrorResult = OF is 1 = eax = 0
invoke lstrlen,cstring '这个谁帮忙写个 rep cmps ...懒的弄了,这东西我居然写了10个小时
mov ecx,eax
cmp ecx,13
jl ready
mov ecx,12
ready: lea edi,cstring
mov edi,[edi]
dec edi
xor esi,esi
mov eax,1
xor edx,edx
@@:
mov dl,[edi+ecx]
cmp edx,030h
jl Nextlop
cmp edx,039h
jg Nextlop
sub edx,030h
cmp eax,1
jne mul1
mov eax,0ah
mov ebx,edx
jmp putdat
mul1:
mov ebx,eax
mul edx
xchg ebx,eax
mov edx,10
mul edx
jo ErrOF
putdat:
add esi,ebx
Nextlop:sub ecx,1
jne @B
mov eax,esi
ret
ErrOF: xor eax,eax
ret
cVal endp
一个让我写了整整一夜,的 val 函数.......而且很烂我也承认......-_-""" i..... 别问为什么,有好的建议请告诉我
我的想法是,减少乘法的次数,而且最好支持无符号乘法...
[ 本帖最后由 PctGL 于 2009-2-9 19:50 编辑 ] |
|