关于内嵌汇编

时间:2022-03-30 14:46:39
常看到程序中内嵌汇编来提高效率的,什么样的代码段写成汇编会明显提高效率呢?

9 个解决方案

#1


学习

#2


要看情况具体而定。

#3


一般涉及大宗内存数据复制,移动的,使用内嵌汇编可以明显提高效率,VC的memcpy函数就是使用汇编的,你可以跟踪进去看看。

#4


引用 2 楼 biweilun 的回复:
要看情况具体而定。

有没有相关的资料可以参考呢?:P

#5


引用 3 楼 leither 的回复:
一般涉及大宗内存数据复制,移动的,使用内嵌汇编可以明显提高效率,VC的memcpy函数就是使用汇编的,你可以跟踪进去看看。

仅此一个方面么?:)

#6


现在编译器已经很强大了,一般我觉得会很少内嵌汇编,除非为了偷懒,比如用GetProcAddress获得某个DLL的导出函数并调用,省去了定义函数指针的麻烦。
比如调用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等都用会到内联汇编,不过这不是提高效率的

#8


6楼太牛了 
mark

#9


引用 7 楼 stjay 的回复:
LS的不是吧-.- 
内联汇编不是这么用的 

一般在 密码学 图像处理 科学计算 等方面都可用内联汇编来提高效率 
在大量的运算中的 循环中 能少执行一条指令,就可节约不少时间 

如要高级语言没 循环移位 的操作符吧,这时可用一条汇编指令实现 

一些代码优化报告都有这样的介绍 
1.使用低延迟指令,虽然某些指令功能一样,但执行周期不一样 
2.多用寄存器减少内存读写次数 
3.精心排列指令,减少附近指令的依赖关系,C…


反正我看汇编看下来,没发现多少比编译器编出来的汇编有效率,减低效率的倒是不少,比如花指令。当然某些用法必须用汇编实现,比如CreateRemoteThread不注入DLL调用目标进程1个以上参数的函数。

眼见为实,耳听为虚。现在不同于以前386的时代了,编译器的进步是突飞猛进的。release版优化过的函数,看ASM有时候要想半天才能懂。

#1


学习

#2


要看情况具体而定。

#3


一般涉及大宗内存数据复制,移动的,使用内嵌汇编可以明显提高效率,VC的memcpy函数就是使用汇编的,你可以跟踪进去看看。

#4


引用 2 楼 biweilun 的回复:
要看情况具体而定。

有没有相关的资料可以参考呢?:P

#5


引用 3 楼 leither 的回复:
一般涉及大宗内存数据复制,移动的,使用内嵌汇编可以明显提高效率,VC的memcpy函数就是使用汇编的,你可以跟踪进去看看。

仅此一个方面么?:)

#6


现在编译器已经很强大了,一般我觉得会很少内嵌汇编,除非为了偷懒,比如用GetProcAddress获得某个DLL的导出函数并调用,省去了定义函数指针的麻烦。
比如调用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等都用会到内联汇编,不过这不是提高效率的

#8


6楼太牛了 
mark

#9


引用 7 楼 stjay 的回复:
LS的不是吧-.- 
内联汇编不是这么用的 

一般在 密码学 图像处理 科学计算 等方面都可用内联汇编来提高效率 
在大量的运算中的 循环中 能少执行一条指令,就可节约不少时间 

如要高级语言没 循环移位 的操作符吧,这时可用一条汇编指令实现 

一些代码优化报告都有这样的介绍 
1.使用低延迟指令,虽然某些指令功能一样,但执行周期不一样 
2.多用寄存器减少内存读写次数 
3.精心排列指令,减少附近指令的依赖关系,C…


反正我看汇编看下来,没发现多少比编译器编出来的汇编有效率,减低效率的倒是不少,比如花指令。当然某些用法必须用汇编实现,比如CreateRemoteThread不注入DLL调用目标进程1个以上参数的函数。

眼见为实,耳听为虚。现在不同于以前386的时代了,编译器的进步是突飞猛进的。release版优化过的函数,看ASM有时候要想半天才能懂。