ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月23日(木) 10:35

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2014年8月30日(土) 14:55 
お世話になります。
早速ですが、AB4でマシン語プロシージャを呼び出すときの話です。

マシン語の呼び出し方は、このサイトの「マシン語を走らせる」というトピックで知りました。ありがとうございます。
「マシン語を走らせる」http://www.activebasic.com/forum/viewtopic.php?t=308

質問ですが、たいていのWindowsPCでも動くようにプリプロセッサなどを指定してプログラミングし、そのソフトをほかのユーザーが個々のWindowsPCで使用した時に、きちんとCALLして処理をしてRETで復帰できるのでしょうか?

よろしくお願いしたします。


通報する
ページトップ
   
投稿記事Posted: 2014年8月30日(土) 19:04 
まずはお小言から。
実行ポインタを生のマシン語に移すという行為は、実用的にはあまり褒められたものではありません。(興味本位でトライしてみる、というならともかくとして。)
一般論として、本来であれば主要言語とは別にアセンブラでコーディングし、静的リンク や 動的リンク で対応すべきです。
現状の ActiveBasic では静的リンクができないのですが、動的リンクなら外部 DLL 呼び出しという形で可能です。
生のマシン語呼び出しなどというイレギュラーな手法を採用する前に、他のまっとうな方法が使えないか検討してみましょう。


さて本題。

割と新しい CPU でしか使えない命令を使おうと考えている場合は注意しましょう。
CPU のベンダーが独自に定義している命令を使おうと考えている場合も同様です。
CPU が対応していない命令を食うと、きっと 無効オペコード例外 が発生します。
プログラムを実行する CPU が当該命令に対応しているのかを確認するのは、基本的には開発側の責任です。

ある命令を使うとき特別なレジスタを参照する場合、スレッドのコンテキスト スイッチ時に OS がそのレジスタを保存するのかを事前に確認しましょう。
保存しない場合、スレッドが次回に CPU タイム スライスを得たとき、そのレジスタの内容がスイッチ前のまま保たれている保証はありません。そもそも、前回とは異なる実行コアに割り当てられることもあり得ます。

ここまでは、生のマシン語呼び出しというよりはアセンブラ一般に当てはまる内容です。

Windows の DEP(データ実行防止)に注意しましょう。
迂回方法等は先のトピックにて説明されているとおりです。

生のマシン語の呼び出しがうまく行くのは、おそらく CS セレクタが指すセグメント ディスクリプタのベース アドレスと DS セレクタが指すセグメント ディスクリプタのベース アドレスが一致している場合のみ、条件によっては SS セレクタも同様です。
このルールは意識しなくても実用上問題になることはまずないでしょうが、舞台裏の事情ということで頭の片隅には留めておきましょう。

生のマシン語が格納されるメモリ番地は、プログラム実行の都度変わるものと考えるべきです。
さらに言えば、生のマシン語のメモリ領域確保と解放とを繰り返すことが可能な設計だと、確保の度に変わります。
生のマシン語のコード片は、メモリ上のどの番地に置かれても正しく動作するよう作られねばなりません。

生のマシン語の中から、外の関数を呼び出すときは、呼び出し先のメモリ番地には気をつけましょう。
生のマシン語の中から Windows API 関数を呼び出す場合や、外部 DLL の関数を呼び出すときは特に気をつけましょう。これらの関数が配置されるメモリ番地は、実行の都度変わり得るからです。
関数だけでなく、グローバル変数へのアクセスも同様に注意しましょう。
外のコードやデータが配置されるメモリ番地もまた、実行の都度変わるかもしれません。

これらの注意点は、本来であればコンパイラ/リンカ/OS(プログラム ローダやタスク管理機構)が互いに協調することで解決され、現代のプログラマにとっては過去の問題となりました。
しかし、生のマシン語を自前で用意するということは、これらのサポートを迂回することを意味しますので、プログラマが自分で問題を克服せねばなりません。


通報する
ページトップ
   
投稿記事Posted: 2014年9月03日(水) 11:35 
ありがとうございます。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke