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

Fasm 汇编语言和 SSE指令

Peirre5年前 (2021-10-22)我的程序733

用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

分享给朋友:

相关文章

快速傅里叶易语言算法。

雷达滤波需要快速傅里叶公式计算波形。    工程中待处理的信号,通常具有非周期性,故我们需要对离散傅里叶变换进行研究。离散公式:【x(n)是采样的时域信号,X(k)是对于...

随手写的时间设置程序,主要是防止系统时间无故修改。

随手写的时间设置程序,主要是防止系统时间无故修改。

程序说明:测试版程序功能。同步系统时间数据可选月历,手工输入可自动识别时间修改,修改后一分钟报警。测试版没有恢复时间功能。以后会增加。欢迎下载的朋友帮助我找程序问题,没有花多少功夫,请多多原谅。这个程...

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

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

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

关于ch341驱动,联动3D打印机USB串口通讯.

关于ch341驱动,联动3D打印机USB串口通讯.

手上有个3D打印机,搬家的原因,好久没用.天气热了,打印温度很适合,正好可以使用.又过了一年.发现linux 版本内核已经升级,和原来的系统不一样了. 按照3D打印机的说明,和寻找它的程序,原来的方法...

linux 下的 opengl SDK。

linux 下的 opengl SDK。

opengl 图形库是开放式图形库,最近出了一个freeglut3 我们下载它:sudo apt-get install freeglut3sudo apt-get install freeglut3...

关于DOSBOX的简单说明。

关于DOSBOX的简单说明。

linux 下的共享软件DOSBOX 在有些版本的linux 中不能使用鼠标。网上说明要换声卡地址和中断,连接鼠标端口才可以使用。 曾经设置过,可以使用参数不记得。有个解决方法。这是软件问题。 先卸载...