首页 > 解决方案 > 当 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 个字节)”。

标签: assemblyx86x86-64

解决方案


推荐阅读