eax
、ebx
などにプログラムが起動すると(linux、elf)、そこに0が入っているか、何かがある可能性があります(私は何もしていないか、externライブラリを使用していますか?私のマシンでは本当にそうですが、asmプログラムを書くときにそのような動作を中継することはできますか?プログラム起動時のデフォルトのレジスタ状態(asm、linux)とは何ですか?
答えて
これは、プラットフォームごとにABIに依存します。 eax
とebx
については、x86の場合を見てみましょう。 ABIは、プログラムロード時にレジスタ値のための任意のrequirementsを指定している場合fs/binfmt_elf.c
load_elf_binary()
内部回線#972、カーネル・チェックで:
/*
* The ABI may specify that certain registers be set up in special
* ways (on i386 %edx is the address of a DT_FINI function, for
* example. In addition, it may also specify (eg, PowerPC64 ELF)
* that the e_entry field is the address of the function descriptor
* for the startup routine, rather than the address of the startup
* routine itself. This macro performs whatever initialization to
* the regs structure is required as well as any relocations to the
* function descriptor entries when executing dynamically links apps.
*/
次にarch/xxx/include/elf.h
各アーキテクチャのために定義されたマクロである、ELF_PLAT_INIT
を呼び出します。 x86のために、それはfollowingん:あなたのELFバイナリをLinux x86の上でロードされたとき
#define ELF_PLAT_INIT(_r, load_addr) \
do { \
_r->bx = 0; _r->cx = 0; _r->dx = 0; \
_r->si = 0; _r->di = 0; _r->bp = 0; \
_r->ax = 0; \
} while (0)
だから、あなたはすべてのレジスタ値がゼロに等しいに数えることができます。しかし、あなたがすべきではありません。 :-)
このゼロ化はまだ発生しますが(2015)、ABIでは必須ではありません。 (バジルの答えに対するCiroのコメントを参照)。 –
また、動的リンクされた実行可能ファイルでは、 '_start'の前に動的リンカーが実行され、ABIによって許可されているようにレジスタにガベージが残っていることにも注意してください。静的にリンクされた実行可能ファイルのみが、実行が '_start'に達するとレジスタがゼロになります。 –
LinuxのAMD64またはx86-64システム(64ビット)の場合、x86-64 ABIはレジスタの初期内容を定義します。
のx86-64システムV ABIセクション3.4.1 "初期スタックとレジスタの状態"上のウィキペディアのページを参照してください。 (Basile linked to PDF):
第スタックへ点
スタックポインタは がスタックの一部である最下位アドレスのバイトのアドレスを保持します。プロセスのエントリ
%rdx
それがゼロ以外だ場合、アプリケーションは、atexitをして登録する必要が関数ポインタで並んで16バイトであることが保証されます。アプリケーションが
%rbp
に登録するべき機能ポインタが指定されていないが、ユーザーランドは、ベースフレームに設定しなければなりません。このレジスタの内容はプロセスの初期化時には指定されていませんが、ユーザーコードはフレームポインタをゼロに設定して最も深いスタックフレームをマークする必要があります。
その他はすべて定義されていません。
Linuxの場合は、「LSB」と表示されます
'%rdx'はNULLにすることができ、現在のLinuxでは、静的にリンクされた実行可能ファイルからの新鮮なプロセスで' 0'です。しかし動的リンカーは、動的リンクされた実行可能ファイルを実行するときに '_start'の前で実行されるので、'%rdx'に値を設定できます( 'gdb/bin/bash'に従って)。私は '_start'がそれをその時点で関数ポインタとして扱うことになっているかどうかは確かではありませんが、おそらくはyesです。 –
i386 ABI(http://www.sco.com/developers/devspecs/abi386-4.pdf)は、対応する32ビットレジスタの要件が同じです: '%esp'、'%edx'、 '%ebp'それ以外はすべて定義されていません。 – pts
- 1. 起動時のデフォルトのレジスタとセグメントの値x86マシン
- 2. コアデータ - 起動時のマルチスレッド競合状態
- 3. Linuxのデスクトップから起動したプログラムのデフォルトの標準入力と標準出力は何ですか?
- 4. KERASのGRUのデフォルトの非表示状態は何ですか?
- 5. 子状態と固定状態の違いは何ですか?
- 6. UIの状態とは何ですか?
- 7. UnixとLinuxの状態env
- 8. ASM - "%"とは何ですか?
- 9. デフォルトのアンドロイドランチャーをプログラムで起動する
- 10. プログラムを起動するとプログラムがクラッシュする.Windows起動時の起動()
- 11. 組み込みLinux、アプリケーション状態フリーズ、再起動
- 12. サーバ起動時に休止状態で動的に休止状態のカラムをロードする方法
- 13. 再起動時にASP.NETアプリケーションの状態を保持する
- 14. 状態更新のLinux受動待機
- 15. デフォルト状態は分解で
- 16. Grepが "S +"状態で起動する
- 17. 起動時のPythonスクリプトLinux
- 18. Androidアプリの起動時に電源状態を取得
- 19. SlimDX起動時に誤ったジョイスティックの状態
- 20. StateMachineInterceptorが一時的な状態で起動しました
- 21. gen_serverの状態ライフサイクルは何ですか
- 22. PDF/VTの状態は何ですか
- 23. Linuxの起動時のデフォルトヒープサイズは?
- 24. PythonでCPUレジスタの状態を取得するには?
- 25. 春の起動と休止状態でのMysql 'Like'の検索
- 26. アプリケーションの起動時にsql接続の状態をチェックする方法は?
- 27. PCの再起動時にWindowsデバイスの状態を確認する方法は?
- 28. スリープ状態のFirebaseデータベースサーバアプリケーションがリスナーイベントで起動しますか?
- 29. エラー状態でJavaScriptプログラムの動作を停止しますか?
- 30. Java:アプリケーションの再起動時にjvm状態を維持して復元することは可能ですか?
通常の状況では、これらを明示的に初期化します。したがって、初期状態が何であるかは関係ありません。 – nobar
私は実行可能ファイルにいくつかのバイトを保存しようとしていますが、これを避けることができれば、移動ゼロをeaxにしたくありません。 movlコマンドを使用すると、5バイトに変換されるため、1をeaxに入れる必要があります。だから私はmovbを使用して、1をalにしたい。結果は同じで、コマンドは2バイトに変換されます。私は3バイトの利得を得る。しかし、デフォルトではeaxにゼロがある場合にのみ実行できます。 –
どのような状況下で、この量のコードが節約できますか?ちょうどそれらを初期化してください。 EAXの最上位ビットが問題でなければ、movb al、1で初期化できますが、スペースについて心配する必要はありません。 –