DOBON.NETプログラミング道掲示板
(現在 過去ログ5 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34804 / inTopicNo.1)  アセンブリ言語について。
  
□投稿者/ コルム 一般人(4回)-(2021/06/30(Wed) 15:20:52)
  • アイコン環境/言語:[Linux] 
    分類:[.NET] 

    これが何をしているのか教えていただけないでしょうか?すみません。
    これの事です。
    (機械語データ) (アセンブリ言語)
    b8 57 61 6b 61 mov $0x616b6157,%eax
    53 push %ebx
    50 push %eax
    ba 04 00 00 00 mov $0x4,%edx
    bb 01 00 00 00 mov $0x1,%ebx
    b8 04 00 00 00 mov $0x4,%eax
    89 e1 mov %esp,%ecx
    cd 80 int $0x80
    58 pop %eax
    31 c0 xor %eax,%eax
    5b pop %ebx
    c3 ret
引用返信 削除キー/
■34807 / inTopicNo.2)  Re[1]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1363回)-(2021/06/30(Wed) 18:54:33)
  • アイコンNo34804に返信(コルムさんの記事)
    > 環境/言語:[Linux] 
    > 分類:[.NET] 
    > (アセンブリ言語)

    Linux + .NET + アセンブリですか?
    もしかして、分類:[その他]の間違いでしょうか。

    .NET Core における IL アセンブリのコードというわけでもなさそうですし…。
    https://en.wikipedia.org/wiki/List_of_CIL_instructions


    > (機械語データ) (アセンブリ言語)
    専門外な上に、手元に環境も無いので机上デバッグですが:

    > b8 57 61 6b 61 mov $0x616b6157,%eax
    最初に即値 $0x616b6157 'Waka' を eax レジスタに転送して…

    > 53 push %ebx
    ebx レジスタを使いたいので、元の値をスタックに退避しておく

    > 50 push %eax
    eax に書き込んだ値をスタックに積む

    > ba 04 00 00 00 mov $0x4,%edx
    > bb 01 00 00 00 mov $0x1,%ebx
    > b8 04 00 00 00 mov $0x4,%eax
    eax/ebx/edx それぞれに即値を代入して

    > cd 80 int $0x80
    この時点でシステムコール番号 4 になっているので、
    標準出力に "Waka" の 4 文字が出力されるんじゃないですかね。

     eax: 0x00000004 システムコール番号 write()
     ebx: 0x00000001 write()第1引数:出力先…0x1 なので「標準出力」
     ecx: esp の内容 write()第2引数:出力データのアドレス
     edx: 0x00000004 write()第3引数:出力データのサイズ

    > 58 pop %eax
    出力データはもう不要なのでスタックから取り除いて eax に入れて

    > 31 c0 xor %eax,%eax
    eax 自身を 0 クリア

    > 5b pop %ebx
    最初に退避しておいた ebx を復元して元に戻す

    > c3 ret
    スタックにある同一セグメントのアドレスに戻る
引用返信 削除キー/
■34808 / inTopicNo.3)  Re[2]: アセンブリ言語について。
□投稿者/ コルム 一般人(5回)-(2021/07/01(Thu) 04:47:55)
  • アイコン>>58 pop %eax
    > 出力データはもう不要なのでスタックから取り除いて eax に入れて
    何の出力データが不要なのでしょうか?教えていただけないでしょうか?すみません。

引用返信 削除キー/
■34809 / inTopicNo.4)  Re[2]: アセンブリ言語について。
□投稿者/ コルム 一般人(6回)-(2021/07/01(Thu) 04:51:28)
  • アイコン>>c3 ret
    > スタックにある同一セグメントのアドレスに戻る
    同一セグメントのアドレスに戻るという所が分かりません。教えていただけないでしょうか?すみません。
