🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アセンブリ言語

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

3100閲覧

syscall関数・命令について アセンブリ言語

kazuyakazuya

総合スコア193

アセンブリ言語

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

2グッド

1クリップ

投稿2019/10/25 23:21

編集2019/10/26 01:30

アセンブリ言語 にて

(下の話はLinux前提の話)
call _write にてwrite関数を呼び出すのと
(最終的に機械語でwriteシステムコール)

syscall命令を使って最終的に機械語でwriteシステムコール
を呼び出すのでは

一体何が違うのかという質問を昨日しました。

質問昨日の

その過程の中でwindowsにはsyscall関数はないけど
syscall命令はできると・・・

結構丁寧に解説をいただいたのですが

それでも理解できませんでした・・・。

ので、分からないところをおしえていただきたいです。

質問

まず・・・

string

1windows・・・ 2〇  syscall命令 3×   syscall関数

string

1Linux・・・ 2〇 syscall命令 3〇 syscall関数

で、そもそもの話
SYSCALL命令自体がLinux前提の命令なのですよね?

だから・・・windowsで使ったとしても使い物にならない。

SYSCALL関数はC言語から呼び出すための
関数。(Cの中から呼び出せば勝手にシステムコールされる・・・?)

参考リンク
上記の記事では、windows上でsyscall関数(?)を定義しています。
(つまりは、syscall関数を使えるようにするのですよね?)

それは・・・
Linuxとwindowsでは設定するレジスタとかが違うから・・・

ん?じゃあ、wiondowsの設定に合わせてレジスタを設定し
syscall命令を使えばいいじゃないか

と思ったのですが、できないのでしょうか?

分からないので教えてください。

windowsとLinux ABIに互換性がない

san3, Five-Inch👍を押しています

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

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

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

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

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

dodox86

2019/10/26 00:27 編集

> SYSCALL命令自体がLinux前提の命令なのですよね? > だから・・・windowsで使ったとしても使い物にならない。 「syscall命令はWindowsで使い物にならない」と言う表現は、私が先の質問中の以下のコメントで使ったものでした。 > システムコールとして使うにはWindowsではファンクション番号などの使い方が全く違うので、実質使い物になりません。 その為に少し誤解と混乱を呼んでしまったのかもしれないと思い、責任を取って回答をしようとしましたが、既にmaisumakunさんがまとまったより良い回答をしてくださっているので、回答は控えようと思います。
kazuyakazuya

2019/10/26 01:01

maisumakunさんの回答であったのですが syscall(いわゆるシステムコールと呼ばれているもの)命令自体は そのCPUでもあるということは syscall自体、別にLinuxを前提に作られたというわけではないということですか?
kazuyakazuya

2019/10/26 01:05

あと、参考リンク先では syscall命令のラッパー関数をわざわざ定義していますが レジスタに適切な値をセットすればいいと思うのですが わざわざ関数を定義しなければいけない理由とかあるんでしょうか?
dodox86

2019/10/26 01:13 編集

> syscall自体、別にLinuxを前提に作られたというわけではないということですか? そうです。先の質問のコメントにも貼りましたが、https://www.wdic.org/w/SCI/syscall > 従来、システムコールの実装にはソフトウェア割り込み機能が使われていた(Windows NT系ならint 2eh、Linuxならint 80h)が、ソフトウェア割り込みは処理が煩雑であるため遅かった。 > そこで、高速なシステムコールを実現するために、この命令が追加された。 CPUメーカーが、ソフトウェア開発界隈からの要請と自社製品の製品優越性を高めるために追加した機能(=命令)と(皮肉混じりに)言うこともできます。このCPU命令を実際に使うか使わないかはOS(ソフトウェア)側の設計方針によります。 > わざわざ関数を定義しなければいけない理由とかあるんでしょうか? これは、アプリケーションプログラマー側(システムコールを使う側)の気持ちになると分かります。アセンブリ言語のみでプログラムを書く場合と、C言語で書く場合で考えてみてください。これ以上は質問とこのコメント欄で書く範疇を越えると思いますので、この辺にしておきます。
kazuyakazuya

2019/10/26 01:54

ありがとうございます。
kazuyakazuya

2019/10/26 02:39

1つよろしいでしょうか? 前回の質問を見直していたところ asmさんのコメントで windowsではラッパー関数は使える・・・と書かれていました。 と、なると windows,Linuxは当然のように システムコールは使える。 windowsではつかえるちゃ使えるが 使いかたが公表されていない。 (syscallのラッパー関数を使えたとしても直接呼び出せないなら 意味ないのかぁ・・・)
asm

