アセンブラ初心者スレッド 2©2ch.net

0001デフォルトの名無しさん 転載ダメ©2ch.net2017/04/13(木) 17:35:55.70 ID:1WMn3pSz
初心者OK!質問大歓迎!のアセンブラのスレッドです。
基本情報の勉強中の人、PICやH8を勉強中の学生などなど…

前スレ
アセンブラ初心者スレッド
http://echo.2ch.net/test/read.cgi/tech/1314502612/

関連スレ
アセンブラ 13
http://echo.2ch.net/test/read.cgi/tech/1314512680/

0002デフォルトの名無しさん2017/04/13(木) 17:41:03.83 ID:m/ZfxtWH
>>1

0003デフォルトの名無しさん2017/04/13(木) 18:14:24.24 ID:VLmLig3K
v3

0004あぼーん2017/04/13(木) 18:15:04.12 ID:Gon4S40X
あぼーん

0005デフォルトの名無しさん2017/04/13(木) 18:15:32.34 ID:VLmLig3K
終了

0006 ◆QZaw55cn4c 2017/04/13(木) 19:36:20.78 ID:RYqONwMZ
きょうびの時代にアセンブラの優位性を主張する,とすれば
どのような分野で有効でしょうか?

0007デフォルトの名無しさん2017/04/13(木) 19:43:03.43 ID:VLmLig3K
asm.js とかさ
LLVM とかさ
このスレで扱っても良いと思うのね

0008デフォルトの名無しさん2017/04/13(木) 20:44:33.86 ID:nESB199J
ごもっともですわ

0009デフォルトの名無しさん2017/04/13(木) 21:26:38.34 ID:J4z4l4hW
うん需要ある?

0010デフォルトの名無しさん2017/04/14(金) 08:40:42.32 ID:sKcRbeeD
組み込みでなら多少は。

0011デフォルトの名無しさん2017/04/14(金) 10:04:28.48 ID:L6e5ZQwW
あ。。。IoTとか?

0012デフォルトの名無しさん2017/04/15(土) 04:12:03.81 ID:2Mj3RTtW
アセンブラはじめるならLinuxでやるといいよ
DOSと同じような感覚でアセンブラプログラミングができるから

こんな感じ

Linux でアセンブリプログラミング
http://www.mztn.org/lxasm/asm00.html
Linux で64bitアセンブリプログラミング
http://www.mztn.org/lxasm64/amd00.html

Linuxでのアセンブル方法はこんな感じ
as -a=hogehoge.lst -o hogehoge.o hogehoge.s
ld -o hogehoge hogehoge.s

gccのでアセンブラ出力&アセンブル
gcc -S -o hogehoge.s hogehoge.c
as -a=hogehoge.lst -o hogehoge.o hogehoge.s
gcc -o hogehoge hogehoge.o

0013デフォルトの名無しさん2017/04/15(土) 04:12:41.23 ID:2Mj3RTtW
ちなみにx86_64上のLinuxで32bitのバイナリを作成したい場合はこう


x86_64のLinuxでのCの32bitのx86バイナリのコンパイル
gcc -m32 -O2 -o hogehoge hogehoge.c

x86_64のLinuxでの32bitのx86アセンブル
as --32 -a=hogehoge.lst -o hogehoge.o hogehoge.s
ld -melf_i386 -o hogehoge hogehoge.o

x86_64のLinuxでのgccので32bitアセンブラ出力&アセンブル
gcc -m32 -S -o hogehoge.s hogehoge.c
as --32 -a=hogehoge.lst -o hogehoge.o hogehoge.s
gcc -m32 -o hogehoge hogehoge.o

0014デフォルトの名無しさん2017/04/15(土) 04:13:21.76 ID:2Mj3RTtW
nasmでのx86_64のLinuxでの32bitアセンブル

nasm -f elf hogehoge.s
ld -melf_i386 -o hogehoge hogehoge.o


nasmでのx86_64のLinuxでの64bitアセンブル
nasm -f elf64 $1.s
ld -o $1 $1.o


Ubuntuでのnasmのインストール方法

sudo apt-get install nasm

0015デフォルトの名無しさん2017/04/15(土) 04:42:00.93 ID:2Mj3RTtW
UbuntuだとQEMUを入れるだけでQEMU+binfmtの設定が自動せされるから
ライブラリへのリンクを貼るだけで他のCPUのバイナリをそのまま実行できるようになる
UbuntuだとARM、MIPS、PowerPCができる

64bitARMならこんな感じ
sudo apt-get install qemu
sudo apt-get install g++-aarch64-linux-gnu
sudo ln -s /usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 /lib
sudo ln -s /usr/aarch64-linux-gnu/lib /lib/aarch64-linux-gnu

