0

したがって、ユーザーの8桁の入力を読み取り、それを変数に保存します。例えば:

8桁の16進数を入力してください:1ABC5678

したがって、1ABC5678の16進数をループし、0〜9の数値から48を減算し、AFから55を減算して、入力の数値表現を取得します。しかし、それは間違っているようです。私の目標は、その8桁の16進数を8進数に変換することです。私はすでに2進数から8進数に移行する方法を知っています。それは、32ビットの2進数をマスキングしてシフトすることです。しかし、私の問題は、バイナリを取得するための私のアプローチが間違っていることです。

IntelIA-32でのImコーディング。x86。

UPDAT

今、私は変数名binaryに32ビットのbinaryを取得しました。8進数に変換したい。正しい8進数を取得するために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
4

2 に答える 2

0

問題のいくつかは次のとおりです。

  • 入力文字列は改行で終了し、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文字あることを確認しているので、ループで再度実行する必要はありません。

于 2012-10-16T05:13:06.417 に答える
-1

16進文字列をint値に変換する最も簡単な方法は、strtol()、strtoll()、またはstrtoimax()のいずれかを使用することです。

#include <inttypes.h>
#include <stdlib.h>

intmax_t     max;
long         l;
long long    ll;
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;
};
于 2012-10-15T17:37:45.890 に答える