2019/10/26 03:13

そんな事書いた覚えありませんが
dodox86

2019/10/26 03:18

>asmさん 2019/10/25 14:06のコメント「そもそも、狭義のシステムコールを公開せずラッパー関数のみを公開しています。」の部分を言っているのだと思います。(転載してすみません) この時点で誤解がありますね。
dodox86

2019/10/26 03:20

はばかられますが、私に尋ねられたことだと思いましたので、こちらに回答します。(間違いなどがあれば追って指摘してください)
dodox86

2019/10/26 03:32 編集

asmさんは「狭義のシステムコールを公開せず」と書かれています。これは、INT 0x80やSYSCALL等のCPU命令を使ったOSに直接作用するシステムコールはWindowsでは公開していない、との意味です。(極めてOSに直接的で狭い範囲、つまり、狭義) 「ラッパー関数のみを公開しています。」と書かれているのはかなり広い意味です。ファイルにデータを書き込む機能に目を向けて話を続けます。Linuxでのシステムコールに相当するような、直接的にファイルにデータを書く機能は、 WriteFileと言う名前のWindows APIを使います。これも言うなればWindowsやプログラマーにとってはラッパー関数と言えなくも無いです。 アプリケーションからはWriteFileと言うWindowsAPI、言わば関数を使いますが、WriteFileも実は更にNtWriteFileやZwWriteFileと言う、よりWindowsの下層にあるAPIにつながっています。それらはSYSCALL CPU命令を使っているかもしれませんが、使っていないかもしれません。公開されていないので分かりません。 再び上の、WriteFile APIのレベルに話を戻します。今度はC言語のプログラムで使うような、wrire関数、fwrite関数などの標準関数に出会います。 これらはWindows環境下では(恐らく)WriteFile APIを使っていると思いますが、これもまた、ラッパー関数と言えます。 そんな訳で、話の文脈により「ラッパー関数」がどこにあたるかは様々です。「関数」と言う呼び方も実はプログラミングの文脈で指すものが違います。 C言語の標準関数内では、writeはwrite関数であり、LinuxでのC言語のラッパーであるwriteは、それ自体「システムコール(の関数)」と呼んだりします。 WindowsのWriteFileは関数とは呼ばず、Windows APIと呼ぶこともあります。(ドキュメントにはfunctionとあるから、関数でもいいけど) システムコールとは呼びません。 このように話の中で様々な単語が出てきて、文脈によって指すものが違ってくるので、特に初心者には理解がしずらいと思います。ひとつひとつにどうしても疑問は出てくるでしょうが、区別しないと理解はおぼつきません。頭では分かったつもりになっても、実際にプログラミングして便利/不便利を体感しないとなかなか分かるようにはならないと思います。
asm

2019/10/26 04:37 編集

重ねるようであれですが、本人として説明すると システムコール:OSの機能を呼び出すこと全般。WindowsAPIを含む事もある。 狭義のシステムコール:割り込みやsyscall命令といったCPUの機能を用いてOSの機能を呼び出す事 を指していました。 Windowsでは狭義のシステムコールを文書化していません。 ならば、どうやってOSの権限が必要なファイルへの書き込み等の処理を行うのか? それが、WindowsAPIと呼ばれるものになり、(一例としては)WriteFileという関数です。 ラッパー関数になっており、WriteFile内部ではファイル書き込みのためのシステムコールが行われています。
pepperleaf

2019/10/26 04:56

そういえば、(昔の)Unixでは、 > LinuxでのC言語のラッパーであるwriteは、それ自体「システムコール(の関数)」と呼んだりします。 writeはラッパー関数でなく、システムコールそのもの。Windowsが Unixをマネする過程で、導入された気がする。... と言うより、 C言語を本気でサポートしだした頃に、困ってサポートしたのではなかったかな?
kazuyakazuya

2019/10/26 05:34

解説ありがとうございます。  うーん、Linuxよりwindowsのほうがややこしいですね・・・ windowsはLinuxと違ってsyscallを使えなくて(やり方公開されていない) 代わりに、直接CPUに命令を下したいときは windowsAPIを使う・・・ (関数定義の集まり?) で、APIの定義の中にsyscallがあるかもしれないしないかもしれない ・・・ 概要はすこしはわかりました。 (今深入りしても理解できる自信ない・・) タイトルと少しずれてしまいますが syscallなど使って、直接的にCPUに命令を下すことで 関数のアドレスを気にする必要がない・・・ というシェルコード作成するうえでメリットがあったのだと 思うのですが windowsAPIを使う時点で、このいわゆるシステムコールを 使うメリットが無くなっている気がするのですが ・・・やっぱメリット無くなっていますよね?
dodox86

