アセンブリを学ぶメリット
—
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