読者です 読者をやめる 読者になる 読者になる

Introduction to x86 Assembly(Martin Hirzel, 2011)

https://cs.nyu.edu/courses/fall11/CSCI-GA.2130-001/x64-intro.pdf

x86アセンブリはじめの一歩である。 Intelのdevelopers guideを読もうかと思ったら4000ページくらいあったので4ページのこの文書と、 こちらの14ページ公式チュートリアルをまずは読もうと思う。 https://software.intel.com/sites/default/files/m/d/4/1/d/8/Introduction_to_x64_Assembly.pdf

この資料自体はNew York Univ.の授業で使われたもので、授業で扱うx64のサブセットを解説したものである。

アセンブリの形式の主流なものとして、AT-T形式というものと、Intel形式というものがあるそうである。 その他、いくつか入門的な日本語の資料は例えばこちら

OSX環境、clangでintel形式のasmを出力するには-mllvm --x86-asm-syntax=intelをclangのオプションに指定すればいいようである。(stack overflowでは3.5+ではgcc同様に-masm=intelを受け付ける、との記述があったが、手元の3.5ベースのclangではこのオプションは認識されなかった)

関数呼び出しの際にはconventionがあり、 * 引数が6つまでの場合には定められたレジスタを使って引数の受け渡しを行う * それ以上の場合には余剰の引数をstackに逆順に引数を積む(stackはhigh->low addressに伸びるので、積み終わったものはaddressの順に並んでいる) * その後、戻った後の処理の位置、スタックポインタをstackに積み、処理をcalleeに移す * 呼び出しから戻る際には、呼び出し元関数に属するレジスタの値を呼び出し前の状態に戻し、スタックポインタを戻し、callerの処理の続きに戻る

この他にもABIはたくさんあり、例えば、Linuxx86でのC言語の場合のABIは以下の資料に記述がある。 http://x86-64.org/documentation/abi.pdf