C言語で定義した変数にアセンブリで値を代入したいが、リンク時にエラーがでる #15
-
概要アセンブリの練習を兼ねて 以下がそのコード(
本書とは直接関係のない質問で恐縮ですが、アドバイス頂けると助かります。 開発環境OS: macOS-13.2.1-x86_64-i386-64bit
PYTHON3: Python 3.10.10
CC: Homebrew clang version 17.0.6 Target: x86_64-apple-darwin22.3.0 Thread model: posix InstalledDir: /usr/local//opt/llvm/bin
LD: Homebrew LLD 17.0.6 (compatible with GNU linkers)
QEMU: QEMU emulator version 8.2.1 Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
OBJCOPY: llvm-objcopy, compatible with GNU objcopy Homebrew LLVM version 17.0.6 Optimized build.
MAKE: GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i386-apple-darwin11.3.0
|
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
納得のいかないアセンブリをコンパイラが生成するときは、Compiler Explorer を使うと便利です。 アセンブリを見てみると、
このようなメモリアクセスをする場合は、制約として
|
Beta Was this translation helpful? Give feedback.
納得のいかないアセンブリをコンパイラが生成するときは、Compiler Explorer を使うと便利です。
RISC-V rv32gc clang
系が32ビットRISC-V CPU用のclangです。アセンブリを見てみると、
la s2, %0
が次の2命令に展開されていることがわかります。%pcrel_hi
のドキュメント (リンク) を見ると、シンボルを受け取ることがわかります。つまり、ここで%0
の内容 (a0
) がシンボルとして扱われています。=r
(任意の汎用レジスタ) が制約として指定されているので、コンパイラがa0
レジスタを%0
として割り当てられ、そのレジスタ名が文字列として愚直に展開されています。このようなメモリアクセスをする場合は、制約として
m
を使うとアドレス周りの扱いをコンパイラに任せることができます。int result
をグローバル変数に移動すると、アドレスの取り方をコンパイラがきちんと合わせるのを観察すると面白いと思います。