2018年9月17日月曜日

C#でMicrosoft Speech Object Libraryを使う(Win10)


詰まった箇所3点についてのメモ書き

1. 「参照の追加」はどこにある?
ソリューションエクスプローラーで右クリックすると出てきます。

2. 実行時の例外、クラスが
SpVoiceの初期化辺りでこけますが、こちらはx64版Runtimeをインストールしている状態で、Any CPU設定でデバッグすると発生します。x64に設定を変更してから再度試せば解消しました。 

3. HRESULTからの例外: 0x80045039
詳細原因は分かりませんが、私の場合はMicrosoft Speech Object Libraryのバージョンをv11からv5.4に落としたらクリアしました。恐らくですが、v5.4はおそらくSoftalkあたりをインストールした時についてきて、v11は自分でインストールしたものなので、その辺りぶつかったのではないかと思います。なお、v5.4は2種類ありますが、system32を経由しない方を選択してください(というかsystem32側だと選択時点でエラーを吐きます、権限がないので)

アセンブラ走り書き

intel記法の方が好きです。

- xor ax,axの理由
排他的論理和で同じものなら0になるわけですが、何故それならmov al,0とかにしないのかなと思っていたのですが、どうやら実行速度や資源が理由のようです。0を格納しておかなくて良いみたいな。後はmov al, 0x00はB000になるのでNullが発生したりして場合によっては都合が悪い的な。

- int 0x80
systemcallと何が違うのかなと思っていたのですが、これは32bit64bitの関係のようです。各レジスタに値を詰め込んでからint 0x80wするとシステムコールが呼び出せます。OS への唯一のアクセス方法であるとか。
 
http://softwaretechnique.jp/Linux/SystemCall/sc_01.html  によると、
axがシステムコール番号で、bxcxdxsidiが引数に当たるとのこと。
例えばmov al,0x66であれば、0x66は102なので
#define __NR_socketcall         102
となって、ソケット周りの機能が呼び出されます。
 
ただし、102でソケット関連を指定したところで、具体的な振舞いまでは指定できていません。そういうところを指定するのがbxになるのかな。
mov bl,0x1がsys_socket
mov bl,0x2がsys_bind
そして、cxには引数を積んだスタックのポインタが入るという流れのようです。