;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;*--==--* fasm console float mul example. By G-Spider
;*--==--* 编译: fasm.exe MatrixMul.asm MatrixMul.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
format PE console ;指定为PE控制台程序
entry start ;指定入口点为start
;---------------------------------------------
;//代码节,命名为'.text'(可读可执行)
section '.text' code readable executable
start :
;--------函数调用---------------
push fc ;地址入栈
push fb
push fa
call MatrixMul ;自实现函数调用
;-------输出浮点结果------------
cvtps2pd xmm0 , qword [fc + 4 * 0 ] ;转成双精度浮点
cvtps2pd xmm1 , qword [fc + 4 * 2 ]
sub esp , 16 * 2
movups [ esp ], xmm0 ;参数入栈
movups [ esp + 16 ], xmm1
push szFmt
call [printf ] ;导入函数调用
add esp , 16 * 2 + 4 ;栈平衡
;-------暂停--------------------
push szPause
call [system ]
add esp , 8
jmp dword [ esp - 4 ] ;栈平衡,并结束程序
;===================================================
;MatrixMul(a14,b44,c14) 函数
; 功能:
; a14*b44=c14 (1*4的向量乘以4*4的矩阵=1*4的向量)
; 参数:
; a14:1*4的单精度浮点向量指针,输入参数
; b44:4*4的单精度浮点矩阵指针,输入参数
; c14:1*4的单精度浮点向量指针,输出参数
; 说明:
; 如果能保存数据对齐,可将movups替换成movaps
;===================================================
MatrixMul :
;定义三个标签
label .a14 dword at esp + 4 ;arg1
label .b44 dword at esp + 8 ;arg2
label .c14 dword at esp + 12 ;arg3
mov eax ,[.a14 ]
mov edx ,[.b44 ]
mov ecx ,[.c14 ]
movups xmm0 ,[ eax ] ;d c b a
movaps xmm1 , xmm0 ;d c b a
movaps xmm2 , xmm0 ;d c b a
movaps xmm3 , xmm0 ;d c b a
shufps xmm0 , xmm0 , 0 ;a a a a
shufps xmm1 , xmm1 , 01010101b ;b b b b
shufps xmm2 , xmm2 , 10101010b ;c c c c
shufps xmm3 , xmm3 , 11111111b ;d d d d
movups xmm4 ,[ edx + 16 * 0 ]
movups xmm5 ,[ edx + 16 * 1 ]
movups xmm6 ,[ edx + 16 * 2 ]
movups xmm7 ,[ edx + 16 * 3
;*--==--* fasm console float mul example. By G-Spider
;*--==--* 编译: fasm.exe MatrixMul.asm MatrixMul.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
format PE console ;指定为PE控制台程序
entry start ;指定入口点为start
;---------------------------------------------
;//代码节,命名为'.text'(可读可执行)
section '.text' code readable executable
start :
;--------函数调用---------------
push fc ;地址入栈
push fb
push fa
call MatrixMul ;自实现函数调用
;-------输出浮点结果------------
cvtps2pd xmm0 , qword [fc + 4 * 0 ] ;转成双精度浮点
cvtps2pd xmm1 , qword [fc + 4 * 2 ]
sub esp , 16 * 2
movups [ esp ], xmm0 ;参数入栈
movups [ esp + 16 ], xmm1
push szFmt
call [printf ] ;导入函数调用
add esp , 16 * 2 + 4 ;栈平衡
;-------暂停--------------------
push szPause
call [system ]
add esp , 8
jmp dword [ esp - 4 ] ;栈平衡,并结束程序
;===================================================
;MatrixMul(a14,b44,c14) 函数
; 功能:
; a14*b44=c14 (1*4的向量乘以4*4的矩阵=1*4的向量)
; 参数:
; a14:1*4的单精度浮点向量指针,输入参数
; b44:4*4的单精度浮点矩阵指针,输入参数
; c14:1*4的单精度浮点向量指针,输出参数
; 说明:
; 如果能保存数据对齐,可将movups替换成movaps
;===================================================
MatrixMul :
;定义三个标签
label .a14 dword at esp + 4 ;arg1
label .b44 dword at esp + 8 ;arg2
label .c14 dword at esp + 12 ;arg3
mov eax ,[.a14 ]
mov edx ,[.b44 ]
mov ecx ,[.c14 ]
movups xmm0 ,[ eax ] ;d c b a
movaps xmm1 , xmm0 ;d c b a
movaps xmm2 , xmm0 ;d c b a
movaps xmm3 , xmm0 ;d c b a
shufps xmm0 , xmm0 , 0 ;a a a a
shufps xmm1 , xmm1 , 01010101b ;b b b b
shufps xmm2 , xmm2 , 10101010b ;c c c c
shufps xmm3 , xmm3 , 11111111b ;d d d d
movups xmm4 ,[ edx + 16 * 0 ]
movups xmm5 ,[ edx + 16 * 1 ]
movups xmm6 ,[ edx + 16 * 2 ]
movups xmm7 ,[ edx + 16 * 3