Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在x86中将ASCII十六进制数转换为32位二进制整数_Assembly_X86_Hex_Base Conversion - Fatal编程技术网

Assembly 在x86中将ASCII十六进制数转换为32位二进制整数

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位二进制变量名二进制。我想把它转换成八进制。

因此,我读取用户的8位输入,并将其保存到一个变量中。例如:

输入8位十六进制数字:1ABC5678

然后,我循环使用1ABC5678十六进制数,从0-9中减去48,从A-F中减去55,得到输入的数字表示。但这似乎是错误的。 我的目标是将8位十六进制转换成八进制。我已经知道如何从二进制到八进制,这是通过掩蔽和移位32位二进制数字实现的。但我的问题是,我获取二进制文件的方法是错误的

在英特尔IA-32上进行即时通讯编码。 x86

更新 现在我得到了一个32位二进制变量名二进制。我想把它转换成八进制。有没有关于如何将3by3移位以获得正确的八进制数的想法? 这是我目前的代码:

; 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,11011111b
code
当您转换每个数字时,将先前的结果左移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: