2017-03-16 4 views
0

アセンブリスイッチのステートメントについての本を読んでいますが、入力nが大文字小文字の場合:100,102,103,104,106です。ジャンプテーブルを簡略化してnを100で減算し、結果が6より大きい場合はL2のデフォルトの場合に、そうでない場合は%eaxの値と一致する対応するブランチに移動します。アセンブリ:swtichステートメント

私の質問は:ジャンプするテーブルのインデックスが%eaxに保持されている場合、行7は "jpm * .L7(、%eax)"であると考えられますか?そして、なぜ彼らは "ja .L2"を実行して5行目で番号をunsignに変更しましたか?

%のEBP + 8でint型のxに、int型のn%のEBP + 12

movl 8(%ebp), %edx 
movl 12(%ebp), %eax 
subl $100, %eax 
cmpl $6, %eax 
ja .L2 
jmp *.L7(,%eax,4) 
.L2: 
movl $0, %eax 
jmp .L8 
.L5: 
movl %edx, %eax 
jmp .L9 
.L3: 
leal (%edx,%edx,2), %eax 
leal (%edx,%eax,4), %eax 
jmp .L8 
.L4: 
leal 10(%edx), %eax 
.L9: 
addl $11, %eax 
jmp .L8 
.L6: 
movl %edx, %eax 
imull %edx, %eax 
.L8: 

では、ありがとう!

ジャンプテーブル:

.section .rodata 
.align 4 Align  
.L7: 
.long .L3   //Case 100: loc_A 
.long .L2   //Case 101: loc_def 
.long .L4   //Case 102: loc_B 
.long .L5  //Case 103: loc_C 
.long .L6  //Case 104: loc_D 
.long .L2  //Case 105: loc_def 
.long .L6  //Case 106: loc_D 

答えて

2

は、ジャンプテーブルのインデックスが%eaxに保持されている場合jpm *.L7(,%eax)すると仮定ライン7ではないでしょうか?

ジャンプテーブルの各エントリは、longです。これは4バイトです。したがってeaxは4

によってスケーリングされ、なぜ彼らは、ja .L2を行うことにより、ライン5にunsignに番号を変更したのですか?ポイントは、私はそれはそれはそれでは、nは、例えば、100未満だったとしましょう106
よりも大きな値を除外方法を明らかだと仮定し106以上100未満と大きいです任意の数を除外することである

それから100を減算すると-1が得られます。符号なしの32ビット値として見れば4294967295であり、明らかに6より上であり、.L2にジャンプする必要があります。私たちは、符号なし整数に符号付き整数を変更したときに符号付き整数は2の補数を使用しているため、符号なしではありませんが、符号なし整数の値は、いくつかの大規模な番号に変更されるので?

subl $100, %eax ; eax = 99-100 == -1 
cmpl $6, %eax  ; set flags based on -1 - 6 == -7 => ZF=0 and CF=0 
ja .L2   ; jump if ZF=0 and CF=0 
+0

がそれですか – woshidashen

+0

まあ、実際に起こっている兆候の "変化"はありません。条件付きジャンプは、特定のフラグの状態に基づいて行われます。 'ja'の場合は、ZF = 0、CF = 0ならジャンプが行われます。フラグを更新した最後の操作は 'cmp'でした。これは実際には減算です。 ZF = 0となる減算が、オペランドが等しくないことを意味し、CF = 0を得るためには、第1オペランド(「eax」)は第2オペランド(「6」)以上の符号なしである必要がある。そこで私はeaxの価値を無署名と見て、何が起きるのかを簡単に判断できるように提案しました。 – Michael

関連する問題