低レベルプログラミング (No.01:前置き)

「低レベルプログラミング」について

プログラミングについて

最近は、強力なスクリプト言語である「Python」や、こどものプログラミング教育向けのグラフィカルな「Scratch」等が流行していると思います。

また、高度なプログラムを開発するための3rdパーティライブラリも充実していて、筆者も色々とお世話になっています。

プログラム開発言語や開発環境はどんどん進化していますが、それでも開発したプログラム(ソフトウェア、アプリ)は、最終的にはパソコンの内部でCPUやメモリ上で動作しています。

(最近は、グラフィックボードのGPUやその他のリソースも利用されていますが、この記事ではそのあたりは触れません…)

機械語とアセンブリ言語

CPUはコンパイル言語(C/C++/C#など)やスクリプト言語(Pyhotnなど)のソースコードは解釈できないので、コンパイラなどでCPUが解釈可能な『機械語』へ変換します。

変換された機械語は下記の様にただただ16進数の羅列なので、機械語を読解しようとするのは大変です。

       +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
0005D0  00 00 8B 30 E8 E5 23 00-00 57 56 FF 30 E8 1E FE  ...0..#..WV.0... 
0005E0  FF FF 83 C4 0C 8B F0 E8-12 05 00 00 84 C0 74 6B  ..............tk 
0005F0  84 DB 75 05 E8 0E 23 00-00 6A 00 6A 01 E8 59 02  ..u...#..j.j..Y. 
000600  00 00 59 59 C7 45 FC FE-FF FF FF 8B C6 EB 35 8B  ..YY.E........5. 
000610  4D EC 8B 01 8B 00 89 45-E0 51 50 E8 70 18 00 00  M......E.QP.p... 
000620  59 59 C3 8B 65 E8 E8 D3-04 00 00 84 C0 74 32 80  YY..e........t2. 
000630  7D E7 00 75 05 E8 BE 22-00 00 C7 45 FC FE FF FF  }..u..."...E.... 
000640  FF 8B 45 E0 8B 4D F0 64-89 0D 00 00 00 00 59 5F  ..E..M.d......Y_ 
000650  5E 5B C9 C3 6A 07 E8 83-03 00 00 56 E8 F1 22 00  ^[..j......V..". 
000660  00 FF 75 E0 E8 AD 22 00-00 CC E8 A3 02 00 00 E9  ..u..."......... 
000670  74 FE FF FF 55 8B EC 8B-45 08 56 8B 48 3C 03 C8  t...U...E.V.H<.. 

人が理解可能なニーモニックを使ったアセンブリ言語だとある程度読解可能になるかと思います。

; Function compile flags: /Odtp
_TEXT	SEGMENT
_c$ = -12						; size = 4
_b$ = -8						; size = 4
_a$ = -4						; size = 4
_main	PROC
; File c:\Test\sample.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

記事の内容

下記の様な事を記載していく予定です。

  • プログラムがPC上でどのように動作するか?
  • コードの違いによる実行時の速度差
  • 大きなデータを扱う際に気を付ける事

本記事では、アセンブリ言語は多少出てきますが、アセンブリ言語についての詳細の説明(個々のニーモニック等の説明)はしない予定です。

自分がプログラムコードを書く際に、どういう機械語に置き換わるかをイメージできると、自分の書いたプログラムコードが実行時に時間が掛かる場合、なぜそうなるのかのヒントになり、少し実行速度が速いプログラムを作成できる様になると思います。

自分で試す場合に必要なもの

この記事で書かれている内容を自分で試す場合は、以下の物が必要になります。

(多少バージョンが異なっても大丈夫だと思いますが、筆者は下記環境を利用しています。)

項目ツール名補足
PCIntel(R) Core(TM) i7x86系なら特に問題なし
OSWindows 10Home/Proどちらでも
開発環境Microsoft Visual Studio Community 2019ライセンスは確認しましょう

記事一覧

No.01(この記事)                     
No.02アセンブリコードの生成
No.03アセンブリコードの確認
No.04関数について
No.05配列とポインタ
No.06条件分岐
No.07スタック領域とヒープ領域
No.08TIPS(C)
No.09C#について
No.10C#でポインタ
No.11C#で画像(Bitmap)を扱う①
No.12C#で画像(Bitmap)を扱う②