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