思いつく限り
1.高速化のために使う場合
 コンパイラがサポートしない特種命令を持つCPUの時、
 もしくは命令スケジュール等が実質サポートできていない命令を使いたい時。
2.ハードウエアをキックする場合
 オプティマイザがポートのキック順序を勝手に変えてしまい問題を引き起こしてしまう場合。
 もしくはアクセスタイミングが正確でなければ動作しないハードをキックする場合。
3.割り込み関連のコードを書く場合
 コンパイラがサポートしていないケースが多い。
4.言語間ブリッジを書く場合
 二つの言語間インターフェイスを取れる言語はアセンブラのみ。
5.コンパイラそのものを作るとき
 出力先にC等を使わないネイティブコンパイラには必須。
6.OSのような物を作る場合
 スタック操作やスレッドの実現に使う。
 プログラムのロード実行、その他自己書き換えのようなものを実現する場合。

以上