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

Fasm 汇编语言和 SSE指令

Peirre3年前 (2021-10-22)我的程序579

用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

分享给朋友:

相关文章

发现一个声波雷达软件很有意思

发现了一个软件“声波雷达”。这个软件很有创意。以前也想过类似的软件,主要是测试模块函数太多。设备门槛高了点。自己也不富裕,所以一直没动力。看到别人编的“声波雷达”,感觉有点小惊奇。这个声音雷达主要功能...

关于 Cannot enable. Maybe the USB cable is bad? 这个问题。

关于 Cannot enable. Maybe the USB cable is bad? 这个问题。

经常摆弄电脑,那USB接口也是插进,拔出多少次。有一天发生了这个问题,什么问题呢?见图:只要是linux 新内核,都会出现这个问题,虚拟机USB功能,DOSBOX等USB功能不可识别。在网上查看了一些...

linux 下的汉字输入法.

linux 下的汉字输入法.

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

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

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

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

关于DOSBOX的简单说明。

关于DOSBOX的简单说明。

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

linux mint 20 下编译最新内核所添加的文件。

linux mint 20 下编译最新内核所添加的文件。

linux mint 20 下编译最新内核文件所需要的两个文件包。sudo apt-get install libncurses5-devsudo apt-get install libssl-dev...