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

Fasm 汇编测试MMX 功能的源码

Peirre4年前 (2022-03-12)我的程序452
;
; MMX 寄存器测试的例子
; 
;

format PE GUI
include 'win32axp.inc'

entry start

section '.data' data readable writeable

TAP equ 1

  flags	dd ?
  caption	db '测试',0
  message	db '这是一个测试',0
;--------------------------------
  input1	db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00
  		db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00
  		db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00
  		db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00,0
  out1	dd 10 dup(?)
  coeff1	dq 0000,9999,8888,7777,6666,5555,4444,3333,2222,1111,0
  count1	dw 10
;---------------------------------
  lpString	db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00
  		db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00
  		db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00
  		db 11,11,22,22,33,33,44,44,55,55,66,66,77,77,88,88,99,99,00,00,0
  lpbuffer	dw 200h dup (0)
  InString 	dw 000000ffh
  		dw 0

    hex_table \
      db "000102030405060708090A0B0C0D0E0F"
      db "101112131415161718191A1B1C1D1E1F"
      db "202122232425262728292A2B2C2D2E2F"
      db "303132333435363738393A3B3C3D3E3F"
      db "404142434445464748494A4B4C4D4E4F"
      db "505152535455565758595A5B5C5D5E5F"
      db "606162636465666768696A6B6C6D6E6F"
      db "707172737475767778797A7B7C7D7E7F"
      db "808182838485868788898A8B8C8D8E8F"
      db "909192939495969798999A9B9C9D9E9F"
      db "A0A1A2A3A4A5A6A7A8A9AAABACADAEAF"
      db "B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"
      db "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"
      db "D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"
      db "E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF"
      db "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"

section '.text' code readable writeable executable

start:
;	sub rsp,8*5
	invoke	GetModuleHandle,0
	invoke	MessageBox,0,message,caption,MB_ICONINFORMATION+MB_OK
;--------------------------------------------------------------------------	
	mov eax,1
	cpuid
	;test edx,00800000h		;支持MMX[bit 23=1]
	bt edx,23
	jnc exit
	;test edx,002000000h		;支持SSE[bit 25=1]
	bt edx,25
	jnc exit
	;test edx,004000000h		;支持SSE2[bit 26=1]
	bt edx,26
	jnc exit
	;test ecx,000000001h		;支持SSE3[bit 0=1]
	bt edx,0
	jnc exit
	;test ecx,000000200h		;支持SSSE3[bit 9=1]
	bt edx,9
	jnc exit
	;test ecx,000080000h		;支持SSE4.1 [bit 19=1]
	bt ecx,19
	jnc exit
	;test ecx,000100000h		;支持SSE4.2 [bit 20=1]
	bt ecx,20
	jnc exit

	stdcall  fir,input1,out1,coeff1,count1
	stdcall  bin2hex,out1,InString,lpbuffer
	invoke	MessageBox,0,lpbuffer,'测试',MB_ICONINFORMATION+MB_OK
;--------------------------------------------------------------------------	
  exit:
	invoke	ExitProcess,0

proc fir input1:dword,out1:dword,coeff:dword,count:dword
  align 16
	pxor xmm0, xmm0
	xor ecx, ecx
	mov eax,[input1]
	mov ebx,[coeff]
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,[coeff]

	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, [coeff]
	
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

proc bin2hex  lpString:dword,lnString:dword,lpbuffer:dword
;-----------------------------------------
;        EAX is unused in loop code
;-----------------------------------------
    push ebx
    push esi
    push edi
    push ebp

    mov esi, [lpString]			; address of source string
    mov edi, [lpbuffer]		; address of output buffer
    mov ecx,esi
    add ecx,dword  [InString]
    						; exit condition for byte read
    xor ebx, ebx				; line counter
    xor edx,edx
    xor ebp,ebp
    jmp hxlp

; -------------------------------------------------------------------------

  align 4
  hxpre:
    mov word [edi]," -"		; write centre seperator
    add edi, 2
  align 4
  pre:
    cmp esi,ecx				; 大于退出
    jge hxout				; mispredicted only once
  hxlp:
    movzx ebp,byte [esi]		; zero extend byte into EBP
    mov dx,word [hex_table+ebp*2] ; put WORD from table into DX
    add ebx, 1
    add esi, 1
    mov word [edi], dx				; write 2 byte string to buffer
    mov byte [edi+2], 32            ; write space
    add edi, 3
    cmp ebx, 8				; test for half to add "-"
    je hxpre				; predicted backwards
    cmp ebx, 16				; break line at 16 characters
    jne pre					; predicted backwards
    mov word [edi], 0A0Dh	; overwrite last byte with CRLF
    add edi, 2
    xor ebx, ebx				; clear line counter
    jmp pre					; predicted backwards
  hxout:
; -------------------------------------------------------------------------
    pop ebp

    mov byte [edi-1], 0		; append terminator
    sub edi, 1

    sub edi, [lpbuffer]
    mov eax, edi				; return written length of hex output

    pop edi
    pop esi
    pop ebx
    ret
    
endp


section '.idata' import data readable writeable

        library kernel,'KERNEL32.DLL',\
                user,'USER32.DLL'

        import  kernel,\
                GetModuleHandle,'GetModuleHandleA',\
                ExitProcess,'ExitProcess'

        import  user,\
                MessageBox,'MessageBoxA',\
                wsprintf,'wsprintfA'

1.jpeg

分享给朋友:

相关文章

关于DOSBOX的简单说明。

关于DOSBOX的简单说明。

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

linux 下的《仙剑奇侠传》

linux 下的《仙剑奇侠传》

以前的DOS游戏《仙剑奇侠传》是炙制人口的一个很容易上手的游戏。这个游戏流行了很多年。很多人在玩过多年以后,重温旧梦,回味游戏之中的情感。这个游戏再版了很多次了。现在linux 下也可以直接玩这个游戏...

USB设备的插入机制与USB驱动故障。

USB设备的插入机制与USB驱动故障。

USB主机检测设备,首先在USB集线器的每个端口的D+,D-上,分别接了一个15K欧姆的下拉电阻到地。集线器端口为空时,被这两个电阻拉低了电平。在USB设备端,D+或者D- 上接了上拉1.5K电阻。全...

关于编译器不愿意说的那些事。

关于编译器不愿意说的那些事。

计算机发展了好多年。当中也不泛有很多对程序的爱好。很多人不是专业水平,也不是在算法类中特别出众,就是喜欢而已。好像认为自己就只那个水平,或者为一些调试不通过发愁。可以说,实际上都不是你的错,是编译器的...

谈谈引导程序的想法。

谈谈引导程序的想法。

当个人电脑一出现就有了磁盘系统,不管是软盘,光盘,硬盘,计算机要应用操作系统就要引导,引导程序一段代码。这引导代码很小,在第一个磁盘的扇区上,平时没什么人注意它。这段代码损坏一个字节,都会造成计算机瘫...

我谈易语言

我谈易语言

易语言是一个集成打包的中文编程的语言。说实话,只要在电脑上的程序,易语言都可以用自己的方式实现。易语言可以开发linux 控制台下的图文程序和工具,十分好用。易语言的源码和例子量很大,精华源码例子已经...