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
スッキリ!
xd
odのオプション付けるのが面倒なので、.bashrcに alias xd='od -Ax -t x2z'を追加しました。
tanaka:~ $ alias xd alias xd='od -Ax -t x2z' tanaka:~ $ xd boxnos/boxnos/binary/boot.bin 000000 25be e87c 000d 1aeb 5053 0eb4 db31 10cd >.%|.....SP..1...< 000010 5b58 60c3 048b 3c46 7400 e805 ffea f4eb >X[.`..F<.t......< 000020 c361 ebf4 62fd 786f 6f6e 2073 6f62 746f >a....boxnos boot< 000030 6e69 2e67 2e2e 0000 0000 0000 0000 0000 >ing.............< 000040 0000 0000 0000 0000 0000 0000 0000 0000 >................< * 0001f0 0000 0000 0000 0000 0000 0000 0000 aa55 >..............U.< 000200
やっべぇ。便利!!