2019/10/26 05:38

> 使うメリットが無くなっている気がするのですが ・・・やっぱメリット無くなっていますよね? 無いです。(断言)
kazuyakazuya

2019/10/26 05:45

またタイトルとずれて申し訳ないのですが windowsというOS使っている時点でシェルコードの作成は無理なのでしょうか? (関数のアドレスを確認しなきゃいけない・・・に注目して)
dodox86

2019/10/26 05:55

無理とは言わないです。Windowsにも色々あるし、セキュリティ上の保護設定も様々です。古いPCと32ビット版Windowsならまた、比較的簡単でしょう。ですが、CPUとOSに対する高度な知識と精緻なプログラミング技術が必要です。(私には無理です)
kazuyakazuya

2019/10/26 05:59

ありがとうございます。 わかりました。 うーん、メインのパソコンが修理直るまで シェルコード作成は無理そうですねぇ・・・。 Linuxならwindowsよりいくらか難易度は下がりますよね? (下がるといってもそれでもハードル高そうだけど・・・)
asm

2019/10/26 06:22

メリット・デメリットとは相対的なものですが、何と比べた際のメリットなのでしょうか? あ、ちなみにシェルコードからWindowsAPIを呼ぶ方法自体はあります。 私が知っている手順としては 1. 特殊な設定を行わない限り、同一環境でのWindowsAPIの(一部の)アドレスは変化しないのでシェルコード生成時に調べておく方法 2. PEBからメモリのどこにkernel32.dllがあるかを探し出しDLLのエクスポートアドレステーブルを自力で解析する方法 方法1はお手軽ですが、シェルコードを生成するためにターゲット環境でプログラムを動かす必要があり シェルコードを注入する必要性に疑問を感じます。 方法2はアセンブリで書くことを考えるとげんなりします。
dodox86

2019/10/26 06:49

>asmさん フォローいただきありがとうございました。asmさんの本意を間違えて伝えては悪いと思っていたので、助かります。 >pepperleafさん > Windowsが Unixをマネする過程で、導入された気がする。... と言うより、 C言語を本気でサポートしだした頃に、困ってサポートしたのではなかったかな? うーん、これはどうなのでしょうね。32ビットWindows NTの前のMS-DOS --> 16ビットWindowsの頃は、INT 21hソフトウェア割込み(ファンクションコール)が存在しました。使い方のイメージとしてはシステムコールに似ていますし、ご存じのようにMS-DOSの頃にはUNIXを意識していました。Windows NT系は完全リニューアルのカーネルですが、初期にはPOSIX仕様を意識していたようなので、C言語I/F周りでは影響があったのかもしれません。(分かりませんけど) 。。。再び黙ります。
kazuyakazuya

2019/10/26 07:50

ありがとうございます。 うーん、・・・ そもそものアセンブリ言語で直接CPUへ命令(システムコール) をすることによって、"Hello World"プログラムを作ろう とした理由が シェルコードとして実行したいときに、 printf関数を使うと不利な点があるから ・関数の場所を書き込む必要があるから (細かい部分は理解していません。) だから、直接システムコールを使っちゃって、 できるだけ余計な処理(?)をさせずに "Hello World"を出力させようという話から 始まったと思うのですが。 "Hello World"を出力するシェルコードを作成するとして どのようなところをアレンジしてあげる必要になるのでしょうか? (新しく質問立てたほうがいいかな・・・)
dodox86

2019/10/26 07:57

> 新しく質問立てたほうがいいかな・・・ そうしてください。回答していただいた方々にも悪いです。
dodox86

2019/10/26 07:59

しかし、この調子で質問が乱立するとすれば、正直、ちょっとどうか感があります。(個人的意見です)
kazuyakazuya

2019/10/26 09:06

ありがとうございます。 とりあえず、実際にコードを書けてから質問しようと思います。 いろいろありがとうございました。
kazuyakazuya

2019/12/23 02:35

