アセンブリを学ぶメリット
—
CPU を支配できる.
コンパイラより高速なコードを書ける
文法が簡単である.
バイナリ (実行できるプログラム) が小さい.
まったく新しい OS を作るには必須の知識である.
ウイルスに負けない体力を養える.
コンパイラやインタプリタの作者になれる.
Linux カーネルの機能を理解できる.
C のポインタが簡単に理解できる.
—
OS(ブートローダー、カーネル、デーモン、シェル、デスクトップマネージャ、アプリケーション)、カーネル、インタプリタ、コンパイラ周りを理解するには必須のスキルだということがわかる。
hello.asm
;------------------------------------ ; hello.asm ;------------------------------------ section .text global _start msg db 'hello, world', 0x0A msglen equ $ - msg _start: mov ecx, msg ; 文字列の場所を指定 mov edx, msglen ; 文字列の長さを設定 mov eax, 4 ; 出力のシステムコール mov ebx, 1 ; 標準出力を指定 int 0x80 ; システムコール実行 mov eax, 1 ; 終了のシステムコール mov ebx, 0 ; 正常終了の 0 に設定 int 0x80 ; システムコール実行 ;------------------------------------
プログラムを終了するサブルーチン
Exit: mov eax, 1 ; sys_exit mov ebx, 0 ; exit with code 0 int 0x80
異常終了
;------------------------------------ ; exit with ebx ExitN: mov ebx, eax ; exit with code ebx mov eax, 1 ; sys_exit int 0x80
writeのシステムコール
;------------------------------------ ; print string to stdout ; eax : top address ; edx : no of put char OutString: pusha mov ecx, eax mov eax, SYS_write mov ebx, 1 ; to stdout int 0x80 popa ret
;------------------------------------ ; get length of asciiz string ; eax : top address ; eax : return length StrLen: push ecx push edi mov edi, eax push eax xor eax, eax mov ecx, 0xFFFF ; no more than 65k chars. repne scasb pop ecx sub edi, ecx mov eax, edi pop edi pop ecx ret ;------------------------------------ ; print asciiz string ; eax : pointer to string OutAsciiZ: push edx push eax call StrLen mov edx, eax pop eax call OutString pop edx ret