---
title: 替换x86 movdqu汇编指令
description: "编译报错：unknown mnemonic 'movdqu' -- 'movdqu'。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0020.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0020.html
indexId: 1a9878dd47565cb35c6c0e9a81cc215426669c02ccaa85628ea5aff63d087ef865
---
# 替换x86 movdqu汇编指令

#### 现象描述

编译报错：unknown mnemonic 'movdqu' -- 'movdqu'。


#### 问题原因

movdqu为x86指令集中的指令，在鲲鹏上无法使用。该指令可以实现寄存器到寄存器，寄存器到地址的数据拷贝。

x86上movdqu指令用法有两种：

- 第一种是将xmm2寄存器或者128位内存地址的内容拷贝到xmm1寄存器

```
MOVDQU xmm1, xmm2/m128
```


- 第二种是将xmm1寄存器的内容拷贝到128位内存地址或者xmm2寄存器

```
MOVDQU xmm2/m128, xmm1
```


指令使用方法参考：

https://c9x.me/x86/html/file_module_x86_id_184.html(https://c9x.me/x86/html/file_module_x86_id_184.html)


#### 处理步骤

- 对于第一种调用，可以用NEON指令ld1指令替代：
  ld1指令：Load multiple 1-element structures to one, two, three or four registers

```
LD1 { Vt.T }, [Xn|SP]
```


  可参考指令集手册的第9.98小节，下载地址：http://infocenter.arm.com/help/topic/com.arm.doc.dui0802a/DUI0802A_armasm_reference_guide.pdf(http://infocenter.arm.com/help/topic/com.arm.doc.dui0802a/DUI0802A_armasm_reference_guide.pdf)

- 对于第二种调用，可以用st1指令来替代：
  st1指令：Store multiple 1-element structures from one, two three or four registers.

```
ST1 { Vt.T }, [Xn|SP]
```


  可参考指令集手册的第9.202小节，下载地址：http://infocenter.arm.com/help/topic/com.arm.doc.dui0802a/DUI0802A_armasm_reference_guide.pdf(http://infocenter.arm.com/help/topic/com.arm.doc.dui0802a/DUI0802A_armasm_reference_guide.pdf)


如下是一个简单的示例：

```
/*x86调用*/
void add_x86_asm(int* result, int* a, int* b, int len)
{
__asm__("\n\t"
"1:                                     \n\t"
"movdqu (%[a]), %%xmm0                  \n\t"
"movdqu (%[b]), %%xmm1                  \n\t"
"pand %%xmm0, %%xmm1                    \n\t"
"movdqu %%xmm1, (%[result])             \n\t"
:[result]"+r"(result)                     //output
:[a]"r"(a),[b]"r"(b),[len]"r"(len)        //input
:"memory","xmm0","xmm1"
);
return;
}
/*鲲鹏调用*/
void and_neon_asm(int* result, int* a, int* b, int len)
{
int num = {0};
__asm__("\n\t"
"1:                               \n\t"
"ld1 {v0.16b}, [%[a]], #16        \n\t"
"ld1 {v1.16b}, [%[b]], #16        \n\t"
"and v0.16b, v0.16b, v1.16b       \n\t"
"subs %[len],%[len],#4            \n\t"
"st1 {v0.16b}, [%[result]], #16   \n\t"
"bgt 1b                           \n\t"
:[result]"+r"(result)                     //output
:[a]"r"(a),[b]"r"(b),[len]"r"(len)        //input
:"memory","v0","v1"
);
return;
}
```
