[解決済み] X86アセンブリ - IDIV命令の取り扱い
2022-01-28 13:53:47
質問事項
私は現在、入力として.cファイルを取り、アセンブリコード(X86、AT&T構文)を生成する簡単なCコンパイラを作成しています。 すべてが順調なのですが、IDIVQ命令を実行しようとすると、浮動小数点例外が発生します。以下は私の入力です。
int mymain(int x){
int d;
int e;
d = 3;
e = 6 / d;
return e;
}
そして、これが私の生成したコードです。
mymain:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movq %rdi, -40(%rbp)
movq $3, -8(%rbp)
movq $6, %rax
movq -8(%rbp), %rdx
movq %rdx, %rbx
idivq %rbx
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size mymain, .-mymain
によると http://www.cs.virginia.edu/~evans/cs216/guides/x86.html , イディブク %rbx で6/d(商)を生成する必要があります。 ラックス . しかし、浮動小数点数の例外が発生し、問題が見つからないようです。
どんなことでもご相談ください。
解決方法は?
Mysticialsの回答の最初の部分は正しいです。
idiv
は128/64ビットの除算を行うので、その値は
rdx
配当の上位64ビットを保持する「(1)」は、ランダムな値を含んではならない。しかし、拡張子が0というのは、間違っています。
あなたが持っているように
サイン
変数を使用する場合は
記号
拡張
rax
に
rdx:rax
. これには具体的な指示があります。
cqto
(
4進数から8進数への変換
)をAT&Tで、そして
cqo
インテル構文では 新しいバージョンのgasは両方の名前を受け付けるようです。
movq %rdx, %rbx
cqto # sign extend rax to rdx:rax
idivq %rbx
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。