windowsにおいてシステムコールという言葉は使えるんですか? UNIX系OSに対するAPIをシステムコール WINDOWS系OSに対するAPIをWinAPI LinuxにおいてのWriteFileシステムコールと似ているものとして windowsではWriteFileというWinAPIがある。 WriteFileというWinAPIの中にはさらにNtWriteFileというものが呼び出されている。 NtWriteFileはWriteFileと違いWinAPIと言うことができず、 どちらかというとシステムコールと呼ばれている ・・・らしいですが windowsで「システムコール」という言葉を使うことに違和感(むやむや)があります。 >asmさんは「狭義のシステムコールを公開せず」と書かれています。 ここで言われているシステムコールとは windowsを前提に話しているから NtWriteFile とか、WinAPI内で呼ばれている関数のことですよね? 何をもってシステムコールというんですか?
guest

回答2

0

ベストアンサー

SYSCALL命令自体がLinux前提の命令なのですよね?

SYSCALL自体はCPUの命令なので、OSを問わず存在はします(いちおうWindowsでも使うことはできるようです)。

とはいえ、呼んだ先はカーネルですので、LinuxとWindowsでは使い方が全く異なります。そして、Windowsでは(上述の記事によれば)SYSCALLを直接呼ぶことが想定されていない、とのことです。

投稿2019/10/26 00:01

maisumakun

総合スコア145963

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

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

maisumakun

2019/10/26 00:06

> じゃあ、wiondowsの設定に合わせてレジスタを設定しsyscall命令を使えばいいじゃないか その「設定」が、Windowsのバージョンによってすら異なる代物です。試験的にやるのならともかく、実用的なプログラミングにはほぼ使えません。
dodox86

2019/10/26 00:31

様々なOSと開発の歴史や経緯を踏まえないと「なんでそんなに似たようなものがたくさんあって分かりづらいの?」と、いきなりシステムコールに触れる初心者の方には理解しづらいかな、と思いました。
kazuyakazuya

2019/10/26 00:50

回答ありがとうございます。 今回やるのは試験的なものなので リンク先で紹介されている ・EAXレジスタにコール番号 (バージョンに合わせて設定) ・R10レジスタに第一引数 ・その他の引数はスタックに積む。 windowsで想定されていない・・・は ・リターンアドレスをスタック先頭に積む。 これで解消(?)されるみたいに書かれています。 自分のwindowsのバージョンに合わせて 設定したら、write(writeみたいな)システムコールを 呼び出すことは可能ですよね? (可能なら試験的な意味でやろうと思っているのですが・・・)
maisumakun

2019/10/26 02:09

> 自分のwindowsのバージョンに合わせて 設定したら、write(writeみたいな)システムコールを 呼び出すことは可能ですよね? 可能か不可能かだけ言えば可能ですが、他の方法で可能なことを正式に公開していないルートから行うメリットは、一般のプログラマーにはほぼ皆無です。
maisumakun

2019/10/26 02:12

> windowsで想定されていない・・・は 文書になっていない以上、「想定外のところに影響が及んでしまう」というようなトラブルが起きる危険もあって、もちろん何が起きても自己責任です。
guest

0

syscall でぐぐって一通り読んでみる。はなしはそれから。

投稿2019/10/25 23:33

y_waiwai

総合スコア88038

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

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

kazuyakazuya

2019/10/26 00:51

回答ありがとうございます。 一応、検索候補上位のものはみたのですが・・・ (理解できたかどうかはわかりませんが・・・)
y_waiwai

2019/10/26 02:05

なら、CPUにその命令が存在している、ってのはわかってるよね CPUが一緒なんだから、Windowsだろうがその命令はあるってのは理解できる? んで、関数ってのは、誰かがそれを実装しないと存在しないってのはわかるかな? #小学生レベルになってきたな。。
kazuyakazuya

2019/10/26 02:14

それは理解しました。(ついさっき) C言語とかからも利用できるようにラッパー関数として定義 するというのもわかるのですが・・・ 用はLinuxでsyscallを使いたければLinuxのルールーで設定をして使い、 windowsでsyscallを使いたければバージョンごとに 適切な設定をして呼び出せばいいということですよね? まだ不に落ちないのは・・・ 前回の質問で・・・ https://teratail.com/questions/219269 windowsにはsyscall命令はない。というコメントをいただいたのですが (ラッパー関数は存在しない・・・関数のほう?) windowsではsyscall命令はできないみたいな感じに見えるのですが レジスタ(などなど)の設定をしても本当に呼び出せないのか? と・・・思ってしまうのですが
maisumakun

2019/10/26 02:21 編集

> windowsではsyscall命令はできないみたいな感じに見えるのですが レジスタ(などなど)の設定をしても本当に呼び出せないのか? 呼び出せますが、一般には公開されておらず、実用的でないだけです。
y_waiwai

