%include "x86inc.asm" ;void exam_1(char *pDst, char *refMain, int width, int deltaInt, int deltaFract, int refMainIndex, int l) ; { ; for (l = 0; l < width; l++) ; { ; refMainIndex = l + deltaInt + 1; ; pDst[l] = (char)(((32 - deltaFract) * refMain[refMainIndex] + deltaFract * refMain[refMainIndex + 1] + 16) >> 5); ; } ;} ;void exam_1(char *pDst, char *refMain, int deltaFract, int deltaInt, int width) cglobal exam_1_asm, 2,7,0 mov r2d, r2m mov r3d, r3m mov r6d, r4m lea r1, [r1 + r3 + 1] mov r4d, 32 sub r4d, r2d ; ***** register map ***** ; r0 = pDst ; r1 = &refMain[deltaInt + 1] ; r2 = deltaFract ; r4 = 32 - deltaFract ; r6 = width ; r3 = FREE ; r5 = FREE .loop: movzx r3d, byte [r1] imul r3d, r4d ; r3d = (32 - deltaFract) * refMain[refMainIndex] inc r1 movzx r5d, byte [r1] ; r5d = deltaFract * refMain[refMainIndex + 1] imul r5d, r2d lea r3, [r3 + r5 + 16] ; 可以使用'd'后缀的版本,会增加一字节代码长度 shr r3d, 5 mov byte [r0], r3b inc r0 ; pDst++ dec r6d jnz .loop RET |
|