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