引用返信 削除キー/
■34810 / inTopicNo.5)  Re[3]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1364回)-(2021/07/01(Thu) 10:16:47)
  • アイコン結局これは、.NET の話なのでしょうか。それとも分類の選択ミス?

    No34808に返信(コルムさんの記事)
    > 教えていただけないでしょうか?すみません。
    こちらも、コルムさんの質問を見るまでは、x86 アセンブリを
    勉強したことがまったく無いです…。
    .NET の MSIL アセンブリなら、多少齧ったことがあるのですけれども、
    それ以外のアセンブリに関する知識は持ち合わせていません。

    Linux に関する知識も皆無で、昨日小一時間ググって調べた程度の知識しか
    持っていませんが、そんな知ったかぶりでも良ければ。


    >>> 58 pop %eax
    >> 出力データはもう不要なのでスタックから取り除いて eax に入れて
    > 何の出力データが不要なのでしょうか?
    スタックに積みっぱなしで放置するわけにもいかないですよね。
    スタックに push したデータは、pop で取り出して元に戻します。


    ……そもそも『スタック』って分かりますか?

    stack とは「堆積」の意。コンピューター的には Last-In-Last-Out なメモリ管理を指します。
    お皿を積み重ねて保管している場合、最初に取り出せるのは最後にのせたお皿です。
    そして一番上のお皿を取り除かないと、その次のお皿を使うことはできません。

    push は、データというお皿を積み重ねる行為。
    pop とは、積み重ねた一番上のお皿を取り出す行為。

    積み重ねたデータは esp (Extended Stack Pointer) にて管理されており、
    esp は今どこのスタック領域を使っているかを指し示しています。

    下記の「ステップ実行」を使うと、イメージが掴みやすいかと思います。
    https://vanya.jp.net/os/x86call/


    No34809に返信(コルムさんの記事)
    >>> c3 ret
    >> スタックにある同一セグメントのアドレスに戻る
    > 同一セグメントのアドレスに戻るという所が分かりません。

    たとえば A から B を呼び出して、さらにその B から C を呼び出すような場合、
    処理が終わったら呼び出し開始位置に戻ってくる必要があるわけで、
    その場所を示すためにもスタックが使われます。

    戻り先のアドレスをスタックに積んでから、次の処理を呼び出します。
    そこからさらに別の処理を呼ぶ場合も、同様に戻り先をスタックに積んでから呼びます。

    それぞれの処理が終わったら、最後にスタックから直前の「皿」を一枚取り出せば、
    戻り先のアドレスを得る事ができ、それを用いて呼び出し元に戻ることができます。
    https://okwave.jp/qa/q9895314.html

    各関数のスタック領域のベース位置を示しているのが、ebp (Extended Base Pointer) 。
    https://note.com/nekotricolor/n/n2a247c808275


    >>> cd 80 int $0x80
    >> この時点でシステムコール番号 4 になっているので、
    >> 標準出力に "Waka" の 4 文字が出力されるんじゃないですかね。

    文字列が出力されるという話は、この分野に素人な私の想像に過ぎません。

    INT 命令すなわち割り込み(software interrupt)については、
    No34802 で Heiki さんが書かれていたように、
    eax の値によって振る舞いが変わります。


    昨日ググって見つけたのは下記の資料。
    これにより、システムコール番号 4 が write であると知りました。
    https://qiita.com/kure/items/5a1a114f9a37aeab255c

    で、今日改めて調べてみたら、下記の資料を発見。
    https://www.mztn.org/lxasm64/x86_x64_table.html

    これによれば、write のシステムコール番号は
    32bit だと 4 で良いのですが、64 bit だと 1 らしいです。
    そしてシステムコール番号 4 は、32bit だと write ですが、
    64 bit だと stat になるそうです。

    なので、今回の質問が 32bit/64bit のいずれかで話が変わるのでしょうが、
    それを判断するすべを私は持ち合わせていません。(32bit で良いのですかね?)

    …でもって、じゃぁ write だと仮定して、その時の引数はどう扱われるのか
    調べてみたのが、昨日見つけたこの資料の 表3.2。
    https://www.atmarkit.co.jp/ait/articles/1703/01/news172.html

    これを、コルムさんのソースに当てはめてみて、
    >> eax: 0x00000004 システムコール番号 write()
    >> ebx: 0x00000001 write()第1引数:出力先…0x1 なので「標準出力」
    >> ecx: esp の内容 write()第2引数:出力データのアドレス
    >> edx: 0x00000004 write()第3引数:出力データのサイズ
    という動作になるんじゃないか…と想像しました。
    https://kazmax.zpp.jp/cmd/w/write.2.html

    なお今回の処理の場合、eax/ebx/ecx/edx レジスタは
     eax: 初期値不明 → int 段階では 4 → ret 段階では 0
     ebx: 初期値不明 → int 段階では 1 → ret 段階では実行前の ebx 値に復帰
     ecx: 初期値不明 → int 段階では 0x616b6157 を書き込んだポインタ → ret 時点でもそのまま
     edx: 初期値不明 → int 段階では 4 → ret 段階でも 4 のまま
    のように変化します。