2019/10/26 02:20

Windowsが使えるように実装していない(実装してるんだろうけど公開してない) ってだけで、あなたが使えるように実装すれば、当然ながら使えますぜ。 やってみたらどうです? #できないだろうけどw
kazuyakazuya

2019/10/26 02:29

そもそもの話に戻りますが https://qiita.com/five-inch/items/cddb0838f80cc3acb2fb ここの記事でやっていることは一体何ですか? syscall命令のラッパー関数を定義しているのですよね? syscall命令が使えない・使いかたを公表していない ただ、この記事のsyscall命令のラッパー関数定義のなかで syscall命令を使用しています。 これって、矛盾していませんか?(前回の質問でも指摘したけれど)
dodox86

2019/10/26 02:38

> これって、矛盾していませんか?(前回の質問でも指摘したけれど) そこに戻っちゃいますか?!「WindowsだけでLinuxみたいにsyscallしてみる」、"してみる"と書いてあるように、記事の執筆者さんの純粋な技術的興味から、なだけです。矛盾はしていません。 kazuyakazuyaさんがやろうとしているのを、一足早く実現されていると思ってください。
maisumakun

2019/10/26 02:41

> これって、矛盾していませんか? 「使い方を公表していない」けれど「技術的には呼ぶことが可能」、という状況です。呼んだ後何が起きても知らないですが。
kazuyakazuya

2019/10/26 02:44

ありがとうございます。 そういうことか・・・。 「技術的には呼ぶことが可能」 →今の私には理解できそうにないですし、またパソコン壊れたら たまったもんじゃないので、やめておきます・・・。 OSをLinuxに変えるしかないのか・・・
y_waiwai

2019/10/26 02:52

そのリンク先にも書いてありますぜ > これは、厄介なことにWindowsのバージョンごとに異なります。(Windows8と8.1とか、サービスパックでも違う。) その命令のジャンプ先を追いかけていけば、どこに飛んでいくか、なにをしてるかぐらいはわかるけど、それを持って使える!と喜ぶのは、せいぜい中二病で勘違いしてるようなひとだけです。 ちゃんとしたオトナは、正式に公開してないそんな情報に踊らされて使ったりしませんw
maisumakun

2019/10/26 03:06

「技術的に可能なこと」、「やって意味のあること」、「やっていいこと」は、それぞれ違ってきます。 たとえば、利用規約を無視してスクレイピングを行うことは「技術的には可能」ということも多いですし、やる本人にとっては「やって意味がある」かもしれません。ただし、「やっていい」わけではないです。
dodox86

2019/10/26 03:49

ただ、このようなCPUやOSに近い、低レベルの技術に興味を覚える若い方達はセキュリティの分野でも貴重だと思うので、年長者としてはモラルの面では気をつけさせつつ、応援してあげたい気はします。(個人的には/私の過去の回答のやり取りを踏まえて)
kazuyakazuya

2019/12/14 13:40

読み返していて思ったのですが SYSCALL命令自体がCPUにあるんですか? システムコールというのは割り込みによって構成されている(・・・のはず)。 システムコール自体がCPUにあるんですか? CPUそのものにあるのは割り込みだと思ったのですが・・・
y_waiwai

2019/12/14 14:00

ソフトウエア割り込み、という命令があります システムコール命令ってのは特定の割り込み晩法に対するソフトウエア割り込み命令です
kazuyakazuya

2019/12/14 14:12

うーん・・・ 割り込みは、割り込みタイプ(INT)とファンクション番号で実行するはずですが システムコールは INT を使わず SYSCALL を使っていますよね? ソフトウエア割り込みもハードウエア割り込みも結局は INTによる割り込みですよね(?)
maisumakun

2019/12/14 14:17 編集

> 割り込みは、割り込みタイプ(INT)とファンクション番号で実行するはずですが SYSCALLは仕組み的には似ていますが、割り込みとは別枠になっています。
kazuyakazuya

2019/12/14 14:23

システムコール自体はOS 割り込みはCPU と考えているのですがこれは違うのでしょうか?
maisumakun

2019/12/14 14:25

> システムコール自体はOS ですが、SYSCALL命令はCPUに存在するものです。
y_waiwai

2019/12/14 14:27

CPUにシステムコール用の命令が実装されていて、それをLinuxが自分のシステムコールに使っているってことですな。 Windowsは使ってない、ってことで。
kazuyakazuya

2019/12/14 16:35

うーん、わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問