9 个解决方案
#1
学习
#2
要看情况具体而定。
#3
一般涉及大宗内存数据复制,移动的,使用内嵌汇编可以明显提高效率,VC的memcpy函数就是使用汇编的,你可以跟踪进去看看。
#4
有没有相关的资料可以参考呢?:P
#5
仅此一个方面么?:)
#6
现在编译器已经很强大了,一般我觉得会很少内嵌汇编,除非为了偷懒,比如用GetProcAddress获得某个DLL的导出函数并调用,省去了定义函数指针的麻烦。
比如调用MessageBox,假设MessageBox没有定义。
这样就不用定义函数指针了,也省得强制转换。
还有,像strcpy这样的函数,其实编译器自动编译成汇编了,并不是while (*dst++ = *src++ !=0) 这样的形式,而是每4个字节放入一个寄存器一起复制的,就算你用内联汇编,估计这代码也写不出来,我是看了半天才看懂,非常妙。
关键代码:
比如调用MessageBox,假设MessageBox没有定义。
char* lpsz="111";
GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxA");
__asm
{
push 0
push lpsz
push lpsz
push 0
call eax
}
这样就不用定义函数指针了,也省得强制转换。
还有,像strcpy这样的函数,其实编译器自动编译成汇编了,并不是while (*dst++ = *src++ !=0) 这样的形式,而是每4个字节放入一个寄存器一起复制的,就算你用内联汇编,估计这代码也写不出来,我是看了半天才看懂,非常妙。
关键代码:
mov edx,7efefeffh
mov eax,dword ptr [ecx] ; ecx: src指针
add edx,eax
not eax
xor eax,edx
test eax,81010100h ;判断eax里是否有一个byte为0
je xxx
jmp xxx
#7
LS的不是吧-.-
内联汇编不是这么用的
一般在 密码学 图像处理 科学计算 等方面都可用内联汇编来提高效率
在大量的运算中的 循环中 能少执行一条指令,就可节约不少时间
如要高级语言没 循环移位 的操作符吧,这时可用一条汇编指令实现
一些代码优化报告都有这样的介绍
1.使用低延迟指令,虽然某些指令功能一样,但执行周期不一样
2.多用寄存器减少内存读写次数
3.精心排列指令,减少附近指令的依赖关系,CPU可以乱序执行指令,这样可增加并发程度
4.使用MMX、SSE、SSE2、SSE3指令
顺便说说,只是关于Windows的
驱动编写,PE加壳,Hook API等都用会到内联汇编,不过这不是提高效率的
内联汇编不是这么用的
一般在 密码学 图像处理 科学计算 等方面都可用内联汇编来提高效率
在大量的运算中的 循环中 能少执行一条指令,就可节约不少时间
如要高级语言没 循环移位 的操作符吧,这时可用一条汇编指令实现
一些代码优化报告都有这样的介绍
1.使用低延迟指令,虽然某些指令功能一样,但执行周期不一样
2.多用寄存器减少内存读写次数
3.精心排列指令,减少附近指令的依赖关系,CPU可以乱序执行指令,这样可增加并发程度
4.使用MMX、SSE、SSE2、SSE3指令
顺便说说,只是关于Windows的
驱动编写,PE加壳,Hook API等都用会到内联汇编,不过这不是提高效率的
#8
6楼太牛了
mark
mark
#9
反正我看汇编看下来,没发现多少比编译器编出来的汇编有效率,减低效率的倒是不少,比如花指令。当然某些用法必须用汇编实现,比如CreateRemoteThread不注入DLL调用目标进程1个以上参数的函数。
眼见为实,耳听为虚。现在不同于以前386的时代了,编译器的进步是突飞猛进的。release版优化过的函数,看ASM有时候要想半天才能懂。
#1
学习
#2
要看情况具体而定。
#3
一般涉及大宗内存数据复制,移动的,使用内嵌汇编可以明显提高效率,VC的memcpy函数就是使用汇编的,你可以跟踪进去看看。
#4
有没有相关的资料可以参考呢?:P
#5
仅此一个方面么?:)
#6
现在编译器已经很强大了,一般我觉得会很少内嵌汇编,除非为了偷懒,比如用GetProcAddress获得某个DLL的导出函数并调用,省去了定义函数指针的麻烦。
比如调用MessageBox,假设MessageBox没有定义。
这样就不用定义函数指针了,也省得强制转换。
还有,像strcpy这样的函数,其实编译器自动编译成汇编了,并不是while (*dst++ = *src++ !=0) 这样的形式,而是每4个字节放入一个寄存器一起复制的,就算你用内联汇编,估计这代码也写不出来,我是看了半天才看懂,非常妙。
关键代码:
比如调用MessageBox,假设MessageBox没有定义。
char* lpsz="111";
GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxA");
__asm
{
push 0
push lpsz
push lpsz
push 0
call eax
}
这样就不用定义函数指针了,也省得强制转换。
还有,像strcpy这样的函数,其实编译器自动编译成汇编了,并不是while (*dst++ = *src++ !=0) 这样的形式,而是每4个字节放入一个寄存器一起复制的,就算你用内联汇编,估计这代码也写不出来,我是看了半天才看懂,非常妙。
关键代码:
mov edx,7efefeffh
mov eax,dword ptr [ecx] ; ecx: src指针
add edx,eax
not eax
xor eax,edx
test eax,81010100h ;判断eax里是否有一个byte为0
je xxx
jmp xxx
#7
LS的不是吧-.-
内联汇编不是这么用的
一般在 密码学 图像处理 科学计算 等方面都可用内联汇编来提高效率
在大量的运算中的 循环中 能少执行一条指令,就可节约不少时间
如要高级语言没 循环移位 的操作符吧,这时可用一条汇编指令实现
一些代码优化报告都有这样的介绍
1.使用低延迟指令,虽然某些指令功能一样,但执行周期不一样
2.多用寄存器减少内存读写次数
3.精心排列指令,减少附近指令的依赖关系,CPU可以乱序执行指令,这样可增加并发程度
4.使用MMX、SSE、SSE2、SSE3指令
顺便说说,只是关于Windows的
驱动编写,PE加壳,Hook API等都用会到内联汇编,不过这不是提高效率的
内联汇编不是这么用的
一般在 密码学 图像处理 科学计算 等方面都可用内联汇编来提高效率
在大量的运算中的 循环中 能少执行一条指令,就可节约不少时间
如要高级语言没 循环移位 的操作符吧,这时可用一条汇编指令实现
一些代码优化报告都有这样的介绍
1.使用低延迟指令,虽然某些指令功能一样,但执行周期不一样
2.多用寄存器减少内存读写次数
3.精心排列指令,减少附近指令的依赖关系,CPU可以乱序执行指令,这样可增加并发程度
4.使用MMX、SSE、SSE2、SSE3指令
顺便说说,只是关于Windows的
驱动编写,PE加壳,Hook API等都用会到内联汇编,不过这不是提高效率的
#8
6楼太牛了
mark
mark
#9
反正我看汇编看下来,没发现多少比编译器编出来的汇编有效率,减低效率的倒是不少,比如花指令。当然某些用法必须用汇编实现,比如CreateRemoteThread不注入DLL调用目标进程1个以上参数的函数。
眼见为实,耳听为虚。现在不同于以前386的时代了,编译器的进步是突飞猛进的。release版优化过的函数,看ASM有时候要想半天才能懂。