assembly - 当 arg 为 64 位长时,为什么 gcc 使用 mov %esi, %ecx 进行移位计数?
问题描述
所以我正在阅读计算机系统:程序员的视角第 3 版。对于其中一个练习题解决方案,它说以下功能:
long shift(long x, long n)
{
x <<= 4;
x >>= n;
return x;
}
输出汇编代码,其中一部分将是(及其注释):
# x in %rdi, n in %rsi
movq %rdi, %rax # Get x
salq $4, %rax # x <<= 4
movl %esi, %ecx # Get n (4 bytes) **QUESTION**
sarq %cl, %rax # x >>= n
假设基于 x86-64 linux,“long”是四字大小。
我的问题是关于我添加“问题”的那一行。为什么那行不是 'movq %rsi, %rcx',因为 n 是 'long' 类型?我不认为这是一个错字,因为他们专门添加了“获取 n(4 个字节)”。
解决方案
推荐阅读
- android - 在 Android 中绘制 3D 数学函数
- java - 在 Struts 2.5.14 中,我无法添加新动作,我可以添加的唯一动作是每个 struts.xml 包中的 hello
- android-layout - ExoPlayer2 可缩放视图?
- python - 带有 Python 输入的 TypeError 不支持的操作数
- python - TypeError:只有整数标量数组可以转换为标量索引——Python 3.6.5
- php - PHP函数在do while
- python - 使用pyparsing查找关键字的前缀和后缀
- c - 最大行长程序在c中打印不可读的字符
- android - 无法从嵌套的 Hashmap 访问值
- assembly - 为什么 Mi TI-83 Premium CE 上没有 Asm83CEPgrm 命令