LinuxでNASM
今回、息抜きとしてLinuxにNASMを入れてみました。Perlをのぞけばはじめての開発環境!
簡単にmakefileの書き方も調べてとりあえずhello, world。
いや、なんかアセンブラ随分久しぶりなんでどうかなーと思ったけど普通にかけてよかったです。分岐ジャンプ忘れてたけど(汗
それで、とりあえずメモリ確保するためにmmap2を使おうと思ったのですが、なんかうまくいかない。
仕方ないからeaxを表示するルーチンとか起こしてみたけど、そもそもエラーメッセージを見つけてない・・・
資料はどこにあるんだー><って感じですねw
今日はもう寝てまた後日調べようと思います。勉強しないといけないしw
一応今参考にしているURL貼っておきます。
http://www.lxhp.in-berlin.de/lhpsysc4.html#mmap2
本日のソース:
数字を変換する箇所はesiを8からはじめたらもうちょっときれいに書けた気はするんだけど。
あとローカルラベルの性質わすれたからラベルは汚いです。そのうち調べてなんとかします。
section .text global _start ALLOC_SIZE equ 10 * 1024 ;start programs _start: ;init mov ebp, esp mov eax, 192 ;mmap2 mov ebx, 0 ;address - null mov ecx, ALLOC_SIZE ;length mov edx, 0x03 ;page mode mov esi, 0x22 ;map flags - anonymous & private mov edi, -1 ;map descriptor - nothing int 0x80 cmp eax, 0 je end xor esi, esi loop: mov ebx, eax and ebx, 0xf0000000 shr ebx, 4 * 7 cmp ebx, 0x09 ja not_number add ebx, 0x30 Rnot_number: mov byte [msg_ + esi], bl inc esi shl eax, 4 cmp esi, 8 jne loop mov ecx, msg mov edx, msglen mov eax, 4 mov ebx, 1 int 0x80 mov eax, 1 mov ebx, 0 int 0x80 not_number: sub ebx, 0x0a add ebx, 0x61 jmp Rnot_number end: mov ecx, msg2 mov edx, msglen2 mov eax, 4 mov ebx, 1 int 0x80 mov eax, 1 mov ebx, 0 int 0x80 section .data msg db "error - 0x" msg_ db " [end]", 0x0a msglen equ $ - msg msg2 db "ok!", 0x0a msglen2 equ $ - msg2