引用返信 削除キー/
■34822 / inTopicNo.6)  Re[3]: アセンブリ言語について。
□投稿者/ コルム 一般人(7回)-(2021/07/05(Mon) 16:58:09)
  • アイコンecx: esp の内容 write()第2引数:出力データのアドレス
    espの内容は何になるのでしょうか?教えていただけると幸いです。すみません。
    それと、# Cの文字列はヌル終端で"Waka"は5バイトになるので
    # 完全には一緒じゃないけど、やりたいことは同じ
    の所で、なぜ5バイトになるのでしょうか?教えていただけると幸いです。すみません。
引用返信 削除キー/
■34823 / inTopicNo.7)  Re[4]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1368回)-(2021/07/05(Mon) 18:16:16)
  • アイコンNo34822に返信(コルムさんの記事)
    > それと、# Cの文字列はヌル終端で"Waka"は5バイトになるので
    > # 完全には一緒じゃないけど、やりたいことは同じ
    > の所で、

    えぇと?

    『の所で』とありますが、一体何の話をされているのでしょうか。
    質問文や今回のやり取りには、そんな話は無かったと思うのですが…。

    出典があるのなら、まずは情報ソースを明確にしてください。


    > ecx: esp の内容 write()第2引数:出力データのアドレス
    > espの内容は何になるのでしょうか?教えていただけると幸いです。すみません。

    esp の内容は 'Waka' を指し示すポインタとなっています。

    先に紹介した URL にも書かれている通り、スタックでは、
    esp レジスタにてデータの格納場所が決まります。

    下記の[ステップ実行]ボタンから、push や pop 命令が実行された時に
    esp がどのように変化するか確認してみてください。
    https://vanya.jp.net/os/x86call/

    標準出力に渡すデータは ecx で指定する必要があるため、
    >>> 89 e1 mov %esp,%ecx
    によって、スタック位置を示す esp 値を ecx に取り出しています。


    > なぜ5バイトになるのでしょうか?
    いや、それは話が逆なのでは?

    4 バイトのアセンブリが 5 バイトのデータになる、という話ではなく、
    5 バイトのデータを扱う C 言語のコードをコンパイルしたら、
    4 バイトのデータが処理されるアセンブリが生成された…
    という状況であろうと推察します。出典を見ないと分かりませんが。

    今回提示されたアセンブリには null データが無かったために、
    あくまでも推測ですが、NULL 終端な "Waka\0" という 5 バイトの
    C 言語の文字列データあったとすれば、それは ASCII で

    'W' … 0x57
    'a' … 0x61
    'k' … 0x6B
    'a' … 0x61
    '\0'… 0x00

    というバイナリになりますよね。


    バイナリとして標準出力に出力するのであれば 5 バイト全て必要となりますが、
    テキストとして扱うなら、終端直前までの 4 バイトのみが必要データなので、
    5 バイト目の 0x00 まで push する必要が無く、0x616b6157 の 4 バイトのみで
    結果的には同じ出力結果が得られている…という話なのだと思います。
