• ベストアンサー

retやretfについて。

アセンブリ言語では、retとretfとはどういう事でしょうか?nearリターンとfarリターンの違いは何でしょうか?教えていただけないでしょうか?すみません。 nearは現在のセグメント内で戻る。 farの方は、セグメントも復元して戻る。 の違いだと。 直訳するとセグメントは分割ですが、nearは現在の分割に戻る。farは、分割も復元して戻る。という意味になると思うのですが、どういう事でしょうか?差し支えなければ教えていただけないでしょうか?すみません。

質問者が選んだベストアンサー

  • ベストアンサー
  • hiodraiu
  • ベストアンサー率15% (448/2823)
回答No.1

CPUのアーキテクチャを理解してからでないと、説明しても理解できないと思います。逆にアーキテクチャを理解すれば、セグメントやnearやfarといった言葉の意味が理解でき、こういった疑問は出てこないと思います。 部分的な話の前に全体を理解すべきだと思います。

zasx1097
質問者

補足

で、nearリータンは、0〜65535以内にあって、farリターンはセグメントが関係ないというのは本当でしょうか?この解釈であっていますでしょうか?教えていただけないでしょうか?すみません。

その他の回答 (2)

  • _kappe_
  • ベストアンサー率68% (1523/2217)
回答No.3

一つ一つの命令について質問する前に、x86アーキテクチャの全体的なことを一通り学習することをお勧めします。そのほうが理解が進むと思います。 たとえばhttps://okwave.jp/qa/q9893184.htmlの回答No.2でも紹介した「はじめて読む486」を読んでみてください。電子書籍版もありますし、図書館や古書店で探すのでもいいでしょう。 https://www.amazon.co.jp/dp/B00OCF5YUA 付け加えると、セグメントという概念を持っているCPUはx86系以外にはほぼ残っていないので、x86の機械語でプログラムを書かない人には使いどころのない知識です。

  • hiodraiu
  • ベストアンサー率15% (448/2823)
回答No.2

No.1です > nearリータンは、0〜65535以内 セグメントのサイズによって範囲は変わりますし、ここで書かれた範囲が相対値なのか絶対値なのか何なのか分からないので正しいとも間違っているとも言えません。 > farリターンはセグメントが関係ない Cセグの値も使います。

