質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

解決済

1回答

278閲覧

GCC intel方式 実現できない

dady

総合スコア19

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

1クリップ

投稿2024/05/24 10:18

実現したいこと

CentOSにて、「Hello World」のアセンブリをIntel方式で作成し、gccでコンパイルし、実行しましたが、何も出力しません。
AT&T方式では作成し、正常に実行できたのですが、コンパイルもエラーメッセージがまったく出ず何が間違っているのか分かりません。ご教授いただけると幸いです。エラーメッセージがあれば、まだ道筋がわかるんですが・・・

発生している問題・分からないこと

OSバージョン
(VPSサーバにCentOSをインストールしてます)

bash

1$ cat /etc/os-release 2NAME="CentOS Linux" 3VERSION="7 (Core)" 4ID="centos" 5ID_LIKE="rhel fedora" 6VERSION_ID="7" 7PRETTY_NAME="CentOS Linux 7 (Core)" 8ANSI_COLOR="0;31" 9CPE_NAME="cpe:/o:centos:centos:7" 10HOME_URL="https://www.centos.org/" 11BUG_REPORT_URL="https://bugs.centos.org/" 12 13CENTOS_MANTISBT_PROJECT="CentOS-7" 14CENTOS_MANTISBT_PROJECT_VERSION="7" 15REDHAT_SUPPORT_PRODUCT="centos" 16REDHAT_SUPPORT_PRODUCT_VERSION="7"

Intel方式で書いたアセンブリ

hello.s

1.intel_syntax noprefix 2 3.text 4.globl main 5 6 main: 7 mov rax, 1 8 mov rdi, 1 9 mov rsi, msg 10 mov rdx, 12 11 syscall 12 13 mov rax, 60 14 mov rdi, 1 15 syscall 16 17.data 18 msg: 19 .string "Hello World\n"

コンパイル時にエラーメッセージは出ず、実行しても何も表示されません。

bash

1$ gcc -Wall -o hello hello.s 2$ ./hello 3$

システムコール番号に間違いないか確認してますが、間違ってない様です。

bash

1$ ausyscall --dump | grep write 21 write 318 pwrite 420 writev 5296 pwritev 6311 process_vm_writev 7328 pwritev2 8$ ausyscall --dump | grep exit 960 exit 10231 exit_group

AT&T方式で以下アセンブリを作成し、実行しましたが正常に実行できている様です。

hello.s

1.text 2.globl main 3 4main: 5 mov $1, %rax 6 mov $1, %rdi 7 mov $msg, %rsi 8 mov $12, %rdx 9 syscall 10 11 mov $60, %rax 12 mov $1, %rdi 13 syscall 14 15 .data 16 msg: 17 .string "Hello World\n"

bash

1$ gcc -Wall -o hello hello.s 2$ ./hello 3$ Hello World

該当のソースコード

特になし
特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Intel方式の記述でもgccでコンパイルできると聞いたので、いろいろ検索しました。
NASMではCentOSでもMacでも、実行でき、gccでもMacではなんとか実行できました。
エラーメッセージも出ず、AT&Tでもできたのになぜできないのかわかりません。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/05/24 10:33

mov rsi, msg ここは mov ではなく、lea(Load Effective Address) ではないでしょうか。 lea rsi, msg
guest

回答1

0

ベストアンサー

melianさんからコメントある通り、lea rsi, msg で良いと思います。対応する AT&T方式での書き方は lea msg, %rsi ですね。
あるいは mov で行くのなら mov rsi, offset msg でしょう。アドレスを示す AT&T の方での $ に対応するのが offset ということになるかと思います。

投稿2024/05/24 17:03

angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dady

2024/05/25 00:40

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。 まだまだ初心者で基本的なところが理解出来ていなかった様です。 lea rsi, msg mov rsi, offset msg どちらでも正常に出力しました。 そもそも.asmのソースを参考にしてました。 コンパイルも実行も問題なくできるが、参照する文字列のアドレス解決が出来ていなかったという 認識で間違いなかったですか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問