引用返信 削除キー/
■34824 / inTopicNo.8)  Re[5]: アセンブリ言語について。
□投稿者/ コルム 一般人(8回)-(2021/07/05(Mon) 20:46:53)
  • アイコン以下のURLは、No.3です。
    https://oshiete.goo.ne.jp/qa/12435650.html
    なぜespがWakaを指し示すのでしょうか?教えていただけると幸いです。すみません。
    あなたの貼った一通りURL見てみます。ありがとうございます。
引用返信 削除キー/
■34825 / inTopicNo.9)  Re[6]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1369回)-(2021/07/05(Mon) 21:08:06)
  • アイコンNo34824に返信(コルムさんの記事)
    > なぜespがWakaを指し示すのでしょうか?

    質問するだけでなく、どこまで理解したかもフィードバックしてください。
    どこから説明すれば良いのか困ってしまいます。


    そもそも、冒頭で eax に "Waka" をセットしていることは分かりますか?
    No34823 で示した各文字の対応と見比べてみてください。

    b8 57 61 6b 61 mov $0x616b6157,%eax


    その後、eax の内容をスタックに積んでいますよね。
    この時点で、esp が指し示しているのは "Waka" のポインタになります。
    50 push %eax


    そして esp を ecx に転送しています。
    89 e1 mov %esp,%ecx
    http://programmer.main.jp/assembler/2_1.html

    これにより、ecx が指し示すのは "Waka" のポインタになります。
引用返信 削除キー/
■34826 / inTopicNo.10)  Re[6]: アセンブリ言語について。
□投稿者/ コルム 一般人(9回)-(2021/07/05(Mon) 21:50:32)
  • アイコンすみません、こういう事でしょうか?
    まず、eaxにWakaを格納して、ecxはpushのeaxがあって、espは一番上にあるものを指すので、 2番目のpushのeaxは 2番目に積まれているスタック( 1番上)にあるから、ecxはWakaというのを指しているという解釈でしょうか?教えていただけると幸いです。すみません。自分なりの考えですが。よろしくお願いします。

