パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

MASMで、文字列を数値に置換するマクロ」記事へのコメント

  • MASM 使ったのは 20年以上前のことだから、 何が書いてあるのか分からないところがいっぱいだけど、

    str2num "54321"

    は、

    5*10000 + 4*(10000/10) + 3*(1000/10) + 2*(100/10) + 1*(10/10)

    という計算している?普通は、

    ((((0*10 + 5)*10 + 4)*10 + 3)*10 + 2)*10 + 1

    とするんだけどなぁ。Cで書けば、

    int res = 0;
    char* s = var;
    while (*s) {
      res = res * 10 + (*s - '0');
      ++s;
    }

    • 全く同感です。

      それに付け加えて、マクロなのに、どうしてリテラルとして文字列を渡してランタイム変換するのか謎です。

      単に、

      str2num MACRO str:REQ
         lea ecx, str
         xor eax, eax
         .WHILE 1
             movzx edx, BYTE PTR [ecx]
             inc ecx
             .BREAK .IF edx == 0
             lea eax, [eax * 4 + eax]
             lea eax, [eax * 2 + edx - 30H]
         .ENDW
      ENDM


      で良いのでは?(上のコメントのC言語のコードと同様です)
      または、.BREAK の行を、.BREAK .IF (edx < 30H) || (edx > 39H) にしても良いと思います。

      "~"形式でも引数を渡したければ、マクロに

      IFIDN @SubStr( str, 1, 1 ), <">
         mov eax, @SubStr( str, 2, (@SizeStr(str)-2) )
      ELSE
         ~
      ENDIF


      を追加すれば良いのでは?
      (このコードではエラーチェックは甘いですが)
      親コメント
      • by KMY (41075) on 2010年11月05日 7時51分 (#1853306) 日記

        movzxというニモニックがあったんですね。[]という演算子も初耳でした。
        こちらの勉強不足でした。
        ご指摘ありがとうございます。

        今後も懲りずにここにいろいろなコードを書くと思いますので、
        その時もどなたかよろしくお願いします。

        --
        By KMY
        親コメント

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

処理中...