我本来应该做一个项目来通过我的课程。我想问一下,如果有可能使我的代码更有效或更好。我这样做是因为我的协调员是一个非常细致的完美主义者,对效率感到疯狂。 这是一个混合程序,它修改了一个24bpp位图。这是一个对比度减弱,算法是这样的(它批准了我的协调员):对比度降低 - 英特尔x86
comp-=128;
comp*=rfactor
comp/=128
comp+=128
“补偿”是指一个像素的每一个组成部分,从字面上:每个值的红,绿,每个像素的蓝色。 这个函数只是这样做的,我使用C中的另一个函数从文件中读取。我转发了一个包含组件的数组,每个行的像素数量,bmp的宽度和'rfactor' - 减少对比度的值。那么我只是做这个:
; void contrast(void *img, int width, int lineWidth, int rfactor);
; stack: EBP+8 -> *img
; EBP+12 -> width [px]
; EBP+16 -> lineWidth [B]
; EBP+20 -> rfactor (values in range of 1-128)
section .text
global contrast
contrast:
push ebp
mov ebp, esp
push ebx
mov ebx, [ebp+12] ; width
mov eax, [ebp+16] ; lineWidth
mul ebx ; how much pixels to reduce
mov ecx, eax ; set counter
mov edx, [ebp+8] ; edx = pointer at img
mov ebx, [ebp+20] ; ebx=rfactor
loop:
xor eax, eax
dec ecx ; decrement counter
mov al, [edx] ; current pixel to al
add eax, -128
imul bl ; pixel*rfactor
sar eax, 7 ; pixel/128
add eax, 128
mov byte[edx], al ; put the pixel back
inc edx ; next pixel
test ecx, ecx ; is counter 0?
jnz loop
koniec:
pop ebx
mov esp, ebp
pop ebp
ret
有什么需要改进的?谢谢你的所有建议,我不得不打动我的协调员;)
是否允许使用SSE 4.x和/或AVX等扩展? – 2015-06-14 19:02:20
@ knm241是的,但我不知道如何使用它在这种情况下 –
我不确定值得使用SSE4.x/AVX,因为它们需要最近的CPU进行测试。我用SIMD instrunctions写了一段代码的草图,需要做一些测试。无论如何,你可以做一些微型优化:1)使用'loop'指令而不是'jnz loop',这样你就可以避免'dec ecx'。 2)不要零eax 3)将你的等式从'out =(in-128)* r/128 + 128'改写成'out =(in * r >> 7)+ 128 - r',这样你可以预先计算' 128 -r',并简化循环(现在应该可以使用'shr',因为'in * r'是正数。4)展开循环以一次处理4个像素,一次加载它们 – 2015-06-14 20:03:46