引用返信 削除キー/
■34828 / inTopicNo.11)  Re[7]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1371回)-(2021/07/05(Mon) 22:11:43)
  • アイコン
    No34825に追記(魔界の仮面弁士の記事)
    > 質問するだけでなく、どこまで理解したかもフィードバックしてください。
    > どこから説明すれば良いのか困ってしまいます。
    > そもそも、冒頭で eax に "Waka" をセットしていることは分かりますか?
    
    各レジスタの内容を明記しながら、改めて追いかけてみます。
    
    実行時の当初のメモリ状態が分からないので、
    適当にこんな感じの値だったとしておきましょう。
    いずれも適当に決めた仮の値なので、これ自体に意味は無いです。
    
     eax: 0x12345678  // 適当
     ebx: 0x76543210  // 適当
     ecx: 0x000000ff  // 適当
     edx: 0xfedcba98  // 適当
     esp: 0x00008000  // 適当
      [stack]
      0x7ff8: 0x00000000 // 適当
      0x7ffc: 0x00000000 // 適当
     =>0x8000: 0x000c0000 // 適当
    
    
    改めて最初から順に追跡。
    
    > b8 57 61 6b 61 mov $0x616b6157,%eax
    
    即値 $0x616b6157 'Waka' を eax レジスタに転送
     eax: 0x616b6157        // ★ 即値 W(57) a(61) k(6b) a(61) が、ここに転送された
     ebx: 0x76543210
     ecx: 0x000000ff
     edx: 0xfedcba98
     esp: 0x00008000
      [stack]
      0x7ff8: 0x00000000
      0x7ffc: 0x00000000
     =>0x8000: 0x000c0000
    
    > 53 push %ebx
    ebx レジスタの値をスタックに積む
     eax: 0x616b6157
     ebx: 0x76543210        // (1) ここに書かれていた値が
     ecx: 0x000000ff
     edx: 0xfedcba98
     esp: 0x00007ffc        // (2)
      [stack]
      0x7ff8: 0x00000000
     =>0x7ffc: 0x76543210   // (2) ここに転送され、さらにスタックの参照先も進む
      0x8000: 0x000c0000
    
    > 50 push %eax
    eax レジスタの値をスタックに詰む
     eax: 0x616b6157        // (1) ここに書かれていた値が
     ebx: 0x76543210
     ecx: 0x000000ff
     edx: 0xfedcba98
     esp: 0x00007ff8        // (2)
      [stack]
     =>0x7ff8: 0x616b6157   // (2) ここに転送され、さらにスタックの参照先も進む
      0x7ffc: 0x76543210
      0x8000: 0x000c0000
    
    > ba 04 00 00 00 mov $0x4,%edx
    即値 $0x00000004 を edx レジスタに転送
     eax: 0x616b6157
     ebx: 0x76543210
     ecx: 0x000000ff
     edx: 0x00000004        // ★ 即値 4 が、ここに転送された
     esp: 0x00007ff8
      [stack]
     =>0x7ff8: 0x616b6157
      0x7ffc: 0x76543210
      0x8000: 0x000c0000
    
    > bb 01 00 00 00 mov $0x1,%ebx
    即値 $0x00000001 を ebx レジスタに転送
     eax: 0x616b6157
     ebx: 0x00000001        // ★ 即値 1 が、ここに転送された
     ecx: 0x000000ff
     edx: 0x00000004
     esp: 0x00007ff8
      [stack]
     =>0x7ff8: 0x616b6157
      0x7ffc: 0x76543210
      0x8000: 0x000c0000
    
    > b8 04 00 00 00 mov $0x4,%eax
    即値 $0x00000004 を eax レジスタに転送
     eax: 0x00000004        // ★ 即値 4 が、ここに転送された
     ebx: 0x00000001
     ecx: 0x000000ff
     edx: 0x00000004
     esp: 0x00007ff8
      [stack]
     =>0x7ff8: 0x616b6157
      0x7ffc: 0x76543210
      0x8000: 0x000c0000
    
    > 89 e1 mov %esp,%ecx
    esp レジスタから ecx レジスタに転送
     eax: 0x00000004
     ebx: 0x00000001
     ecx: 0x00007ff8        // (2) ここに転送された
     edx: 0x00000004
     esp: 0x00007ff8        // (1) ここ(スタック位置)が参照され
      [stack]
     =>0x7ff8: 0x616b6157
      0x7ffc: 0x76543210
      0x8000: 0x000c0000
    
    > cd 80 int $0x80
    eax レジスタのシステムコール番号 4 で write 割込み
    標準出力に "Waka" の 4 文字が出力される
     eax: 0x00000004 システムコール番号 write()
     ebx: 0x00000001 write()第1引数:出力先…0x1 なので「標準出力」
     ecx: 0x00007ff8 write()第2引数:出力データである "Waka" のアドレス
     edx: 0x00000004 write()第3引数:出力データのサイズ(4 バイト)
     esp: 0x00008000
      [stack]
     =>0x7ff8: 0x616b6157
      0x7ffc: 0x76543210
      0x8000: 0x000c0000
    
    
    > 58 pop %eax
    スタックから取り出して eax レジスタに割り当て
     eax: 0x616b6157        // (2) ここに転送されてきて
     ebx: 0x00000001
     ecx: 0x00007ff8
     edx: 0x00000004
     esp: 0x00007ffc        // (3)
      [stack]
      0x7ff8: 0x616b6157   // (1) スタックが参照していたここの値が
     =>0x7ffc: 0x76543210   // (3) スタックの参照位置がひとつ前に戻される
      0x8000: 0x000c0000
    
    > 31 c0 xor %eax,%eax
    eax レジスタ同士の排他的論理和を取ることで、eax レジスタを 0 クリア
     eax: 0x00000000        // ★ ここが xor 演算されて 0 になる
     ebx: 0x00000001
     ecx: 0x00007ff8
     edx: 0x00000004
     esp: 0x00008000
      [stack]
      0x7ff8: 0x616b6157
     =>0x7ffc: 0x76543210
      0x8000: 0x000c0000
    
    ※ xor 処理の参考資料
      https://www.mztn.org/lxasm64/amd08_calc.html#xor
    
    
    > 5b pop %ebx
    スタックから取り出して ebx レジスタに割り当て
     eax: 0x00000000
     ebx: 0x76543210        // (2) ここに転送されることで、ebx が「当初の値」に復帰し、
     ecx: 0x00007ff8
     edx: 0x00000004
     esp: 0x00008000        // (3)
      [stack]
      0x7ff8: 0x616b6157
      0x7ffc: 0x76543210   // (1) スタックが参照していたここの値が
     =>0x8000: 0x000c0000   // (3) スタックの参照位置がひとつ前に戻される
    
    
    > c3 ret
    スタックが指し示している値が call 元のアドレス(上図だと c0000)なので、そこにジャンプ。
    この時、eax にセットされた「0」を戻り値として使うことができる。
    
    ※ ret 処理の参考資料
      https://vanya.jp.net/os/x86call/

