プログラムする課題が

前回のメモリ確保はとりあえず保留して他の道具をそろえようと思う。
とりあえず何をプログラムしようかと考えた時、これだってものが思いつかなかったので、とりあえず数学の問題でもやっていこうかなと思う。
最初の課題は二次方程式の解でも求めてみようかなと。
そこで、今回はとりあえず、読み込み、書き込みAPIをサブルーチン化し、前回作った数字->文字をサブルーチン化。。。しようとしましたw
結論からいうと、読み書きのAPIがなぜか思うように動かずに今日はここで終了。
具体的には、dataセグメントの領域を書き換える分にはうまくいくのですが、なぜかスタックを書き換えるとうまくいかないという。
espを表示させてみたりもしたけど、ずれてる訳でもなさそうですし。いや、そもそもずれてたら例外とかではじかれそうだけどw


自分はputtyssh経由でソースを書いているのですが、なぜかコピーするとtabがスペースに変わってしまう。そういう仕様なのだろうか・・・


本日のソース:
これは上で書いたBADなソース。
サブルーチン周りうまくできたら別ファイル化するかも。というかしたい。

;-----------<notice>-----------
;d* : data, l* : lengh
;s* : sub rutine, r* : return
;a* : api macros
;------------------------------
;------------------------------
;CODE SECTION
;------------------------------
section .text


;GROBAL LABEL
global _start


;MACROS
ALLOC_SIZE      equ     10 * 1024


;MACROS - API
%macro aEnd 0
        mov     eax, 1
        mov     ebx, 0
        int     0x80
%endmacro

%macro aWriteS 2                ;api:Write to Stdout
        push    %2
        push    %1
        push    1               ;to stdout
        call    sWrite
        add     esp, 4 * 3
%endmacro

%macro aReadS 2                 ;api:Read from Stdin
        push    %2
        push    %1
        push    0               ;from stdin
        call    sRead
        add     esp, 4 * 3
%endmacro


;MAIN RUTINE
_start:
        aWriteS dFunc, lFunc
        aWriteS dInA, lInA
        sub     esp, 16
        aReadS  esp, 16
        aWriteS esp, 16
        add     esp, 16
        aEnd

;SUB RUTINES
sWrite:                         ;api:Write
        push    ebp
        mov     ebp, esp
        push    eax
        push    ebx
        push    ecx
        push    edx
        mov     eax, 4
        mov     ebx, [ebp + 8]  ;to
        mov     ecx, [ebp + 12] ;ptr to outB
        mov     edx, [ebp + 16] ;outB size max
        int     0x80
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        pop     ebp
        ret

sRead:                          ;api:Read
        push    ebp
        mov     ebp, esp
        push    eax
        push    ebx
        push    ecx
        push    edx
        mov     eax, 3
        mov     ebx, [ebp + 8]  ;from
        mov     ecx, [ebp + 12] ;ptr to inB
        mov     edx, [ebp + 16] ;inB size max
        int     0x80
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        pop     ebp
        ret

sNum2str:
;Numbers to Strings ,32bit
;agr - eax : num, ebx : ptr to outB
        push    ebp
        mov     ebp, esp
        push    esi
        push    edx
        mov     esi, 8
.loop:
        mov     edx, eax
        and     edx, 0x0f
        cmp     edx, 0x09
        ja      .notNumber
        add     edx, 0x30
.rNotNumber:
        mov     [ebx + esi -1], dl
        shr     eax, 4
        dec     esi
        jnz     .loop
        pop     edx
        pop     esi
        pop     ebp
        ret
.notNumber:
        add     edx, 0x61 - 0x0a
        jmp     .rNotNumber

sStr2Num:
;Strings to Numbers ,32bit dec
;arg - eax : num, ebx : ptr to inB
        push    ebp

;------------------------------
;DATA SECTION
;------------------------------
section .data

test:   db      "00000000", 0x0a

dFunc:  db      "Please input a, b, c are enough for ", 0x22, "ax^2 + bx + c = 0", 0x22, 0x0a
lFunc:  equ     $ - dFunc
dInA:   db      "a = "
lInA:   equ     $ - dInA
dInB:   db      "b = "
lInB:   equ     $ - dInB
dInC:   db      "c = "
lInC:   equ     $ - dInC