94850


ラズベリーパイでアセンブリをアセンブルしようとすると色々エラーが出てしまうのですが、なぜでしょうか。

ラズパイの環境  
モデル：Raspberry Pi Model B Plus Rev 1.2  
OS: Linux

test.s

[code]

    .intel_syntax noprefix
    .globl main
    main: 
      mov rax, 42
      ret
    
[/code]

コマンド

[code]

    ras@raspberrypi:~/asm $ cc -o asm test.s
    test.s: Assembler messages:
    test.s:1: Error: unknown pseudo-op: `.intel_syntax'
    test.s:4: Error: ARM register expected -- `mov rax, 42'
    test.s:5: Error: bad instruction `ret'
    
[/code]


CC BY-SA 4.0
2023-05-14T09:20:53.263
94841
2023-05-20T09:35:46.653
2023-05-20T09:35:46.653
7291
56895
question
raspberry-pi assembly
ラズベリーパイでアセンブリをアセンブルしようとするとエラーが出る


エラーメッセージで検索すると以下の記事がヒットします。  
RasPi も ARM 環境かと思うので応用が効きそうです。

["低レイヤを知りたい人のためのCコンパイラ作成入門"をApple
Silicon環境でやってみる](https://zenn.dev/tok/scraps/51f8ec23ea48e1)

> unknown pseudo-op: `.intel_syntax' はarm64環境だからか。  
>  消しても問題なさげなので消しちゃう。
>
> operand 1 must be an integer registerはarm64環境だとraxって名前のレジスタが無いからか？  
>  <https://www.mztn.org/dragon/arm6403reg.html>
> を見たらxとかwとかってレジスタがあるらしいので適当にx0とかに書き換える。
>
> 出来上がったのがこれ。
>
> test2.asm
[code]

>     .globl main
>     main:
>       mov x0, 42
>       ret
>  
[/code]


CC BY-SA 4.0
2023-05-14T11:05:39.540
94843
2023-05-14T11:05:39.540
3060
94841
answer


アセンブリ言語 【assembly language】とは  
(e-words.jp)
[アセンブリ言語](https://e-words.jp/w/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E8%A8%80%E8%AA%9E.html)
より

>
> アセンブリ言語とは、プログラミング言語の類型の一つで、コンピュータのCPU（MPU/マイクロプロセッサ）が直接解釈・実行できる機械語（マシン語）と正確に対応する命令語で構成された言語。  
>
> 人間が実用的に使用できるプログラミング言語で最も機械に近い低水準（低級）な言語で、具体的な仕様は[プロセッサ](https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5.html)の機種（[命令セットアーキテクチャ](https://e-words.jp/w/%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88.html)の種類）ごとに異なる。

質問対象の Raspberry Pi がどのラズパイか不明ですが  
Raspberry Pi 4 での動作では  
(この OSでは 64bitモードで動作している)

[code]

    $ arch
    aarch64
    $ lscpu
    アーキテクチャ:                        aarch64
      CPU 操作モード:                      32-bit, 64-bit
      バイト順序:                          Little Endian
    CPU:                                   4
      オンラインになっている CPU のリスト: 0-3
    ベンダー ID:                           ARM
      モデル名:                            Cortex-A72
        モデル:                            3
    
    (〜略〜)
    
[/code]

以下の C言語ソースで試すと

[code]

    int
    main(void)
    {
        return 42;
    }
    
[/code]

おおよそこんな感じのソースになるはず  
もちろん ISA が異なると(32bit ↔ 64bit でも) 扱えるレジスターや命令が異なるかも

[code]

    $ cc -S first.s first.c
    $ cat first.s
            .arch armv8-a
            .file   "first.c"
            .text
            .align  2
            .global main
            .type   main, %function
    main:
    .LFB0:
            .cfi_startproc
            mov     w0, 42
            ret
            .cfi_endproc
    .LFE0:
            .size   main, .-main
            .ident  "GCC: (Ubuntu 12.2.0-17ubuntu1) 12.2.0"
            .section        .note.GNU-stack,"",@progbits
    
    $ as -o first.o first.s
    $ cc -o first first.o
    $ ./first; echo $?
    42
    
[/code]

* * *

質問のエラーについては

  * `.intel_syntax noprefix`
  * `rax`

などから x86系 CPUのアセンブリ言語と思われ,  
ARM系のアセンブラーでは無理(エラーになる)でしょう


CC BY-SA 4.0
2023-05-15T05:40:45.190
94850
2023-05-15T05:40:45.190
43025
94841
answer