引用返信 削除キー/
■34829 / inTopicNo.12)  Re[6]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1372回)-(2021/07/05(Mon) 22:42:17)
  • アイコン2021/07/05(Mon) 22:47:52 編集(投稿者)

    No34824に返信(コルムさんの記事)
    >>> # Cの文字列はヌル終端で"Waka"は5バイトになるので
    >>> # 完全には一緒じゃないけど、やりたいことは同じ
    > 以下のURLは、No.3です。
    > https://oshiete.goo.ne.jp/qa/12435650.html

    出典を提示して貰えたのでようやく分かりましたが、
    No34822 の段階では、質問内容が見当違いな方向を向いていたので、
    出典元の文章を読まなければ、何のことだか分からないですよ。(^^;

    というか、教えて!goo で教わった回答に関する疑問であるのなら、
    あちらで聞くのが筋という物でしょう。

    第一、他所の質問をここにも書きこんでいる時点で、
    掲示版の利用ルールを全く読んでいないことが分かるというものです。

    https://dobon.net/vb/bbs/index.html#:~:text=%E8%A4%87%E6%95%B0%E3%81%AE%E6%8E%B2%E7%A4%BA%E6%9D%BF


    > 以下のURLは、No.3です。
    一応回答しておきますと、その回答投稿では、
    『Cで書けば』と断りを入れた上で、
     write(1,"Waka",4);
    という疑似コードを提示しておられますよね?

    御存知かどうか知りませんが、C 言語においては、
    文字列リテラルは、終端に 0x00 が付与される仕様なのです。
    下記の「文字列リテラル」を読んでみてください。
    http://www.cc.kyoto-su.ac.jp/~yamada/programming/string.html#stringLiteral


    そのため、疑似コード write(1,"Waka",4); は、厳密には
    「57 61 6b 61 00」という 5 バイトを意味しているのであり、
    > b8 57 61 6b 61 mov $0x616b6157,%eax
    の「57 61 6b 61」の 4 バイトとは完全には一致していません。
    ※ b8 は mov 命令の意。

    しかし、NULL 終端は重要ではなく、あくまでも "Waka" という文字列を
    出力するという意図からすれば、大局的には同義というのが
    >>> # Cの文字列はヌル終端で"Waka"は5バイトになるので
    >>> # 完全には一緒じゃないけど、やりたいことは同じ
    という発言の意味でしょう。

    つまり 5 バイトというのは、あくまでもこの疑似コードの話だったわけです。
    前提となる疑似コードを提示することなく突然問われても、第三者には伝わりません。
引用返信 削除キー/
■34833 / inTopicNo.13)  Re[7]: アセンブリ言語について。
□投稿者/ コルム 一般人(12回)-(2021/07/07(Wed) 09:30:16)
  • アイコン ebx: 0x00000001 write()第1引数:出力先…0x1 なので「標準出力」の所で、標準出力以外に何があるのでしょうか?教えていただけると幸いです。すみません。
