提问人:Sreeraj Chundayil 提问时间:4/26/2020 最后编辑:Peter CordesSreeraj Chundayil 更新时间:4/26/2020 访问量:278
为什么组装需要在eax上重复操作movzx?
Why do assembly need repeated operation of movzx on eax?
问:
代码 - 区别在于一种方法用于有符号的短 int-s,另一种方法用于无符号的短 int。
short signedShortIntSwap(short int* a , short int* b)
{
short tmp = *a;
*a = *b;
*b = tmp;
return *a;
}
unsigned short unsignedShortIntSwap(unsigned short int* a ,unsigned short int* b)
{
unsigned short tmp = *a;
*a = *b;
*b = tmp;
return *a;
}
集会:-gcc -c -m64 -o func1 func1.c -O2 -fno-tree-vectorize
0000000000000000 <signedShortIntSwap>:
0: f3 0f 1e fa endbr64
4: 0f b7 07 movzx eax,WORD PTR [rdi]
7: 0f b7 16 movzx edx,WORD PTR [rsi]
a: 66 89 17 mov WORD PTR [rdi],dx
d: 66 89 06 mov WORD PTR [rsi],ax
10: 0f b7 07 movzx eax,WORD PTR [rdi]
13: c3 ret
14: 66 66 2e 0f 1f 84 00 data16 nop WORD PTR cs:[rax+rax*1+0x0]
1b: 00 00 00 00
1f: 90 nop
0000000000000020 <unsignedShortIntSwap>:
20: f3 0f 1e fa endbr64
24: 0f b7 07 movzx eax,WORD PTR [rdi]
27: 0f b7 16 movzx edx,WORD PTR [rsi]
2a: 66 89 17 mov WORD PTR [rdi],dx
2d: 66 89 06 mov WORD PTR [rsi],ax
30: 0f b7 07 movzx eax,WORD PTR [rdi]
33: c3 ret
34: 66 66 2e 0f 1f 84 00 data16 nop WORD PTR cs:[rax+rax*1+0x0]
3b: 00 00 00 00
3f: 90 nop
- 为什么我们在地址 && 和 && 处对每个函数重复了 .
movzx eax,WORD PTR [rdi]
4
10
24
30
- 为什么有符号和无符号函数具有相同的指令集。在哪种情况下会有所不同?
答: 暂无答案
下一个:OpenCL 上下文间缓冲区别名
评论
mov ax, [rdi]
a
b
short
*b = tmp
*a
movzx
movsx
restrict