Assembly 在x86中将ASCII十六进制数转换为32位二进制整数
因此,我读取用户的8位输入,并将其保存到一个变量中。例如: 输入8位十六进制数字:1ABC5678 然后,我循环使用1ABC5678十六进制数,从0-9中减去48,从A-F中减去55,得到输入的数字表示。但这似乎是错误的。 我的目标是将8位十六进制转换成八进制。我已经知道如何从二进制到八进制,这是通过掩蔽和移位32位二进制数字实现的。但我的问题是,我获取二进制文件的方法是错误的 在英特尔IA-32上进行即时通讯编码。 x86 更新 现在我得到了一个32位二进制变量名二进制。我想把它转换成八进制。有没有关于如何将3by3移位以获得正确的八进制数的想法? 这是我目前的代码:Assembly 在x86中将ASCII十六进制数转换为32位二进制整数,assembly,x86,hex,base-conversion,Assembly,X86,Hex,Base Conversion,因此,我读取用户的8位输入,并将其保存到一个变量中。例如: 输入8位十六进制数字:1ABC5678 然后,我循环使用1ABC5678十六进制数,从0-9中减去48,从A-F中减去55,得到输入的数字表示。但这似乎是错误的。 我的目标是将8位十六进制转换成八进制。我已经知道如何从二进制到八进制,这是通过掩蔽和移位32位二进制数字实现的。但我的问题是,我获取二进制文件的方法是错误的 在英特尔IA-32上进行即时通讯编码。 x86 更新 现在我得到了一个32位二进制变量名二进制。我想把它转换成八进制。
; Now we have the Binary digits saved into the binary variable
; Lets convert into octal
octal_init:
mov ecx, 11 ; initialize count
mov edi, octal ; point to start of new string
mov eax, [binary] ; get a character
MOV edx, 00000000000000000000000000000000b ;Clear EDX
octal_cont:
MOV dl, al
SHL dl, 5
SHR dl, 5
octal_top:
mov [edi], dl ; store char in new string
inc edi ; update dest pointer
SHR eax, 3
dec ecx ; update char count
jnz octal_cont ; loop to top if more chars
将十六进制字符串转换为int值的最简单方法是使用strtol()、strtoll()或strtoimax():
#包括
#包括
intmax_t max;
长l;
隆隆;
const char*str=“1ABC5678”;
max=strtoimax(str,NULL,16);
l=strtol(str,NULL,16);
ll=strtoll(str,NULL,16);
或者,如果愿意,您可以手工编写代码:
int pos;
long l;
const char * str = "1ABC5678";
l = 0;
for(pos = 0; str[pos]; pos++)
{
l = l << 4; // each Hex digit represents 4 bits
// convert ASCII characters to int value
if ((str[pos] >= '0') && (str[pos] <= '9'))
l += (str[pos] - '0') & 0x0F;
else if ((str[pos] >= 'A') && (str[pos] <= 'F'))
l += (str[pos] - 'A' + 10) & 0x0F;
else if ((str[pos] >= 'a') && (str[pos] <= 'f'))
l += (str[pos] - 'a' + 10) 0x0F;
};
int-pos;
长l;
const char*str=“1ABC5678”;
l=0;
for(pos=0;str[pos];pos++)
{
l=l='0')&&(str[pos]='A')&&(str[pos]='A')&&(str[pos]一些问题是:
- 输入字符串以换行符结尾,而不是以null结尾
- 一些逻辑错误
你可以这样写:
L1_init:
mov ecx, 8 ; initialize count
mov esi, buf ; point to start of buffer
mov edi, binary ; point to start of new string
L1_top:
mov al, [esi] ; get a character
inc esi ; update source pointer
cmp al, '0' ; Compare al with ascii '0'
...
or dl, al ; Merge in the four bits just computed
loop L1_top ; Loop back for next byte to convert
mov [edi], edx ; store char in new string
L1_end:
请注意,您已经检查了是否有8个字符,因此无需在循环中再次执行此操作。肯定有用于此类操作的库吗?是的,我知道的是,如果您从十六进制中提取每一个数字,将其转换为二进制,然后将二进制相互相邻,那么您就得到了该十六进制的32位二进制数。但是英特尔是一个小印度人,这是一个问题,也是我将其转换为二进制的方法。你的解决方案只适用于大写,你没有输入小写,是吗?而且你没有提到结果左移。是的,因此如果用户输入非大写的a-F后面的任何字符,我首先使用以下代码将其转换为大写:code
和al,11011111bcode
当您转换每个数字时,将先前的结果左移4位,然后将新的值转换为它。应该可以了。非常感谢您的帮助,我正在汇编它,您知道它在.asm中的大致外观吗?非常感谢Antoine。我实际得到了bi现在没有部分工作了。我需要把它转换成八进制,这要容易得多。我把二进制的3乘3位移位并保存字符。我更新了我的代码,所以我现在得到了32位二进制数字,我想通过移位把它转换成八进制。你能看一下我的代码吗?
L1_init:
mov ecx, 8 ; initialize count
mov esi, buf ; point to start of buffer
mov edi, binary ; point to start of new string
L1_top:
mov al, [esi] ; get a character
inc esi ; update source pointer
cmp al, '0' ; Compare al with ascii '0'
...
or dl, al ; Merge in the four bits just computed
loop L1_top ; Loop back for next byte to convert
mov [edi], edx ; store char in new string
L1_end: