ARMアーキテクチャの分岐命令を印刷出力にエンコードしようとしています(32ビット数値をアセンブリに変換します)。分岐命令用。アセンブリ コードの値を取得するには、signed_immed_24 値を 32 ビットに拡張し、左にシフトする必要があります。
現在、整数は符号なしです。9991764 を -6785452 に変換する符号付き整数に変換するための役立つヒントがあるかどうか疑問に思っていました。そして、論理的に左に 2 シフトすると、最終的な答えは -27141808 になります。
32 ビットのデータは、定義されたデータ構造内に含まれています。
/* Branch Instruction format data set */
typedef struct {
uint32_t in;
int cnd; char *cndbits; char *cndname;
int IOO; char *IOObits; char *IOOname;
int L; char *Lbits; char *Lname;
int im; char *imbits; char *imname;
} arm_b;
im は変換する整数値です。
これは、(作業時に) アセンブリ コードを出力する関数です。
/* prints the assembly language of the branch instruction */
void print_b_ass(arm_b *b_instr) {
printf("\t B 0x3e61d950 <PC + -27141808 (-6785452 << 2)>\n\n");
}