カテゴリー別アーカイブ: nasm

assembly language

[nasm]四則演算

add,sub,mul,divを用いて演算を行う。
もちろん出力はASCIIコードで31hが1となるように計算。

結果は
5
1
6
3
と表示される

bits 64
section .text

global _main
_main:

	;足し算 5を出力
	mov rbx, 33h
	mov rcx, 02h
	add rbx, rcx
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	;引き算 1を出力
	mov rbx, 33h
	mov rcx, 02h
	sub rbx, rcx
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	;掛け算mulは引数をraxと掛けてraxに格納
	mov rax, 3
	mov rbx, 2
	mul rbx  
	add rax,30h
	push rax
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	;割り算 divは引数でraxを割ってraxに格納
	mov rax, 6
	mov rbx, 2
	div rbx  
	add rax,30h
	push rax
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall


	mov rax, 0x2000001
	mov rdi, 0
	sys call

[nasm]文字を一文字ずつ出力

文字を一文字ずつ表示することで、レジスタやスタックの扱いに慣れる。

<解説>
基本はraxにシステムコール、それ以外で引数を入力。
rax0x2000004は標準出力で、
rbxに文字を一文字ASCIIの16進数で格納。
rsiは直接代入できないらしく、rbxをpushでスタックに格納して、leaで参照させている。
引数が全て揃ったらsyscallで実行。

bits 64
section .text

global _main
_main:
	mov rax, 0x2000004
	mov rbx, 32h
	mov rdx, 01h
	mov rdi, 1
	push rbx
	lea rsi, [rsp]
	syscall

	mov rax, 0x2000004
	mov rbx, 0ah
	mov rdx, 01h
	mov rdi, 1
	push rbx
	lea rsi, [rsp]
	syscall

	mov rax, 0x2000001
	mov rdi, 0
	syscall

[nasm]Hello World

1.開発環境OSX10.8.5 nasmはversion2.11.05

2.サンプルコード

global _main
section .text
_main:
	mov	rax, 0x2000004 ;write
	mov rdi, 1 ;stdout
	mov rsi, msg
	mov rdx, 14
	syscall

	mov rax, 0x2000001 ;exit
	mov rdi, 0
	syscall

section .data
	msg:	db "Hello World!", 10
	.len:	equ	$ - msg	

3.コンパイルは以下のコマンドにて行った。リンカはgccでも一部可能だがldの方が確実。
$nasm -fmacho64 hello.asm && ld -macosx_version_min 10.8.5 -lSystem hello.o -o hello && ./hello