x86アセンブリ

アセンブリを学ぶメリット

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