一 准备跑开intrinsic,直接通过汇编操作寄存器,进一步理解向量寄存器们。
二 第二课,把一个数组存入xmm寄存器,然后再读取出来,存入内存,打印出来。
使用的SIMD指令为
movdqa xmm0, [rdi]
movd [rsi], xmm0 ;//只是mov了低4个字节,全部mov继续研究,
代码:
global Load
global Save
extern printf
Load:
push rax; //这些都是测试代码,用于打印,先缓存rax寄存器
push rdi; //缓存rdi寄存器,因为这个寄存器就是存的数组指针
push rsi; //输出的数组指针
movdqa xmm0, [rdi] //先存到xmm0
movd [rsi], xmm0 //从xmm0读取出来
;//下面是用于打印的代码,详见上一篇文章的介绍
mov rax, rdi;
mov rdi, format;
mov rsi, rax;
xor rax, rax;
call printf
pop rsi
pop rdi;
pop rax
section .data
format: db "data address %p", 10, 0
再来看C语言调用代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern void Load(char *ptr, char *out);
extern void Save(char *ptr);
int main()
{
char *a = (char*)malloc(100);
for (int i = 0; i < 100; i++)
a[i] = i;
printf("we know a address %p\n", a);
char b[100];
memset(b, 0x0, 100);
Load(a, b);
free(a);
for (int i = 0; i < 100; i++)
printf("b[%d] = %d\n", i, b[i]);
return 0;
}
执行输出:
test# ./inout
we know a address 0x13fb260
data address 0x13fb260
b[0] = 0
b[1] = 1
b[2] = 2
b[3] = 3
b[4] = 0
b[5] = 0
符合预期