boxnos booting...


うっほぉ。文字列っすよ文字列!movb,movwとかちょっとめんどいです。しかし、ニーモニック(アセンブラ=マシン語)に沿った書き方をするならAT&T方式の方がニーモニックに近い気がします。課題はローカルラベルの指定がよくわからない所かな。

あと、asmx86_64 - Syntax highlighting for x86_64 asm including gcc preprocessor : vim onlineゲットで〜す。かなりみやすくなりました。64ビット対応なんていつの日か・・・やっばい早く寝ないと。

.code16
.globl _start
_start:
	# put test
#	movb $'A', %al
#	call put
	
	# print test
	movw $bootMessage, %si
	call print
	
	jmp haltLoop

put:
	pushw %bx
	pushw %ax
	
	# BIOS call
	movb $0x0e, %ah
	xorw %bx, %bx
	int $0x10
	
	popw %ax
	popw %bx
	ret

print:
	pusha
print_start:
	movw (%si), %ax
	incw %si
	cmpb $0, %al
	je print_end
	call put
	jmp print_start
print_end:
	popa
	ret

haltLoop:
	hlt
	jmp haltLoop

bootMessage:
	.ascii "boxnos booting..."
	.byte 0

signature:
	. = _start + 510
	.word   0xaa55
  • 追記:ツッコミどころは、boxnos booting...。boxnos is booting...ですね。英語勉強しないと・・・。

数字のみのシンボル名はローカルシンボル名として特別な機能を持ちます。ローカルシンボル名は何度でも同じシンボル名を使うことができます。参照する場合は前方なら「f」、後方なら「b」をローカルシンボル名の後ろに付けて区別します。例えばソースファイル中で「55:」というローカルラベルが何度も現われても「55b」として参照された場合はソースファイルの後方(上方) で一番近くにある「55:」を示します。同様に「55f」の場合は前方(下方)で一番近くにある「55:」を示します。同じローカルシンボル名でもアセンブラは内部で異なる値として管理しています。ローカルシンボル名は同じファイル内で有効(スコープはファイル)です。

(ARMでは使えないようです)さらにスコープの狭いラベルも使うことができます。コロン「:」の代わりに「$」を後ろに付けて宣言したローカルラベルは、通常のラベルとラベルの間のみが有効範囲となります。この形式も同じシンボル名であってもアセンブラ内部で異なるシンボル名として管理されます。「55$」と「55:」は区別してアセンブラ内で管理されます。

おぉ。グレイトな解説!!試そう!

  • 追記:修正
print:
	pusha
1:	movw (%si), %ax
	incw %si
	cmpb $0, %al
	je 2f
	call put
	jmp 1b
2:	popa
	ret

スッキリ!