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

Fasm 汇编语言和 SSE指令

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

用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

分享给朋友:

相关文章

多普勒音速偏移演示计算器。

多普勒音速偏移演示计算器。

多普勒偏移计算器,应用与雷达测距计算。链接:https://pan.baidu.com/s/1i4FkchZ  密码: mq7x...

介绍一个改编过的纸牌游戏WinSol。

介绍一个改编过的纸牌游戏WinSol。

这个游戏是VC++ 6.0 SP6 编写的。原作者是个日本人。但是他也是翻版。源代码是linux下的aisleriot纸牌游戏。经过拼装,加上windows SDK。改编而成。虽然这是VC++ 6.0...

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

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

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

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

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

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

刚刚上手的一个汇编程序nasm。

刚刚上手的一个汇编程序nasm。

今天使用了masm32软件,总有使不上劲的感觉。因为intel 指令集很多都没有,自己想测试一下,一边翻资料,一边使用。windows 编程好用,但是指令不全,心里总是感觉差一点。又不是编大程序,只是...

masm32v12编译器自带库masm32.lib在nasm中的使用。

masm32v12编译器自带库masm32.lib在nasm中的使用。

修改了masm32.inc文件在nasm中使用。;╔═══════════════════════════════╗ ;║                       MASM32 库改nasm  ...