2016-09-11 7 views
0

アセンブリコードをCコードに変換しようとしていますが、sarqという1つの操作に気付きました。私はqがアドレスのサイズであると思いますが、sarqがそのアドレスに対して何をしているのか分かりません。私はコードが何を信じているかについてコメントしました。アセンブリ言語 - sarqはコード内で何をしますか?

.LC0 .string "ans %d\n" 
main: 
.LFB0:     val = -8(%rbp), result = -12(%rbp) 
     pushq %rbp 
     movq %rsp, %rbp 
     subq $16, %rsp 
     movabsq $53162464113523643, %rax 
     movq %rax, -8(%rbp)  //val(variable) address -8,inputs value in %rax 
     movl $0, -12(%rbp)  //result(variable) address -12, inputs 0 
     jmp  .L2   //starts loop 
.L3: 
     movq -8(%rbp), %rax  //moves value in val into rax 
     andl $1, %eax  //dunno what eax is but adds 1 into it 
     xorl %eax, -12(%rbp)  //compares the value of eax and result to see if they are not equal. so compares 1 to 0 
     sarq -8(%rbp)  //does something to val? 
.L2: 
     cmpq $0, -8(%rbp)  //compares val to 0 
     jg  .L3   //if greater, goes to L3 
     movl -12(%rbp), %eax  //else, moves value from result into eax 
     movl %eax, %esi  //moves eax into esi 
     movl $.LC0, %edi  //Moves w/e $.LC0 is into edi. Based on the top, edi now holds that string? 
     movl $0, %eax  //moves 0 into eax 
     call printf   //print statement 
     leave 
     ret 
+0

[SARは、インテルのinsn setリファレンスマニュアル(http://www.felixcloutier.com/x86/SAL:SAR:SHL:SHR.html)に記載されています。参照してくださいhttp://stackoverflow.com/tags/x86/info –

答えて

1

sarは算術右シフトです。単一のオペランド形式は、オペランドを1つ右にシフトし、最上位のビットにその番号の符号を埋め込みます。接尾辞qは、オペランドが64ビットオペランド(クワッドワード)であることを示します。したがって、sarq -8(%rbp)は、クワッドワードを、%rbpより8バイト右に1つシフトします。

+0

私はバイナリにその最高の番号を変換し、1以上シフトし、そのinfrontを追加しますか?したがって、結果は!= 1の場合の操作になります。 –

+0

@JMei:b63(最上位ビット)は値(符号)を保持します。ビットb62〜b0の場合、1つ右のシフトは、そのb_i = b_old_i + 1を意味する。したがって、0xAAAAAAAAAAAAAAAAは​​0xD555555555555555になります。 'shr'はb63をゼロで埋めるでしょう。 'sal'と' shl'は両方とも値を左にシフトします(同じ結果)。 'sarq'は' sar(-1)== -1'を除いて、ほぼ符号付きの整数の除算です。 x86命令セットリファレンスガイドを確認してから、ビットシフト命令のチュートリアルを検索してみてください。あなたが何かをREにしたいなら、あなたは命令セットrefを持っているはずです。とにかく手で。 :) – Ped7g

3

andl $1, %eax //dunno what eax is but adds 1 into it

Uhmm ... eaxraxの下32bの部分です。そしてそれはaddではなく、andです。したがって、4進値からは、最下位ビット(b0)のみがeaxに残ります。

これは結果値(最初はゼロ)でxor-edされます。

四捨五入された値は符号付きシフトによって右にシフトされますが、定数は正(0x00BCDEFABCDEFBBB)なので重要ではありません。さもなければ、そのコードは負の定数のために無限ループで終了するでしょう!この場合、ヒューマンプログラマはshrを使用するため、この関数は64bの値に対して機能します。

コード全体が、その長い定数のパリティを計算し(非常に効果的な方法で、最適化されていないコードのように見える)、それを#ans#\ nとして出力します。 )または1(奇数)。

(私はそれをデバッグしませんでした。ちょっと見ただけで、何かを見逃してしまいました。デバッガで試してみてください)。


ところで、これらのコメントでうまくいっていれば、少なくとも別の問題を指摘するのは簡単でした。誰も気付かないと、sarqにしか答えられません。

関連する問題