所以让我通过说我对NASM很新的来证明这一点。
我正在将十六进制字符串转换为十进制数字。我的大部分程序都在运行,而且我遇到了一段我的C代码,我无法弄清楚如何编写汇编代码。我在CL中的字符串大小,并且我有AL中保存的十六进制字符的整数值。
我想要做的是16 ^ CL *(整数值)然后将该值添加到EAX(因为我们只需要执行大小为4的字符串,我总是可以使我的值适合EAX)。
我已经在这个程序的这一部分工作了几个小时了,我似乎很难过(其他的只是硬编码4096为第一个,256为第二个...等,我讨厌有诉诸于)。
任何帮助将不胜感激。
答案 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
的加法。