関連するQ&A

  • ret とretfについて。

    アセンブリ言語では、retとretfとはどういう事でしょうか?nearリターンとfarリターンの違いは何でしょうか?教えていただけないでしょうか?すみません。

  • 機械語に直すことについて。

    (機械語データ) (アセンブリ言語) 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 これのintと movとxor の機械語が分かりません。後、retの機械語が、farなのかnearなのかも分かりません。教えていただけないでしょうか?すみません。

  • 低水準言語について。

    低水準言語があるのは、例えば、この人は、これができた。あの人は、これができた。しかし、一つだけできたのでは、意味がないから、それを総称(合併)して、アセンブリ言語という名前になった。で、 アセンブリ言語がなければ、C言語などの高水準言語は、誕生していなかった。という事で、合っていますでしょうか?教えていただけないでしょうか?すみません。

  • .CSEGと.DSEG

    AVR studioというアセンブリ言語を使っているのですが、 .CSEGと.DSEGの使い方の違いが明確にわかりません。 どなたかわかる方がいたら教えてください。

  • アセンブリのプログラムです。

    アセンブリのプログラムで質問があります。cのプログラムのオブジェクトファイルを生成して、objdumpというコマンドでアセンブリ言語を表示させてみたのですが、全然分からなくて、困っています 。どうか、アセンブリプログラムの、解説をよろしくお願いします。できれば、1文1文解説してもらえるとありがたいです。あと、スタックの動き、確保などの解説もあるとありがたいです。よろしくお願いします。 cのプログラム int fact(int p) { if(p<=1) return 1; else return fact(p-1); } アセンブリのプログラム push %ebp mov %esp,%ebp sub $0x8,%esp cmpl $0x1,0x8(%ebp) jg 15 <_fact+0x15> movl $0x1,-0x4(%ebp) jmp 24 <_fact+0x24> mov 0x8(%ebp),%eax dec %eax mov %eax,(%esp) call 0 <_fact> mov %eax,-0x4(%ebp) mov -0x4(%ebp),%eax leave ret nop nop nop

  • 基本情報技術者の言語選択について

    現在、基本情報技術者の勉強中なのですが、言語選択で迷っています。 現状、C言語かアセンブリ言語を考えています。プログラミング経験はなくほとんど素人ですが、ネットワークの学校を出ておりリナックスでサーバ構築をしておりました。 希望はC言語なのですがプログラミング経験がないため、アセンブリ言語にしたほうがいいのかと思ってます。 基本情報のC言語は合格レベルまでに引き上げるまでどれくらいの時間がかかるでしょうか? アセンブリ言語のほうはどれくらいでしょうか? 回答お願いします。

  • PHP、exec関数のreturn_varの値

    このようなコードをPHPから実行させています。 ******************** $com = 'convert -version'; $out = array(); $ret = 0; exec($com, $out, $ret); echo '$out = ' . var_export($out); echo '$ret = ' . var_export($ret); ******************** この結果なのですが、 -------------------- $out = array ( ) $ret = 5 -------------------- ということで、うまくコマンドが動いてくれていないのですが、 return_varにあたる$ret=5は、何を意味してくれているのでしょうか? 127ならちょいちょう検索ヒットするんですけどね……。 ご存知の方、よろしくお願いします。

    • 締切済み
    • PHP
  • プログラミングについて。

    コンピュータは電圧の高い(H)と低い(L)を2進数としてCPUがクロック信号の入力を受けて処理します。 2進数はそのままだと扱いづらいので、数値的に親和性のある2のn乗進数を使います。 一般にコンピュータは1オクテットを1バイト、1ワードとしています。 その時16進数2桁で1バイトとなることから16進数表記が使われています。 なので、極論で言えば16進数2桁ではなく256進数1桁でも良かったという事です。 実は、大抵のアセンブリ言語は2進数表記を扱えます(8進数も使えるかも)。 アセンブラは16進数でも2進数でもそのまま対応するマシン語に置き換えていくものです。 アセンブリ言語とマシン語は一体一で対応しているので、実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。 マクロアセンブラの場合はマクロ命令までは再現されませんが、ここでは関係無いので割愛します。 つまり、マシン語とアセンブリ言語は本質的に全く同じものです。 単に、人間に読みやすく見せているものアセンブリ言語です。 マシン語もアセンブリ言語も低水準言語です。 高水準言語とは、C言語などのコンパイルを必要とするものや、BASICやJavaScriptのようにインタープリタを必要とするもののことです。 こちらは、CPUが直接解釈できるマシン語とは全く違う人間の都合に合わせた表現でコーディングし、後からマシン語に変換する仕組みのものです。 人間に読みやいコードをマシン語に変換するので、関係は一体一ではありません。 つまりコンパイルやインタープリットすると元の情報(ソースコード)は失われます。 で、① インタープリタとインタープリットとは何でしょうか?教えていただけないでしょうか?すみません。 ② マクロアセンブラの場合はなぜマクロ命令が再現されないのでしょうか?教えていただけないでしょうか?すみません。 ③ 実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。とはどういう事でしょうか?つまり、実行ファイルというのは、プログラマーが書いたソースコードのことでしょうか?教えていただけないでしょうか?すみません。 教えていただけないでしょうか?すみません。

  • 64ビットWindows上でアセンブリ言語

    こんにちは。 現在、OSは現在、64ビット版のWindows7を使っています。 このWindows7上で、アセンブリ言語によるプログラミングを行いたいと思っています。 どうして今頃アセンブリ言語なのかといいますと、会社の研修で、C言語による組込みソフトウェア開発を学ぶ際に、アセンブリ言語も学習するらしいので、少し予習してみようと思いました。 そこで、64ビット環境でも動作するアセンブラを探してみたのですが、 なかなか見つからず、困っています。 ネット上の情報を頼りに色々と試したのですが、作成した実行ファイルをいざ実行しようとすると、「64ビット環境では動作しない」といった内容のメッセージが出たりして、 どうしても動作してくれませんでした。 64ビット版のWindows上で、アセンブリ言語によるプログラミングができている方がいらっしゃれば、どうやってできたのかを、是非教えて頂きたいです。 必要であれば、インストールすべきソフトウェアの一覧と、環境設定方法なども、簡単に説明して頂ければ、大変助かります。 あと、動作確認を行う簡単なサンプルプログラムも、提示して頂ければ大変助かります。 (なにせ、アセンブリ言語に関する知識がゼロなものですので。) では、よろしくお願い致します。

  • コンストラクタ

    CRect Ret() { return CRect(1,2,3,4); } というように、以下の構造体をしたいのですが、 今現在、D言語風になっています。 ところどころ問題のあるコードですが、 どうすればいいのか教えてください。 よろしくお願いします。 struct BITSTRUCTURE { int Bit; int UsedBitLength; this(int bit,int usedbitlen) { BITSTRUCTURE BitSt; BitSt.Bit=bit; BitSt.UsedBitLength=usedbitlen; return BitSt; } };