38213


以下のC言語のコードをアセンブリ言語に変換したいのですが、なぜ算術右シフトをする際に `%cl` となるのかどなたか教えていただけないでしょうか

C言語版

[code]

    void shift(int x, int y){
        x <<= 2;
        x >>= y;
        return x;
    }
    
[/code]

アセンブリ言語版(xは%ebp+8、yは$ebp+12に格納されているとする)

[code]

    movl 8(%ebp), %eax
    shll $2, %eax
    movl 12(%ebp), %ecx
    sarl %cl, %eax /*ここで%ecx, %eaxでは駄目なのか？*/
    
[/code]


CC BY-SA 3.0
2017-09-26T22:09:59.787
38212
2017-09-26T23:05:10.877
2017-09-26T22:42:12.420
4236
25350
question
assembly x86
C言語でxを右シフト、左シフトする関数をアセンブリ言語で表現したい


[Intel® 64 and IA-32 Architectures Software Developer’s Manual、Volume 2B:
Instruction Set Reference, M-U
582ページ](https://software.intel.com/sites/default/files/managed/7c/f1/253667-sdm-
vol-2b.pdf#page=582)にて

> The count operand can be an immediate value or the CL register.

と説明されているように、コンパイル時に決定される即値か、実行時に動的に決定するのであれば`CL`レジスターを使用する仕様です。

具体的には32bit SAL命令は

[code]

    SAL r/m32, 1     ; 1bitシフト
    SAL r/m32, imm8  ; 固定シフト
    SAL r/m32, CL    ; 動的シフト
    
[/code]

の３形式です。

* * *

`SAL`に限らずx86命令では使用できるレジスターが指定されている命令が所々にあります。  
汎用レジスターは対等と思われるかもしれませんが、[各レジスターにはそれぞれの役割](https://ja.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/x86%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3#.E6.B1.8E.E7.94.A8.E3.83.AC.E3.82.B8.E3.82.B9.E3.82.BF_.28GPR.29)があり、`CL`レジスターはカウンターだったりします。シフトカウントだけでなくループカウントなど別の命令でもカウンターとして使われています。


CC BY-SA 3.0
2017-09-26T22:41:06.190
38213
2017-09-26T23:05:10.877
2017-09-26T23:05:10.877
4236
4236
38212
answer