こんにちは世界!インザアーム


おいそこ!
このASMのシリーズの第2章は、ここにあります.今回、私はあなたに最後のものに類似したポストを持ってきています.
あなたは、不思議かもしれません、腕?ISA ?何が起こっているのですか.
一歩一歩行きましょう.

❓ どのようなアームですか?


ARMは、Acorn RISCマシン(ARM)という名前のケンブリッジ会社によって認可されたプロセッサの一種です.ARMプロセッサとインテルプロセッサとの主な違いは2つである.
最初の1つは、ARMはそれ自身のプロセッサを製造していない、彼らはほとんど設計し、その技術にライセンスを作成し、知的財産としてそれを販売しています
他の主な違いは、彼らのデザイン哲学です.インテルは、CISCプロセッサを製造します.私はもう一つのポストでCISC対RISCの上でさらに少しを調査するつもりです、しかし、ここでは違いについて簡単な説明です:
  • RISC:縮小命令セット計算機
  • 複雑命令セット計算
  • RISCは基本的に、できるだけ少ない命令で構成されていて、開発者がそのISAプログラムをどのようにプログラムするのかを容易にします.一方、CISCにはプロセッサのハードウェアスタイルが組み込まれています.CISCがRISCを超えているという基本的な利点は、それが命令実行の上でより少ないメモリを消費するということです.しかし、RISCははるかに理解しやすいです.

    ❓ ISAとは


    ISAは、プロセッサをプロセッサと通信させるために、プロセッサがユーザに提供する命令セットアーキテクチャである.
    すべては今、コンセプトでクリックする必要がありますので、移動しましょう.(今のところはっきりしていないなら、大丈夫ですね.)

    🎉 自分でお試しください!


    この例を試してみたい場合は、ARMエミュレータ、ラズベリーパイ、Androidの電話、またはあなたが所有しているARMプロセッサを持つマシンを必要とするでしょう.エミュレータを試したいなら、this one 行く

    🌎 こんにちは世界!


    あなたがこのシリーズ(私が今までにそうしなければならない)の上で私の前のポストを読んでいないならば、asmファイルは変数が定義されている、そして/または、初期化されている様々なセクションで構成されます、そして、...コードが宣言されるテキストセクション.
    msg: .ascii      "Hello World!\n"
    len = . - msg           /* This means: take your Stack Pointer actual position and subtract the size of the msg variable */
    
    前回と同様に、メッセージの長さを格納する変数(MDU)とlen変数を定義する変数MSGを定義します(これは、3番目のパラメータとしてwrite syscallがメッセージ長を必要とするため、ASMプログラミングに非常に必要です)
    .text
    
    .globl _start           /* We are declaring _start as a global function for the machine */
    
    次のステップは、定義することです.我々のコードが書かれるテキストセクション.また、私たちは、Count start機能が世界的な機能であるというプログラムを話しています.これはコンピュータを教えている:ねえ!この機能はどこからでも使用できます.
    _start:
      /* Printing the message */
        mov     %r0, $1     /* We set the number 1 on r0, which will represent STDOUT */
        ldr     %r1, =msg   /* ldr loads a 32 bit constant on the dst register. In this case r1 */
        ldr     %r2, =len   /* In r2 we are loading the length of the message */
        mov     %r7, $4     /* ARM processors use r7 for the syscalls. Syscall 4 is 'write' */
        swi     $0          /* Software interrupt. AKA syscall */
    
    このセクションは本当に脅迫的なようですが、Linuxでの書き込みsyscallに必要なパラメータを渡すだけです.syscallがそれのサインの上で必要とするものを覚えましょうWikipedia ):
  • ファイルのコード(ファイルディスクリプタまたはfd ).
  • データが格納されているバッファへのポインタ.
  • バッファから書き込むバイト数( nbytes ).
  • 本当に簡単です.R 0では、stdoutをファイルコードとして使用します.r 1は文字列の長さを読み込みます.ARMは使用するsyscallを得るためにR 7を使用します.この場合、syscall 4 ( write )です.最後に、SWI ( Software Interrupt )を使ってwriteを呼び出します.
        /* Now we need to exit the program */
        mov     %r0, $0     /* We are going to return a 0 because the program was ran correctly */
        mov     %r7, $1     /* Again a syscall. This time Syscall 1 is 'exit' */
        swi     $0          /* invoke syscall */
    
    最後のステップは別のsyscallでプログラムを終了することです.今回はsyscall 1(exit)です.返り値はリターンコードとして1つだけです.
    私たちは今このプログラムを実行する必要があります.では、コンパイルしましょう.私はファイルをhelloworldとして保存しました.S
    arm-linux-gnueabihf-as -o helloWorld.o helloWorld.S
    arm-linux-gnueabihf-ld -s -o helloWorld helloWorld.o
    
    ./helloWorld
    
    それで、我々は我々をつくりました.最初のコマンドでオブジェクトを作成し、2行目にリンクします.あなたは素敵なハローワールドを取得する必要があります!すべてがOKであるならば、メッセージ.

    いつものように、私はrepository だから、それをチェックアウトすることができます