0

ですから、私は NASM に非常に慣れていないと言って、これを限定させてください。

16 進数の文字列を 10 進数に変換しています。ほとんどのプログラムを実行していますが、アセンブリでの記述方法がわからない C コードのセクションに遭遇しました。CL には文字列のサイズがあり、AL には 16 進文字の整数値が保存されています。

私がやりたいのは、16^CL * (整数値) を計算し、その値を EAX に追加することです (サイズ 4 の文字列を実行するだけでよいため、いつでも EAX に収まるように値を取得できます)。

私は今、プログラムのこの部分に数時間取り組んでいますが、困惑しているようです (それ以外は、最初に 4096 をハードコーディングし、2 番目に 256 をハードコーディングするだけです... ect、私は頼らなければならないのが嫌いです) )。

どんな助けでも大歓迎です。

4

1 に答える 1

0

16 進/バイナリ文字列を数値に変換するために指数関数は必要ありません。16 を繰り返し掛けるだけです。

#include <stdio.h>

unsigned long long hex2num(const char* hex)
{
  unsigned long long result = 0;

  while (*hex != '\0')
  {
    char b = *hex;

    if (b >= 'a' && b <= 'f') b = b - 'a' + 10;
    else if (b >= 'A' && b <= 'F') b = b - 'A' + 10;
    else b = b - '0';

    result = result * 16 + b;
    hex++;
  }

  return result;
}

const char* const testData[] =
{
  "0",
  "f",
  "1F",
  "Ffff",
  "FFFFFFFF",
  "7fffffffffffffff"
};

int main(void)
{
  unsigned i;
  for (i = 0; i < sizeof(testData)/sizeof(testData[0]); i++)
    printf("\"%s\" = %llu\n", testData[i], hex2num(testData[i]));
  return 0;
}

出力:

"0" = 0
"f" = 15
"1F" = 31
"Ffff" = 65535
"FFFFFFFF" = 4294967295
"7fffffffffffffff" = 9223372036854775807

また、16 による乗算は 4 つのバイナリ位置を左にシフトすることと同等であり、加算はbビットごとの OR で置き換えることができることにも注意してください。

于 2012-05-03T06:28:13.527 に答える