32bitARMならこんな感じ
sudo apt-get install qemu
sudo apt-get install g++-arm-linux-gnueabihf
sudo ln -s /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 /lib
sudo ln -s /usr/arm-linux-gnueabihf/lib /lib/arm-linux-gnueabihf

Cのコンパイル方法はこんな感じ
aarch64-linux-gnu-gcc -O2 -o hogehoge hogehoge.c

arm-linux-gnueabihf-gcc -O2 -o hogehoge hogehoge.c

数学ライブラリを使う場合のCのコンパイル方法はこんな感じ
aarch64-linux-gnu-gcc -O2 -o hogehoge hogehoge.c -lm
(Ubuntuでは依存するライブラリを後ろに書く)

arm-linux-gnueabihf-gcc -O2 -o hogehoge hogehoge.c -lm

0016デフォルトの名無しさん2017/04/15(土) 04:43:20.47 ID:2Mj3RTtW
アセンブル方法はこんな感じ
aarch64-linux-gnu-as -a=hogehoge.lst -o hogehoge.o hogehoge.s
aarch64-linux-gnu-ld -o hogehoge hogehoge.s

arm-linux-gnueabihf-as -a=hogehoge.lst -o hogehoge.o hogehoge.s
arm-linux-gnueabihf-ld -o hogehoge hogehoge.s

アセンブラソースの出力はこんな感じ
aarch64-linux-gnu-gcc -S -o hogehoge.s hogehoge.c
aarch64-linux-gnu-as -a=hogehoge.lst -o hogehoge.o hogehoge.s
aarch64-linux-gnu-gcc -o hogehoge hogehoge.o

arm-linux-gnueabihf-gcc -S -o hogehoge.s hogehoge.c
arm-linux-gnueabihf-as -a=hogehoge.lst -o hogehoge.o hogehoge.s
arm-linux-gnueabihf-gcc -o hogehoge hogehoge.o


できたバイナリは普通に実行できる
./hogehoge
バイナリがどのアーキテクチャかはfileコマンドで確認できる
file hogehoge

0017デフォルトの名無しさん2017/04/15(土) 04:44:00.98 ID:2Mj3RTtW
32bitのARMでUbuntuのgnueabihfではデフォルトでThumb-2でコンパイルされる
ARM命令でコンパイルする場合はオプションを追加する

ARM命令の場合の例
-marm -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16
-marm -march=armv7-a -mfloat-abi=hard -mfpu=neon -ffast-math

実行例)
arm-linux-gnueabihf-gcc -O2 -marm -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -o hogehoge hogehoge.c

arm-linux-gnueabihf-gcc -O2 -S -marm -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -o hogehoge.s hogehoge.c
arm-linux-gnueabihf-as -a=hogehoge.lst -o hogehoge.o hogehoge.s
arm-linux-gnueabihf-gcc -marm -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -o hogehoge hogehoge.o

参考)
Thumb-2命令の場合の例
-mthumb -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16
-mthumb -march=armv7-a -mfloat-abi=hard -mfpu=neon -ffast-math

0018デフォルトの名無しさん2017/04/15(土) 04:47:16.32 ID:2Mj3RTtW
32bitARMアセンブラの参考URL
http://www.mztn.org/slasm/arm00.html

64bitbitARMアセンブラの参考URL
http://www.mztn.org/dragon/arm6400idx.html

0019デフォルトの名無しさん2017/04/15(土) 07:38:04.38 ID:2Mj3RTtW
>>18の32bitARMのアセンブラのサイトの

http://www.mztn.org/slasm/arm04.html
1: ldrb r3, [r0, #+1]! @ r3=mem[r0++]
strb r3, [r1, #+1]! @ mem[r1++]=r3
でエラーが出ます

ここは
1: ldrb r3, [r0], #+1 @ r3=mem[r0++]
strb r3, [r1], #+1 @ mem[r1++]=r3
ですね

0020デフォルトの名無しさん2017/04/15(土) 08:02:58.82 ID:2Mj3RTtW
補足
32bitARMでのシステムコールの呼び出しはEABIの方式で行ってください

.text
.align 2
.global _start
_start:
adr r1, msg @ address
mov r0, #1 @ stdout
mov r2, #13 @ length
mov r7, #4 @ sys_write
swi 0

mov r0, #0
mov r7, #1 @ sys_exit
swi 0

.align 2
msg:
.asciz "hello, world\n"

0021デフォルトの名無しさん2017/04/15(土) 08:35:58.99 ID:2Mj3RTtW
32bitARMでFPU命令を使う場合の例
arm-linux-gnueabihf-as -mfpu=vfpv2 -a=hogehoge.lst -o hogehoge.o hogehoge.s
arm-linux-gnueabihf-as -mfpu=vfpv3-d16 -a=hogehoge.lst -o hogehoge.o hogehoge.s

新着レスの表示
レスを投稿する