質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

2回答

507閲覧

引数を使ったプログラム(nasm)

binary

総合スコア33

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2017/09/27 11:19

自分はubuntuで動くアセンブリ言語のプログラムを作りましたが予想したように動かず質問させて頂きます。アセンブリはnasmです
【プログラムの説明】PSP(プログラムセグメントプリフィックス)に格納されている文字列の引数を読み込み再び出力するプログラムです。
【利用した考え方】
・まずPSPの80H番地に引数の文字数が格納されている
・82H番地から引数が文字列として格納されている
【実行方法】
端末にて
nasm -f elf64 filename.asm
ld -s -o filename filename.o
./filename abcd ←abcdが文字引数として格納されますよね?

これを実行するとコアダンプが起こります

【プログラム 及びその説明】
section .bss
buffer: resb 1024h
nub: resb 1h

section .text
global _start

_start:
mov edx, 80h
mov ecx, [edx]
mov edx, 82
mov ebx, buffer
mov [nub], ecx

cope:        ;引数をbufferに格納している コピーは文字引数の数を参考している
mov eax, [edx]
mov [ebx], eax
xor eax, eax
inc edx
inc ebx
loop cope

print0:
mov edx, [nub]
mov eax, 4
mov ebx, 1
mov ecx, buffer
int 80h

end:
mov eax,1
int 80h

改善法やもし誤った認識があれば教えてください
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2017/09/27 16:25

LinuxにはPSPが存在しないハズですが...
fuzzball

2017/09/28 00:18

以前からDOSとLinuxの情報がごちゃ混ぜになっているようなので、今回もそれっぽいですね。
binary

2017/09/28 00:28

linuxでも意図したとおりに動かしたい場合はどうすればいいでしょうか?回答よろしくお願いします
fuzzball

2017/09/28 00:33

ググって見つからないような情報でもないと思うのですが、勘違いしていたのだから、もう一度探してみては?
guest

回答2

0

ベストアンサー

有益な回答を先にいただいていたのでちょっと遠慮したのですが、
サンプルプロを書いていたのでせっかくなので回答させてもらいます。
nasm用に書いたものです。プログラムへの引数はC言語での
main(int argc, *argv[]) でイメージされるようになっていて、
少なくとも本サンプルの実行時は espレジスターで指し示すスタック領域から
高位のアドレスに向けて、4バイトずつ、argc, argv[0], argv[1], argv[2]… と続いていきます。

argc は実行時のコマンドラインを含めた引数の数、
argv[0]はコマンドライン、argv[1]は引数1, argv[2]は引数2。。。と続きます。
4バイトづつなのは、簡単に言えば、32ビットのアドレスだからです。

サンプルではargv[2] までを取得して、標準出力にプリントします。
引数の数(argc)は終了コードとして返します。
コードとしては冗長で、一部危険な使い方のままですが、サンプル用として、あえてベタに書いています。

;hoge.asm ; $ ./hoge arg1 arg2 section .data ARGC dd 0 ARGV0 dd 0 ARGV1 dd 0 ARGV2 dd 0 section .text global _start: _start: mov eax, [esp] ; argc mov [ARGC], eax ; argv[0] mov eax, [esp + 4] mov [ARGV0], eax ; argv[1] mov eax, [esp + 8] mov [ARGV1], eax ; argv[2] mov eax, [esp + 12] mov [ARGV2], eax mov eax, 4 mov ebx, 1 mov ecx, [ARGV0] ; 6bytes for './hoge' mov edx, 6 int 80h mov eax, 4 mov ebx, 1 mov ecx, [ARGV1] ; 4bytes for 'arg1' mov edx, 4 int 80h mov eax, 4 mov ebx, 1 mov ecx, [ARGV2] ; 4bytes for 'arg2' mov edx, 4 int 80h .exit: mov eax, 1 mov ebx, [ARGC] int 80h ret コード

ただ、コマンドラインや引数が実行時にどのように自分に渡されるかは、
リンカーのオプションやリンクされたスタートアップルーチンに影響されるはずなので、
上記の情報は鵜呑みにはしないでください。今回のケースに限定してください。

これ以上はメモリの概念とレジスターによる間接アドレッシング等を理解していないと厳しいです。
int80hのx86 linuxシステムコールを理解する為には先のご回答でも言及されていたように、
C言語の知識もほぼ必須です。少なくとも知っていると理解がスムーズなのは確かです。
※Linux はC言語で書かれたPOSIX互換のOSだ、と言うことが大きいです。

実行にあたっては最初はコアダンプ必至だと思うので、必ずデバッガーが必要になります。

Ubuntu 17.04 x86版での実行結果です。
$ ./hoge arg1 arg2
で3つの引数が本体のプログラムに渡ります。終了後、$? で3が終了コードとして帰っているのが分かります。

イメージ説明

投稿2017/09/28 04:32

編集2017/09/28 04:47
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

binary

2017/10/01 23:11

サンプルプログラム付きの解説ありがとうございます。
guest

0

アセンブリ言語でプログラムを組む場合、該当環境のABI(Application Binary Interface)を参照する必要があります。

Linux(ELF)環境のIntel x86アセンブラであれば、https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI にある "Intel386 psABI" を参照ください。一通り目を通されることを強くお勧めします。


上記ドキュメントの 2.3 Process Initialization - 2.3.1 Initial Stack and Register State を参照ください。espレジスタを介してあなたの望む情報にアクセスできます。

・まずPSPの80H番地に引数の文字数が格納されている
・82H番地から引数が文字列として格納されている

これはLinuxのABIではありません。PSP(Program Segment Prefix)はDOS OS向けABIです。

投稿2017/09/28 01:18

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2017/09/28 03:24 編集

蛇足:アセンブリ言語以外のシステムプログラミング言語(C言語など)の経験はありますか?いきなりアセンブリ言語への入門は難易度が高すぎるかと思います。まずはC言語ソースコードから変換されるアセンブリの対比を見ていく、といった学習法の方がずっと効率的かもしれません。アセンブリ言語では言語そのものにエラー処理サポートなど存在しないため、間違ったプログラムでコアダンプが起きるのは当然です(即座にSEGVしないこともあります)。デバッガの使い方も合わせて学習すべきです。
binary

2017/10/01 23:10

学習方法などのプログラミング上達方法を教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問