1

私はこの日かそこらでGoを使ってアセンブラーを構築しているので、言語に慣れることができます。これはGoを使用した最初の実際のプログラムなので、問題が発生することが予想されましたが、一貫したバグが何度も発生しています。他の場合にそれを修正するための他のハッキーな方法を見つけたばかりですが、今回は答えが必要だと思うので、実際にこれを正しく行っているように感じます。

基本的に、私は大量のバイト値を解析する必要があります。これらの一部は符号付きバイトであるため、-1=0xFFなどです。ラベルのアドレスを計算するとき、現在のアドレスからのオフセットを見つける必要があります。次のコードは、オフセットを取得するために使用する基本バージョンを簡略化したものです。

//  lbladdr holds the target label address
//  address holds current address in memory
//  label[x] holds the offset
if address > lbladdr {
    lbladdr -= address
}
label[x] = strconv.FormatInt(int64(lbladdr), 16)

これは正の値に対しては機能しますが、負のアドレス(address> lbladdr)を取得すると、FEのような値を取得する代わりに-2を取得します。標準ライブラリが16進数に負の符号を追加する理由がわかりません。また、それに関するドキュメントで何も見つかりませんでした。私は他の多くの場所を調べましたが、同じ問題を抱えている人を見つけることもできないようです。

簡単な修正であることが私の側の何かであることを願っています。

4

2 に答える 2

2

16進数に負の符号を使用することは完全に合理的です。アセンブリを操作するときは、16進数で表すレジスタの実際のビットパターンを使用して符号を表すのが一般的であることを私は知っています。しかし、Goはあなたがそれをしていることを知りません。また、CPUレジスタにあるような16進値をサポートするように書かれたgoのフォーマット関数もありません。さらに、ビットパターンはレジスタサイズによって異なります(16対32対64およびビッグエンディアンとリトルエンディアン)。あなたはそれらを保存するでしょう。それで、ベースはあなたが望むようにそれらを印刷するのに十分ではありません。表現したいレジスタのタイプのフォーマットをサポートする独自のフォーマットライブラリを作成する必要があります。

于 2013-03-18T04:03:16.470 に答える
2

これは仕様によるものです:http://golang.org/src/pkg/strconv/itoa.go?s = 628 :668#L8

あなたが望むかもしれないのはuint64にキャストすることです:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i := -1
    fmt.Printf("%x\n", uint64(i))
    fmt.Println(strconv.FormatUint(uint64(i), 16))
}
于 2013-03-18T04:52:01.860 に答える