質問: ### 前提・実現したいこと ここに質問したいことを詳細に書いてください アセンブリ言語を用いて「Hello World!」と表示させるプログラムを作成しようとしていました 機能を実装中に以下のエラーメッセージが発生しました。 ### 発生している問題・エラーメッセージ ``` ex2.s: Assembler messages: ex2.s:7: Error: invalid instruction suffix for 'push' ex2.s:9: Error: invalid instruction suffix for 'push' ``` ### 該当のソースコード ``` .data hello: .string "Hello World!\n" .text .globl main main: pushl %ebp movl %esp, %ebp pushl $hello call printf leave ret ``` ### 試したこと pushlをpushに変更してみた 【結果】 ex2.s:7: Error: operand type mismatch for 'push' ### 補足情報(言語/FW/ツール等のバージョンなど) 言語:GAS 環境:ubuntu 端末
回答: アセンブリ命令のサフィックスがロング(32bit)で書かれていて `invalid instruction suffix for 'push'` このエラーが出るなら、コンパイラが64bitでコードが32bit指定している場合がほとんどです。 * 対応その1 > > サフィックス・レジスタを64bit拡張向けに修正する。 > > 例: > > > > ``` > pushq %rbp > movq %rsp, %rbp > ``` > > * 対応その2 > > コンパイラのオプションに32bitを明示する。 > > // コンパイラによって違う(`-arch i386`とか`-m32`とか) > > > * 補足 アセンブリは実行環境等に大きく依存するため最初は `CASL`や`CASL2`から入るのがおすすめです。