低レベルプログラミング (No.02:アセンブリコードの生成)

使用ツール:Visual Studio Community 2019
使用言語 :C言語

アセンブリコードの生成

今回は、簡単なC言語コードを用いて、アセンブリコード(*.asm)を出力する方法を確認していきます。

「なぜ、C言語なんだ?」と思われるかも知れませんが、Cコンパイラはアセンブラーリスティング ファイル出力が可能なためです。

コンパイル環境

今回、コンパイル環境として、Visual StudioのIDE(統合開発環境)は用いず、テキストエディタと『Developer Command Prompt for VS2019』を利用します。

『Developer Command Prompt for VS2019』は、Windowsメニューの「Visual Studio 2019」の中から起動します。

起動すると、コマンドプロンプト(DOS窓)が表示されます。


普通に起動したコマンドプロンプトと何が違うかと言うと、コンパイラなどへのパス設定が完了している環境になります。

サンプルコードの作成

今回は下記の様な簡単なコードを作成しました。

#include <stdio.h>

void main()
{
	int a = 1;  // 変数aに1を代入
	int b = 2;  // 変数bに2を代入
	
	int c = a + b; // 変数cにa+bの計算結果を代入
}

変数への代入と、足し算だけという簡単なコードです。

これを、「C:\Test\LLP_002」というフォルダを作成して、「llp_001.c」というファイル名で保存します。(フォルダ名、ファイル名は何でも構いませんが、以降のフォルダ名・ファイル名は置き換えながら読んでください)

サンプルコードのコンパイル

コマンドプロンプト(『Developer Command Prompt for VS2019』)のカレントディレクトリをサンプルコードを格納したフォルダへ変更します。

その後、「cl.exe llp_001.c」を実行してコンパイルを行います。

コードに問題が無ければエラーなくコマンドが終了し、フォルダには.objファイル、.exeファイルが生成されます。(オプションで指定なければ、アセンブリコードは生成されません)

今回のサンプルコードは実行しても何も出力しません。

アセンブリコードの出力

アセンブリコードを出力するには、「/FA」オプションを追加してコンパイルを実行します。

コンパイル時の出力メッセージ内容は「/FA」オプションを付けてもほぼ変わりませんが、フォルダには.asmファイルが生成されています。

アセンブリコード(lip_001.asm)はテキストエディタで開く事ができ、内容を確認すると下記の様にアセンブリコードが出力されている事が分かります。

; Listing generated by Microsoft (R) Optimizing Compiler Version 19.29.30146.0 

	TITLE	C:\Test\LLP_002\llp_001.obj
	.686P
	.XMM
	include listing.inc
	.model	flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC	_main
; Function compile flags: /Odtp
_TEXT	SEGMENT
_c$ = -12						; size = 4
_b$ = -8						; size = 4
_a$ = -4						; size = 4
_main	PROC
; File C:\Test\LLP_002\llp_001.c
; Line 4
	push	ebp
	mov	ebp, esp
	sub	esp, 12					; 0000000cH
; Line 5
	mov	DWORD PTR _a$[ebp], 1
; Line 6
	mov	DWORD PTR _b$[ebp], 2
; Line 8
	mov	eax, DWORD PTR _a$[ebp]
	add	eax, DWORD PTR _b$[ebp]
	mov	DWORD PTR _c$[ebp], eax
; Line 9
	xor	eax, eax
	mov	esp, ebp
	pop	ebp
	ret	0
_main	ENDP
_TEXT	ENDS
END

次回の予定

次回は、今回出力したアセンブリコードの内容について、確認していきたいと思います。


前の記事次の記事
No.01:前置きNo.03:アセンブリコードの確認