2

私は今学期にコンピュータアーキテクチャコースを終えたところです。ここでは、とりわけ、MIPSアセンブリに手を出し、MARSシミュレータで実行しています。今日、好奇心から、UbuntuボックスでNASMをいじり始めました。基本的には、チュートリアルから物事をつなぎ合わせて、NASMがMIPSとどのように違うのかを感じ取っています。これが私が現在見ているコードスニペットです:

global _start

_start:

    mov eax, 4
    mov ebx, 1
    pop ecx
    pop ecx
    pop ecx
    mov edx, 200
    int 0x80
    mov eax, 1
    mov ebx, 0
    int 0x80

これはtest.asmとして保存され、とアセンブルnasm -f elf test.asmおよびリンクされld -o test test.oます。を使用して呼び出すと./test anArgument、期待どおりに'anArgument'が出力され、その後に、その文字列を合計200文字まで埋めるのに必要な文字数が続きます(そのmov edx, 200ステートメントのため)。ただし、興味深いのは、これらのパディング文字は、envコマンドで表示されるように、実際には環境変数の最初からのものであるということです。なぜこれが私の環境変数を出力するのですか?

4

3 に答える 3

7

実際の答えがわからない、またはそれを調べる時間がないので、環境変数はコマンドライン引数の後にメモリに格納されると思います。あなたのコードは単に環境変数文字列にオーバーフローしてそれらを出力するバッファです。

コマンドライン引数は環境変数と同様にシステム/ローダーによって処理されるため、これは実際には理にかなっています。したがって、それらが互いに近くに格納されていることは理にかなっています。これを修正するには、コマンドライン引数の長さを見つけて、その数の文字だけを出力する必要があります。または、nullで終了する文字列であると想定しているため、ゼロバイトに達するまで出力します。

編集:コマンドライン引数と環境変数の両方が初期化されたデータセクションに格納されていると思います(NASMの.data、私は信じています)

于 2008-12-03T16:55:07.973 に答える
2

環境変数を取得する理由を理解するには、カーネルがプロセスの起動時にメモリをどのように配置するかを理解する必要があります。写真付きのわかりやすい説明があります(「スタック レイアウト」までスクロールします)。

于 2008-12-04T07:00:24.557 に答える
1

興味がある限り、文字列のアドレスを出力する方法を見つけたいと思うかもしれません (それは渡され、スタックからポップしたと思います)。また、16 進ダンプ ルーチンを作成して、そのメモリやその他の関心のあるアドレスを確認できるようにします。これは、プログラム空間について何かを発見するのに役立つかもしれません。

好奇心は、プログラマーのツールボックスの中で最も重要なものかもしれません。

起動プロセスの詳細は調べていませんが、新しいシェルが起動するたびに環境のコピーが作成されると思います。実行したコマンドや作成したスクリプトなどによって開始されたシェルの残り物が表示される場合があります。

于 2008-12-03T17:17:22.703 に答える