【问题标题】:NASM, macro or subprogram for exponents?NASM,指数的宏或子程序?
【发布时间】:2012-05-03 05:36:20
【问题描述】:

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: c assembly nasm


    【解决方案1】:

    您不需要任何指数函数来将十六进制/二进制字符串转换为数字。只需重复乘以 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 的加法可以用按位或替换。

    【讨论】:

    • 这比我写的简单多了。我编译了我的程序并在 C 中运行它,并花时间尝试将其转换为程序集。不确定这是否是正确的方法。
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多