|
发表于 2021-1-12 17:10:30
|
显示全部楼层
河南省商丘市
.586 .model flat,stdcall option casemap:none .code ;若没有特别需求请不要改动已有的几行。 ;请在下面至'end'前输入相关代码: a proc dtsj,xtsj,hswc:byte,h,lswc:byte,l,nswc:byte,n,whz,whz1,fhx,fhx1,fhy,fhy1,qsx,qsx1,qsy,qsy1,zdx,zdx1,zdy,zdy1 local @xtk ;小图宽 local @xtg ;小图高 ;local @xtws ;小图位数这个不需要 local @xtsmh ;小图扫描行 local @xtsw:byte local @dtk local @dtg ;local @dtws ;大图位数这个不需要 local @dtsmh local @dtsw:byte;色位=3 local @yxbwhcj ;允许不吻合差距 local @dtx ;大图X local @dty ;大图Y local @xtx ;小图X local @xty ;小图Y ;local @dtxsmpy;大图X扫描偏移 ;local @xtxsmpy;小图X扫描偏移 local @dtlsypy;大图临时Y偏移 local @xtlsypy;小图临时Y偏移 local @kc ;宽差 local @gc ;高差 local @dqx ;当前x local @dqy ;当前y local @ywh ;已吻合 local @bwh ;不吻合 local @xtjds ;小图基点色 push edi push esi mov eax,dtsj mov edi,[eax] test edi,edi je exit mov bx,[edi+8] mov eax,[edi+4] ;看字节集长度//放前面点可以快点 cmp bx,4D42h ;bmp的头是424D jne exit cmp eax,55 ;位图头必须是54 jb exit ;头小于54就跳出 mov ecx,[edi+8+16h] ;/////////////////////////////////////◆大图高=大图数据[23]+左移(大图数据[24],8)-1 dec ecx mov @dtg,ecx movzx ebx,byte ptr [edi+8+1ch] ;/////////////////////●大图位数=大图数据[29] mov eax,[edi+8+12h] ;/////////////////////●大图宽=大图数据[19]+左移(大图数据[20],8)-1 dec eax mov @dtk,eax ;第五个局部变量=大宽度; inc eax ;大图宽+1 mul ebx ;(大图宽+1)*大图位数 add eax,31 ;(大图宽+1)*大图位数+31 shr eax,5 ;右移((大图宽+1)*小图位数+31,5) shl eax,2 ;左移(右移((大图宽+1)*大图位数+31,5),2) mov @dtsmh,eax ;第八个局部变量 大扫描行、、、、、、、、●大图扫描行=左移(右移((大图宽+1)×大图位数+31,5),2) shr ebx,3 ;ebx大图位数/8 mov @dtsw,bl mov eax,xtsj ;获得小图指针 mov esi,[eax] test esi,esi je exit mov bx,[esi+8] mov eax,[esi+4] ;看字节集长度//放前面一点,可以节省时间 cmp bx,4D42h ;bmp的头是424D jne exit cmp eax,55 ;位图头必须是54 jb exit ;头小于54就跳出 mov ecx,[esi+8+16h] ;小图高度 dec ecx mov @xtg,ecx ;第2个局部变量=小图高度///////////////●小图宽=小图数据[19]+左移(小图数据[20],8)-1 movzx ebx,byte ptr [esi+8+1ch] ;小图位数 mov eax,[esi+8+12h] ;小图宽度 dec eax mov @xtk,eax ;第1个局部变量=小图宽度///////////////●小图高=小图数据[23]+左移(小图数据[24],8)-1 inc eax ;小图宽+1 mul ebx ;(小图宽+1)*小图位数 add eax,31 ;(小图宽+1)*小图位数+31 shr eax,5 ;右移((小图宽+1)*小图位数+31,5) shl eax,2 ;左移(右移((小图宽+1)*小图位数+31,5),2) mov @xtsmh,eax ;第四个局部变量=小扫描行//////////////●小图扫描行=左移(右移((小图宽+1)×小图位数+31,5),2) shr ebx,3 ;ebx小图位数/8 mov @xtsw,bl ;第11个局部=小颜色位//////////////////●小颜色位=右移(小图位数,3) inc ecx ;小图高+1 mov eax,@xtk ;小图宽 inc eax ;小图宽+1 mul ecx ; ●总长=(小图宽+1)×(小图高+1) mov ebx,eax ;总长 xor ecx,ecx mov cl,100 mov edx,whz cmp dl,cl jbe bxg ;无符号小于或等于 movzx edx,cl bxg: mul edx cdq div ecx ;总长×吻合值\100 mov whz,eax ;第四个参数=吻合值 ok////////////////●吻合值=小图宽×小图高×吻合值÷100 sub ebx,eax mov @yxbwhcj,ebx lea ebx,[esi+54+8] ;求出总偏移数据 mov eax,[ebx] bswap eax shr eax,8 mov @xtjds,eax ;第14个局部变量=小图基点颜色///////////●小图基点颜色=小图.取坐标偏移量颜色值(小图X扫描偏移) cdq mov eax,zdx .if eax==edx ;如果真(终点X=0) mov eax,@dtk .endif mov ebx,@dtk .if eax>ebx ;如果真(终点X>大图宽) mov eax,ebx ;终点X=大图宽 .endif mov ebx,qsx ;起始X cmp ebx,eax ;如果真(起始X≥终点X) jge exit mov zdx,eax sub eax,@xtk ;终点X-小图宽 cmp eax,edx ;如果真(宽差<0) jl exit cmp ebx,eax ;如果真(起始X>宽差) jg exit mov @kc,eax mov ecx,zdy mov ebx,@dtg .if ecx==edx ;如果真(终点Y=0) mov ecx,ebx ;终点Y=大图高 .endif mov eax,ebx;ebx=大图高 mov edx,qsy sub eax,edx;大图高-起始Y===终点Y=ebx .if eax>ebx;如果真(终点Y>大图高) mov eax,ebx .endif mov zdy,eax;保存终点y sub ebx,ecx;大图高-终点Y===起始Y=ecx cmp ebx,eax;如果真(起始Y≥终点Y) jge exit sub eax,@xtg;终点Y-小图高===高差=ebx cmp eax,0 ;如果真(高差<0) jl exit mov @gc,eax cmp ebx,eax;如果真(起始Y>高差) jg exit ;mov @dty,eax;大图Y=起始Y ;mov @dty,eax;大图Y=起始Y ;mov eax,ebx;大图Y=高差 mov cl,8 .repeat;==========================================高差 mov @dty,eax imul eax,@dtsmh;大图Y×大图扫描行 mov @dtlsypy,eax;eax=大图临时Y偏移 mov eax,qsx ;mov eax,@kc .repeat;==========================================宽差 ;eax不用说,绝对是大图X mov @dtx,eax movzx ebx,@dtsw mul ebx;大图X×大图色位 add eax,@dtlsypy;大图X×大图色位+大图临时Y偏移 lea eax,[eax+edi+54+8] ;ebx是大图总偏移+指针位置+8 mov eax,[eax] bswap eax shr eax,cl mov ebx,@xtjds ;小图基点颜色 ;--------------------------------------------------------------------------------------------------------------------------------------- sub al,bl ja s1 neg al s1: cmp hswc,al ;红色误差对比 jb BigTuK ;小于就到循环尾() ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;============================绿色=======================@@@@@@@@@@@@@@@@@@@@@@@@@@ shr eax,cl shr ebx,cl sub al,bl ja s2 neg al s2: cmp lswc,al ;红色误差对比 jb BigTuK ;小于就到循环尾() ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;============================蓝色=======================@@@@@@@@@@@@@@@@@@@@@@@@@@ sub ah,bh ja s3 neg ah s3: ;--------------------------------------------------------------------------------------------------------------------------------------- cmp nswc,ah ;红色误差对比 jb BigTuK ;小于就到循环尾() xor eax,eax mov @ywh,eax mov @bwh,eax mov @xty,eax .repeat;===========================================小图y mov @xty,eax mov ebx,eax add eax,@dty;小图Y+大图Y imul eax,@dtsmh;当前y×大图扫描行 mov @dtlsypy,eax imul ebx,@xtsmh mov @xtlsypy,ebx;小图临时Y偏移=小图Y×小图扫描行 xor eax,eax mov @xtx,eax;小图x=0 .repeat;===========================================小图x mov @xtx,eax mov ebx,eax;备份一下小图x add eax,@dtx;小图X+大图X movzx edx,@dtsw;大图色位 mul edx ;当前x×大图色位 add eax,@dtlsypy;当前x×大图色位+大图临时Y偏移 xchg eax,ebx;现在eax为小图x,ebx为大图X扫描偏移 movzx edx,@xtsw;小图色位 imul edx ;小图X×小图色位 add eax,@xtlsypy;小图X×小图色位+小图临时Y偏移 lea ebx,[ebx+edi+54+8] ;ebx是大图总偏移+指针位置+8 mov ebx,[ebx] bswap ebx shr ebx,cl lea eax,[eax+esi+54+8] ;小图总偏移+小图指针+8 mov eax,[eax] bswap eax shr eax,cl ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ sub al,bl ja d1 neg al d1: cmp hswc,al ;红色误差对比 jb bwh ;小于于就到不吻合 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;============================绿色=======================@@@@@@@@@@@@@@@@@@@@@@@@@@ shr eax,cl shr ebx,cl sub al,bl ja d2 neg al d2: cmp lswc,al ;红色误差对比 jb bwh ;小于就到不吻合 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;============================蓝色=======================@@@@@@@@@@@@@@@@@@@@@@@@@@ sub ah,bh ja d3 neg ah d3: cmp nswc,ah ;红色误差对比 jb bwh ;小于就到不吻合 mov eax,@ywh ;已吻合 inc eax cmp whz,eax ; 吻合值:已吻合 jbe ok ;是否小于 mov @ywh,eax jmp SamllTuK bwh: mov eax,@bwh inc eax cmp @yxbwhcj,eax ;允许不吻合差距 jbe BigTuK ;允许不吻合差距<=不吻合---->跳出循环 mov @bwh,eax SamllTuK:;小图x mov eax,@xtx inc eax .until @xtk < eax SamllTuG:;小图y mov eax,@xty inc eax .until @xtg < eax BigTuK:;宽差 mov eax,@dtx inc eax .until @kc < eax BigTuG:;高差 mov eax,@dty dec eax .until qsy >= eax ;mov eax,@dty ;inc eax ;mov @dty,eax ;.until @gc < eax exit:xor eax,eax jmp out1 ok: mov eax,@dtx;大图X mov ebx,fhx mov [ebx],eax ;X = 大图X - X mov eax,@dty;大图Y dec eax mov ecx,@dtg sub ecx,eax ;大图高-大图Y sub ecx,@xtg dec ecx mov ebx,fhy mov [ebx],ecx ;X=大图X-X xor eax,eax inc eax out1: pop esi pop edi ret 58h a endp end |
|