能力值:
( LV13,RANK:530 )
|
-
-
4 楼
16位汇编 或许说手写汇编确实是
并且CPU也对这些指令作了一些优化。
问题是。现在几个人在用纯汇编。。所以这些意义上不大
规则倒是有一些 但是实规则不是习惯, 详细查MSDN
比如EAX放返回值 是必须,而不是习惯 。
比如Fastcall ecx edx 放参数
thiscall ecx放指针
这些都是标准规定的 而所说的ecx习惯上作为循环计数器 这种应该说很少看到,虽然有些指令比如Rep是看Cx但是编译器都会在要执行这个指令之前的最多几行内才把数据存到ECX,
C++编译器高度优化,他会将寄存器最大化利用,这种方式在循环中效果非常明显
但你说的ESP指针,在VC8里面 如果钩选了Inline和省略ESP指针 这些几乎看不到,
你看到的WINAPI 这些第一是在早期版本的VC中生成的,
2.WINAPI是稳定压倒一切,不一定要速度最大化,
所以说往往WINAPI你传递空指针也不容易异常就是这个原因,
里面对指针检查很严格
因为省略EBP指针以后虽然可以多用一个寄存器 但是必须保证ESP不能够和预订的代码有一点差距否则代码就全部出错者在WINDOWS中是不允许的,所以说你看VC7开始 都基本上默认ESP检查在每一个外部函数调用以后。
最后说一句 我们多数是在和编译器打交道,真正看程序员的汇编代码时非常非常少的 。
不要过分记住这些,多实践一下自然就知道了
如果你把这些所谓的常用含义拿去看优化编译器的化,你会觉得和预想的相差太大了
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
我个人觉得“在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别”这句话有99%的误导成分。
每个寄存器只是用做储存时才没有区别,但寄存器的主要作用并不是存储,而是作为实现cpu动作的载体,绝大部分cpu指令都有它特定使用的寄存器,所以寄存器的所谓“习惯使用”是为了配合cpu的,不是真正的主观习惯。
最迷惑的就是AX,BX,CX,DX这几个寄存器的名字,初学时以为就是ABCDEFG等等,其实并不这样。A代表累加(accumulator),B代表基址(base),C代表计数(count),D代表数据(data)。而它们各有各的作用。比如清零一段内存,最好的方法就是将eax置0,ecx放次数,edi放目标首地址,然后stos(b/w/d)。这些根本就是特性而不是习惯。至于返回值放eax,那除了是约定以外,还更是因为80x86针对操作eax的指令做了优化,尽量地使用eax可以提高程序的效率。比如
add eax, 100的指令码为05 00 01 00 00
add ebx, 100的指令码为81 C3 00 01 00 00
用eax就省出1字节了。
而esp作为栈顶指针,更是不能不服从的,因为push和pop用的一定是esp。esi和edi因为串处理指令的缘故而用在源数据指针和目的数据指针。
因此这些所谓的习惯都是缘由自cpu的指令,楼主接触汇编指令多了以后,自然而然也会被迫“养成习惯”的了^_^
|
能力值:
( LV13,RANK:530 )
|
-
-
6 楼
最好的方法就是将eax置0,ecx放次数,edi放目标首地址,然后stos(b/w/d)。
你看过目前的C语言编译器有这句话嘛?
不要忘记了80386以后CPU执行简单指令会比执行复杂指令快的多
好比说目前的P4内部有三个简单解码器 而只有一个复杂解码器
这也是为什么编译器很多时候不用直接出发要转换为一些Shl指令的原因
另外执行速度主要不是看字节的长度
而现在的及其哪个不是XXXmB++ 那几个字节已经不是追求的目标了
所以说你看 INTER优化版编译器 有一个LOOP展开
就是花内存来换取速度
|
能力值:
( LV13,RANK:530 )
|
-
-
9 楼
00401024 mov ecx,19h
00401029 lea esi,[esp+10h]
0040102D lea edi,[esp+74h]
00401031 rep movs dword ptr es:[edi],dword ptr [esi]
复制100字节
复制100个字节
INTER编译器
memcpy(str2,str1,100);
00401025 mov eax,dword ptr [str1]
00401028 mov dword ptr [str2],eax
0040102B mov edx,dword ptr [ebp-14h]
0040102E mov dword ptr [ebp-8],edx
00401031 mov ecx,dword ptr [ebp-10h]
00401034 mov dword ptr [ebp-4],ecx
00401037 mov eax,dword ptr [str2]
0040103A mov dword ptr [ebp],eax
0040103D mov eax,dword ptr [ebp-8]
00401040 mov dword ptr [ebp+4],eax
00401043 mov eax,dword ptr [ebp-4]
00401046 mov dword ptr [ebp+8],eax
00401049 mov eax,dword ptr [ebp]
0040104C mov dword ptr [ebp+0Ch],eax
0040104F mov eax,dword ptr [ebp+4]
00401052 mov dword ptr [ebp+10h],eax
00401055 mov eax,dword ptr [ebp+8]
00401058 mov dword ptr [ebp+14h],eax
0040105B mov eax,dword ptr [ebp+0Ch]
0040105E mov dword ptr [ebp+18h],eax
00401061 mov eax,dword ptr [ebp+10h]
00401064 mov dword ptr [ebp+1Ch],eax
00401067 mov eax,dword ptr [ebp+14h]
0040106A mov dword ptr [ebp+20h],eax
0040106D mov eax,dword ptr [ebp+18h]
00401070 mov dword ptr [ebp+24h],eax
00401073 mov eax,dword ptr [ebp+1Ch]
00401076 mov dword ptr [ebp+28h],eax
00401079 mov eax,dword ptr [ebp+20h]
0040107C mov dword ptr [ebp+2Ch],eax
0040107F mov eax,dword ptr [ebp+24h]
00401082 mov dword ptr [ebp+30h],eax
00401085 mov eax,dword ptr [ebp+28h]
00401088 mov dword ptr [ebp+34h],eax
0040108B mov eax,dword ptr [ebp+2Ch]
0040108E mov dword ptr [ebp+38h],eax
00401091 mov eax,dword ptr [ebp+30h]
00401094 mov dword ptr [ebp+3Ch],eax
00401097 mov eax,dword ptr [ebp+34h]
0040109A mov dword ptr [ebp+40h],eax
0040109D mov eax,dword ptr [ebp+38h]
004010A0 mov dword ptr [ebp+44h],eax
004010A3 mov eax,dword ptr [ebp+3Ch]
004010A6 mov dword ptr [ebp+48h],eax
004010A9 mov eax,dword ptr [ebp+40h]
004010AC mov dword ptr [ebp+4Ch],eax
004010AF mov eax,dword ptr [ebp+44h]
004010B2 mov dword ptr [ebp+50h],eax
004010B5 mov eax,dword ptr [ebp+48h]
004010B8 mov dword ptr [ebp+54h],eax
1000字节 P4优化
004021C0 sub ecx,20h
004021C3 movdqa xmm3,xmmword ptr [esi+10h]
004021C8 movdqa xmm0,xmmword ptr [esi+20h]
004021CD add esi,20h
004021D0 psrldq xmm1,8
004021D5 movdqa xmm2,xmm3
004021D9 pslldq xmm3,8
004021DE por xmm3,xmm1
004021E2 psrldq xmm2,8
004021E7 movdqa xmm1,xmm0
004021EB pslldq xmm0,8
004021F0 por xmm0,xmm2
004021F4 movdqa xmmword ptr [edx],xmm3
004021F8 movdqa xmmword ptr [edx+10h],xmm0
004021FD add edx,20h
00402200 cmp ecx,20h
00402203 jge 004021C0
速度自己去测。
REP STOS 估计就只有一种用法吧MEMSET?
SSE3优化
004021F0 sub ecx,80h
004021F6 movdqa xmmword ptr [edx],xmm0
004021FA movdqa xmmword ptr [edx+10h],xmm0
004021FF movdqa xmmword ptr [edx+20h],xmm0
00402204 movdqa xmmword ptr [edx+30h],xmm0
00402209 movdqa xmmword ptr [edx+40h],xmm0
0040220E movdqa xmmword ptr [edx+50h],xmm0
00402213 movdqa xmmword ptr [edx+60h],xmm0
00402218 movdqa xmmword ptr [edx+70h],xmm0
0040221D add edx,80h
00402223 cmp ecx,80h
00402229 jge 004021F0
现在的编译器。。。都是这样。喜欢用体积换时间
|