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
スッキリ!