指数的NASM,宏观或子程序?

时间:2012-05-03 05:36:21

标签: c assembly nasm

所以让我通过说我对NASM很新的来证明这一点。

我正在将十六进制字符串转换为十进制数字。我的大部分程序都在运行,而且我遇到了一段我的C代码,我无法弄清楚如何编写汇编代码。我在CL中的字符串大小,并且我有AL中保存的十六进制字符的整数值。

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

我已经在这个程序的这一部分工作了几个小时了,我似乎很难过(其他的只是硬编码4096为第一个,256为第二个...等,我讨厌有诉诸于)。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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个二进制位置,并且可以用逐位OR替换b的加法。