引用返信 削除キー/
■34834 / inTopicNo.14)  Re[8]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1373回)-(2021/07/07(Wed) 10:40:09)
  • アイコン理解したかどうかのフィードバックや、調査段階の報告も無いまま、
    次々に質問を上げてきている点が気になります。

    この掲示板の「質問をする際のアドバイス」を再読頂けますでしょうか。
    https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=man&no=0#help2


    No34833に返信(コルムさんの記事)
    >  ebx: 0x00000001 write()第1引数:出力先…0x1 なので「標準出力」の所で、標準出力以外に何があるのでしょうか?

    C 言語の write の仕様そのもので、第一引数はファイルディスクリプタですね。
    (ファイルディスクリプタについては御自身で調べてみてください)

    固定値として定義されているのは、標準ストリーム ファイルの
     0 … 標準入力 (write では使われない)
     1 … 標準出力
     2 … 標準エラー出力
    です。3 以降は各プロセスでオープンされたファイルやソケットやデバイスを
    指しており、固定値ではなくプロセス毎に異なる値となります。
引用返信 削除キー/
■34835 / inTopicNo.15)  Re[9]: アセンブリ言語について。
□投稿者/ コルム 一般人(13回)-(2021/07/07(Wed) 18:12:49)
  • アイコン前の質問で、理解できない所があるのですが、
     0 … 標準入力 (write では使われない)
    で、writeでは使われないのも仕様でしょうか?
    後、もう一つあって、
    3 以降は各プロセスでオープンされたファイルやソケットやデバイスを
    指しており、固定値ではなくプロセス毎に異なる値となります。
    という所がわかりません。ここをもう少し詳しく教えていただけると幸いです。
引用返信 削除キー/
■34836 / inTopicNo.16)  Re[10]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1374回)-(2021/07/07(Wed) 18:48:23)
  • アイコンNo34835に返信(コルムさんの記事)
    > 前の質問で、理解できない所があるのですが、
    >  0 … 標準入力 (write では使われない)
    > で、writeでは使われないのも仕様でしょうか?

    出力先と入力先が繋がっていることもありますが、
    使う/使わない とか できる/できない の話は別として、
    「出力」先はデータを書き込むためのもの、
    「入力」元はデータを読み取るためのものだということですね。
    https://stackoverflow.com/questions/7383803/writing-to-stdin-and-reading-from-stdout-unix-linux-c-programming

    …逆に、こちらからお聞きしてしまいますが、
    コルムさんが「標準入力」に対して write する場面というのは、
    どのような状況を想像されていますか?

    > ここをもう少し詳しく教えていただけると幸いです。
    https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%A8%98%E8%BF%B0%E5%AD%90
引用返信 削除キー/
■34837 / inTopicNo.17)  Re[11]: アセンブリ言語について。
□投稿者/ コルム 一般人(14回)-(2021/07/07(Wed) 20:01:30)
  • アイコンすみません。こちらの勘違いでした。writeについては。
    で、改めて聞くのですが、
    3 以降は各プロセスでオープンされたファイルやソケットやデバイスを
    指しており、固定値ではなくプロセス毎に異なる値となります。
    各プロセスとはこの場合どういう意味でしょうか?教えていただけると幸いです。すみません。
引用返信 削除キー/
■34838 / inTopicNo.18)  Re[12]: アセンブリ言語について。
□投稿者/ コルム 一般人(15回)-(2021/07/07(Wed) 20:05:48)
  • アイコンあなたの言っているソケットとデバイスの意味についても教えていただけると幸いです。(URLでも構いません。)
引用返信 削除キー/
■34839 / inTopicNo.19)  【注意】ルールをお守りください
□投稿者/ 管理人 一般人(2回)-(2021/07/08(Thu) 02:19:24)
  • アイコンコルム様には、 No34832 の投稿で、掲示板のルールをお守りいただけるようにお願いをさせていただきました。
    しかし、その後のご投稿も、ルールをお守りいただけていないようで、とても残念です。

    再度、「書き込みのルールについて」をお読みいただき、ルールをお守りくださいますように、お願いいたします。

    書き込みのルールについて
    https://dobon.net/vb/bbs/index.html
