当前位置:首页 > 我的程序 > 正文内容

Fasm 汇编语言和 SSE指令

Peirre4年前 (2021-10-22)我的程序602

用fasm汇编语言编译器编译测试代码,编译正常,运行有异常。

SSE 指令和 MMX指令的区别是寄存器不一样,MMX是,mm0-mm7,SSE是XMM0-XMM7,SSE2是 XMM8-XMM15,扩展的是XMM16-XMM31

proc fir input:dword,out:dword,coeff:dword,count:dword
	pxor xmm0, xmm0
	xor ecx, ecx
	mov eax,input1
	mov ebx,coeff1
inner_loop:
	movups xmm1,[eax+ecx]
	mulss xmm1,[ebx+4*ecx]
	addps xmm0, xmm1
	pxor xmm0, xmm0
	xor ecx, ecx
	mov eax,input1
	mov ebx,coeff1

	movups xmm1,[eax+ecx]			;
	movaps xmm3, xmm1
	mulss xmm1,[ebx+4*ecx]
	addps xmm0, xmm1
	movups xmm1,[eax+ecx+4]
	mulss xmm1,[ebx+4*ecx+16]
	addps xmm0, xmm1
	movups xmm2,[eax+ecx+16]
	movups xmm1, xmm2
	palignr xmm2, xmm3, 4
	mulss xmm2,[ebx+4*ecx+16]
	addps xmm0, xmm2
	movups xmm1,[eax+ecx+8]
	mulss xmm1,[ebx+4*ecx+32]
	addps xmm0, xmm1
	movups xmm2, xmm1
	palignr xmm2, xmm3, 8
	mulss xmm2,[ebx+4*ecx+32]
	addps xmm0, xmm2
	movups xmm1,[eax+ecx+12]
	mulss xmm1,[ebx+4*ecx+48]
	addps xmm0, xmm1
	add ecx, 16
	cmp ecx, 4*TAP
	jl inner_loop
	mov eax,out1
	movups [eax], xmm1
	
	pxor xmm0, xmm0
	xor ecx, ecx
	mov eax, input1
	mov ebx, coeff1
inner_loop1:
	movups xmm1, [eax+ecx]
	movups xmm3, xmm1
	mulss xmm1, [ebx+4*ecx]
	addps xmm0, xmm1
	
	movups xmm2, [eax+ecx+16]
	movups xmm1, xmm2
	palignr xmm2, xmm3, 4
	mulss xmm2, [ebx+4*ecx+16]
	addps xmm0, xmm2

	movups xmm2, xmm1
	palignr xmm2, xmm3, 8
	mulss xmm2, [ebx+4*ecx+32]
	addps xmm0, xmm2

	movups xmm2, xmm1
	palignr xmm2, xmm3, 12
	mulss xmm2, [ebx+4*ecx+48]
	addps xmm0, xmm2
	add ecx, 16
	cmp ecx, 4*TAP
	jl inner_loop1
	mov eax, out1
	movups [eax], xmm0
p_exit:
	ret
endp

这是一段优化代码

section '.data' data readable writeable

TAP equ 1

  flags dd ?
  caption db '测试',0
  message db '这是一个测试',0
  input1  dq 1111,2222,3333,4444,5555,6666,7777,8888,9999,0000,0
  out1	  dd 10 dup(?)
  coeff1  dq 0000,9999,8888,7777,6666,5555,4444,3333,2222,1111,0
  count1		dw 10

数据测试是这个数据,先的程序不是这样子的。

源代码在intel 代码优化白皮书中。

屏幕截图 2021-10-22 195421.png

源代码中指令是 movaps 

在fasm 中 数据最长为 dq,dt 也就是8字节,10字节。没有xmm的16字节 128位字节的定义。

如果是有符号的 movaps 读数据段,会抛出一个异常,改为movups 就正常

mulps 改为mulss 原理一样。是fasm 生成的 exe文件,或者是 win10 的数据保护产生的指令异常。绕过就可以了。

1.jpg

分享给朋友:

相关文章

下载:经典游戏音效开发SDK(fmod),专业的游戏音频开发包,个人非商业使用完全免费。

fmod 简  介这个版本是最完美的一个版本,之后的都添加了其它的应用模块。这个版本响应速度快,占用内存少,功能完善。而且是最后一个个人非商业化使用完全免费版本。使用效果非常好,很多游戏就用...

黑洞数的演示程序。

黑洞数的演示程序。易语言改编,小演示。没多大意思。只是测试一下易语言的扩展功能,有同好者欢迎交流。这个网站没做SEO。也许等你们太久,但是属于个人网页,展示一下。在网上留个脚印。下载地址:黑洞数的演示...

发布一个雷达显示程序,仅测试,有问题请交流。

发布一个雷达显示程序,仅测试,有问题请交流。

下载地址:雷达显示程序.rar这个雷达显示程序用来显示雷达数据的。使用易语言编写。数据部分还没完善。欢迎提意见。...

阿里云后台的一个身份证信息查询工具。

阿里云后台的一个身份证信息查询工具。

注:此软件时效性已过,只在此陈列,没有什么意义。工具主图形界面有时会欠费,查不了时,请付1分钱给阿里云。下载地址:个人身份证阿里云查询.rar...

几种在linux中的调试器的编译结果。

几种在linux中的调试器的编译结果。

很多人用源码进行编译,会不成功,原因有很多,我现在讲讲linux 下必有的gdb调试器来说明一下。我用的linux 系统 是 优麒麟 19.04.10.1 加强版,属于试用版。随系统自带的gdb是8....

linux 下的汉字输入法.

linux 下的汉字输入法.

各位老师,才子,同事们好!有很多初级玩linux的同学都会碰到一个难题,也就是在linux 下的汉字输入法.这个问题一直困绕了linux 使用者多年.我还好,每次都使用正常.现在说说心得笔记就可以了....