0

因此,让我通过说我对 NASM 非常陌生来限定这一点。

我正在将十六进制字符串转换为十进制数。我的大部分程序都在运行,我遇到了一段 C 代码,我不知道如何用汇编语言编写。我在 CL 中有我的字符串的大小,我有保存在 AL 中的十六进制字符的整数值。

我想要做的是 16^CL *(整数值),然后将该值添加到 EAX(因为我们只需要执行大小为 4 的字符串,我总是可以让我的值适合 EAX)。

我已经在程序的这一部分工作了几个小时,我似乎被难住了(除了第一个硬编码 4096,第二个硬编码 256 ......等等,我讨厌不得不诉诸)。

任何帮助,将不胜感激。

4

1 回答 1

0

您不需要任何指数函数即可将十六进制/二进制字符串转换为数字。只需重复乘以 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 回答