Ubuntu 18.04でアセンブリをコンパイルして実行するにはどうすればよいですか?


16

だから最近、組立を学びたいと思ったので、少し学びました。これをnanoに入れて、playground.asmとして保存しました。どうすればコンパイルして実行できますか?私はすでにどこでも検索しましたが、それでも見つかりません。私は本当に好奇心が強く、それを使用することができない場合でも、言語を学ぶ意味はありません。


4
あらゆる種類の問題について、ギガバイトサイズのフレームワークの時代にこのような質問を読むのは
うれしいです

4
構文が異なる2つの主要なアセンブリ「フレーバー」があることに注意してください:AT&T(gas)とIntel(nasm)。アセンブラを選択する前に、どの構文を学習して使用するかを決定する必要があります。こちらで詳細な比較表をご覧ください。それでもわからない場合は、Intel / nasmを使用してください。
アンダーキャットがモニカを称賛する

2
デフォルトで標準のUbuntuマシンにインストールする必要があるgccを使用できます。ファイル名の拡張子は.sで、コンパイルするコマンドはgcc myprog.s
FedonKadifeli

誰かが、Ubuntuでアセンブリ言語プログラムをコンパイルする方法についてのこの質問をトピック外として閉じたいと思っています。😢オフトピックとしてクローズする必要があるのはなぜですか?アセンブリコードの記述方法ではなく、デフォルトのUbuntuリポジトリからのパッケージとUbuntuでのアセンブリコードのコンパイルに関するものです。
karel

回答:


17

現在サポートされているUbuntuのすべてのバージョンで、ターミナルを開いて次のように入力します。

sudo apt install as31 nasm  

as31:Intel 8031/8051アセンブラ
これは、高速、シンプル、使いやすいIntel 8031/8051アセンブラです。

nasm:汎用x86アセンブラー
Netwideアセンブラー。NASMは現在、フラット形式のバイナリファイル、a.out、COFFおよびELF Unixオブジェクトファイル、Microsoft 16ビットDOSおよびWin32オブジェクトファイルを出力します。

これは、Hello worldを出力するアセンブリ言語プログラムのコードです。

section     .text
global      _start 
_start: 
    mov     edx,len   
    mov     ecx,msg   
    mov     ebx,1   
    mov     eax,4   
    int     0x80   
    mov     eax,1  
    int     0x80   
section     .data
msg     db  'Hello world',0xa  
len     equ $ - msg   

Ubuntu 18.04でNASMを使用している場合、hello.asmという名前の.asmファイルをコンパイルして実行するコマンドは次のとおりです。

nasm -f elf64 hello.asm # assemble the program  
ld -s -o hello hello.o # link the object file nasm produced into an executable file  
./hello # hello is an executable file

1
なぜas31パッケージが必要なのですか?質問とパッケージの説明から、目的を果たすようには思えません。
kasperd

4
@kasperd実際にas31は必要ありません。私がアセンブラーでHello Worldをググってみたところ、インストールしただけnasmで機能しました。:-)カレルは代わりにそれを述べたと思います。
PerlDuck

1
as31を使用してアセンブリも学習する場合は、as31を使用できます。
karel

2
@kasperd:OPは、彼が書いているISAも、使用しているアセンブリ構文も指定しなかったため、できるだけ多くのオプションを含めることは理にかなっています。
イェルクWミッターク

1
この回答は、インストールコマンドをnasmと、8051アセンブラ+エミュレータ用に分割することでメリットがあります(少なくとも1つあるようです)。目的はアセンブリーを学ぶことなので、x86よりも単純な(r)アーキテクチャーで実際にエミュレーターを実行することは、理にかなっています。
ハイド

2

Ubuntuには(ポータブルGNUアセンブラ)が付属しています

as file.s -o file.out
ld file.out -e main -o file
./file

-o:出力の送信先を通知します
-e:ldに開始記号を通知します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.