引用返信 削除キー/
■34840 / inTopicNo.20)  Re[12]: アセンブリ言語について。
□投稿者/ 魔界の仮面弁士 大御所(1375回)-(2021/07/08(Thu) 11:30:48)
  • アイコンここは本来、.NET Framework や VBA などの『Windows 環境』向けの
    プログラミングの話題が集まる掲示板です。
    Heiki さんにも指摘されていたように、場違い感が否めないです。

    Windows 以外での VBA や .NET 環境も存在はしていますし、
    Linux や アセンブリ系の質問をしてはいけないルールもありませんが、
    最初に選択いただいた
    > 分類:[.NET]
    は、一体どこに関わっているのでしょうか?
    分類選択が間違っていたという話も無かったですよね。


    仮に分類選択が間違っていたとして、冒頭で
     環境/言語:[Linux] 
    を選択されたということは、アセンブリはともかくとして
    Linux に関する知識はあるという事で良いのでしょうか。

    毎回、質問が追加されるだけで、理解度のフィードバックが行われないため、
    会話が一方通行的であり、貴方の知識レベルがまったく明かされていません。
    これでは、どこから回答すれば良いのかさっぱり掴めないのです。

    せめて、何のために先のアセンブリを読み解こうとしているのか、
    質問に至った理由あるいは目的を明らかにして頂けませんか?
    対話無きまま、本筋から外れて別の質問に派生され続けても正直困ります。



    No34837に返信(コルムさんの記事)
    > 各プロセスとはこの場合どういう意味でしょうか?

    用語の調べ方が分からないのか、調べたけれど不明瞭なので追加説明が欲しいのか、
    用語単独での意味合いは十分に理解している上で、文中追加の説明を求めているのか
    背景を明確にして欲しい所ですが:

    先の記述は、Linux にとっての「プロセス」の意味です。
    同じファイルを複数のプロセスから開いた場合、必ずしも
    同じファイルディスクリプタが返される保証はありません。

    write の第一引数はアセンブリから見ればただの数値でしかありませんが、
    その意味合いやとりうる数値の範囲は環境によって異なっています。

    No34834 で「ファイルディスクリプタについては御自身で調べてみてください」とお願いしたものの、
    同種の質問が繰り返されたので No34836 で wikipedia のページを紹介しましたが、読まれましたでしょうか。
    そこの概要欄で説明されている「プロセス」のキーワードをクリックすれば、詳しい説明に飛びます。

    C 言語側から見た場合、write は低水準入出力関数であり、その定義は
     int write(int fd, void *buf, unsigned sz);
    となっていて、UNIX や Linux ではシステムコールの位置づけです。
    (Windows においては、WriteFile API への呼び出しに変換されるもので、扱いが異なります)


    No34838 に返信(コルムさんの記事)
    > あなたの言っているソケットとデバイスの意味についても教えていただけると幸いです。(URLでも構いません。)

    ここでいうソケットやデバイスは、write の第一引数に渡すファイルディスクリプタであり、
    プロセスがオープンするファイルの一種です。(パラレルポートとかプリンターとか)

    URL については、IT 用語集でも wikipedia でも google でも、
    御自分で調べていただきたいところですが、とりあえず適当に貼っておきます。

    http://curtaincall.weblike.jp/portfolio-unix/api.html#:~:text=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%A8%AE%E9%A1%9E
    https://www.otsuka-shokai.co.jp/words/unix-domain-socket.html
    https://kazmax.zpp.jp/cmd/s/socket.2.html
    https://kazmax.zpp.jp/cmd/o/open.2.html
    https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
引用返信 削除キー/

次の20件>

トピック内ページ移動 / << 0 | 1 >>

[このトピックに返信]
Mode/  Pass/


- Child Tree -