- ベストアンサー
ポインターとアレー
アセンブラ言語を勉強しております。 mallocが、イマイチわかりません。 CPU内のレジスタに容量をつくるオペランドらしいというのが、わかりましたが。。。 それから派生する、 @SIZE() ポインター heap アレー string などが、何回聞いても、調べてもイマイチわかりません。 丁寧に教えていただけますか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
素人が思いつくまま記します。大きな課題なので、じっくりOSの本を読んでください。 MallocはMemoryAllocationすなわちOSシステムがメモリーを プログラムを読みこむためやデータを読み込むためやセットするために、そのエリアを確保する(割り当てる)こと。ポインターはオブジェクトプログラムのアドレスや変数の先頭番地を記憶するエリアや機能。C言語に限らず、Assemblerではポインターはアドレスを指すという機能と共に前面に出てくる。Basic言語は全くアドレスの考えを隠している言語です。ポインターは演算ができるので応用が広がります。アドレスモディファイというのが有ります。HeapはHeapSortというのがありますが、メモリー管理のための代表的なアルゴリズムのようです。アレーはArreyで配列のことでしょう。文字列の表現はC言語などでは配列の考えに持ちこんでいるのです。配列は要素数があり、これの上限を決めるものの、途中で増やしたい時があり、Redimとかやるときに、メモリーをMallocする必要が出てくる。Stringは文字列ですが、配列と考えると、これも文章の長さなどは一定とか限度がもうけられず、限度を越えるとメモリーを確保する必要がある。また不要になったメモリーエリアは解放して、たの用途に使わせなければならない。 OSのメモリー管理の本を読んだらどうでしょうか。数などは4バイト (32ビット)とか8バイト(64ビット)などと固定しているので考えやすいのですが、文字列や配列になると、ユーザー側がどう指定してくるか 不確定のところがあり、この処理のテクニックが(アルゴリズムが)OSでは要るようです。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
やや旧い時代の知識かもしれませんがお許し下さい。 >Mallocもレジスター内にメモリーを確保するのでしょうか? これらのメモリーは、ハードディスクやRAMではなく、CPU内のレジスターと考えてよろしいのでしょうか? 勿論内部メモリー(除くレジスター)RAM内でのことです。 「レジスター」と「メモリー」。どちらも記憶する機能がありますが、(1)読み出し書きこみのスピードが、メモリーより格段に早いものをレジスターとして設計している。(2)レジスターはビット数が少ない(3)内部メモリーのアドレスの代わりに、番号とか記号がつけられている。(4)内部メモリーのアドレスとは別系統である。(5)機械語のオペランドにレジスターを指定できるようになっている。(6)計算や処理機構がレジスターに対しても行うようになっている。(7)機械語命令指令はReg-Reg間、Mem-Reg間,Mem-Mem間、Reg内のみ、Mem内のみなどが有る。(5)(6)があるのでレジスターの存在意義がある。 (8)レジスター内のメモリーはビット並びとして考えられるとおもうので、バイト列に対して考えるアドレスと言う言葉はなじまないとおもう。 (9)シフト機能やビット演算(AND,OR,XORなど)がレジスター 演算として出てくる。(10)専用にRAMアドレスを表す、アドレスレジスターの機能を持たせることも多い。(11)メモリーの膨大化により、レジスターがアドレスを全域表すためにビット数が増加している。(12)2つのレジスターを繋いで使ったり、前半と後半を別に2つのレジスターとして使えるようになっているものも有る。(13)キャッシュメモリーよりスピードが速い。 >アドレスは、CPUにあるレジスタ内に作られるのでしょうか。 アロケーションとは何番から何番までのメモリー番地を、そのプログラムの処理の為に確保する(他には使わせない)と言うことで、アドレス番地はレジスターに載せてのみ表される仕組みのコンピュターだけでないので、質問の表現が不可。アドレスとはメモリー空間(帯域)の意味で使ったもの。 レジスターはアドレスの(先頭)番地を記憶する(載せる)器であり、 RAMのアドレス空間そのものではない。レジスターの数は20個以内程度と少ないものだと思うが、それだけに使い尽くすことはあるが、プログラマーの問題であって、記憶するプログラムやデータ量が多く、メモリーをもっと自分に使わせろ寄越せという問題とは違う。 >書いておられる機械語、アッセンブラについては、その知識がないので答えられません。ただDH is the letter AはDHレジスタにJIS(41)のAというCharacter1文字(定数」)をセットすると言う意味でしょうか。mov( DH, [ EBX ] ); // A[i] = i番目のアルファベットは配列(=文字列)のEBX文字目にAをセットと言う意味でしょうか。 mov( EAX, EBX ); //EBX is address of A[i]のEAXに付いては判らず、答えられません。この部分は間違っておればお許し下さい。
お礼
いろいろとありがとうございました。 基礎的なことを勉強しなおしてやり直します。
- k-family
- ベストアンサー率34% (180/523)
なるほど、HLAのことだったのですね。 こちらについては名前だけしか知りません。お役に立てそうもありません、ごめんなさい。 ちょっとwebで調べてみたのですが、参考になりそうなHPも少ないですし、英語ばかりですので、私の手には負えそうもありませんm(_ _)m
お礼
いろいろ調査していただいたようで、ありがとうございました。 お礼が遅くなり申し訳ございません。
補足
ご丁寧なお答えありがとうございます。 お時間を頂きありがとうございました。 これからもよろしくお願いします。
- KOH_da
- ベストアンサー率31% (161/506)
丁寧に教えようにも、CPUとかがわかんないと...。 たとえば、mallocっていうとC言語でおなじみです。 CPUのレジスタ内に容量を作るのではなく、 OSに対してメモリ確保をお願いする命令(っていうか関数)です。 SIZE()やheapや、アレー(アレイ=配列)とかを扱うとなると、 それってホントにアセンブラなの? って思います。 どの言葉も知っていて当然の言葉なので、 あなたが勉強している環境や、 その疑問を持つにいたった文章があれば、 説明できると思います。
お礼
学部の先生も、本件を問題にしてるようです。 assemblerが、HLAにすりかわっているとは。。。 どうもありがとうございました。
補足
ご親切なご回答ありがとうございます。 お答えの一番の補足説明に記入いたしました。 私もできるだけの調べをインターネットにてしらべてみましたが、適切な答えが出ているサイトを見つけることができませんでした。なぜなら、アセンブラ言語に関するサイトは、8086関係または、.asmに関係しているようなのです。しかし、.hlaというのは、どのサイトにも表記は、無かったので、頭を抱えております。 しかし、コンパイルするときに、hla assembler(コンパイラーのようなもの)、microsoft assembler, version 6.15というのを使っているようです。 お力を貸していただければ幸いです。 よろしくお願いします。
- k-family
- ベストアンサー率34% (180/523)
普通、mallocはmemory allocationで、メモリエリアを確保する命令(疑似命令)のことだと思います。もし、 >CPU内のレジスタに容量をつくるオペランドらしい だとするとかなり特殊な命令系統を持ったCPUのような気がします。(昔、メモリ上に仮想的なレジスタを作るというCPUがありましたが、そんな種類のものでしょうか) ということで、この種の質問は、具体的にCPUやアセンブラの名前を表示された方が回答がつきやすいと思います。
補足
確かに、理解不足からきているものだと思います。 只今、勉強しているのは、.asmという拡張子のアセンブラでは、ないのです。 .hlaという拡張子のコードをメモパッドで作成し、コンパイルしてから.asmや.exeなどのドキュメントができるという不思議なアセンブラを勉強しております。 ハイレベルランゲージを勉強した友達からは、君が勉強しているのは、本当の意味でのアセンブラではないと指摘されたことがあります。 また、手違いで取ってしまった科目なので、C/C++または、javaなど(当然ながら、DOSの知識などは、ありません)の言語の知識の無いままの勉強なので、自分の言っていることが専門知識があるかたら見るとおかしなことかもしれません。 本文では、上記のことに触れておりませんでした。 よろしくお願いいたします。
お礼
お手数をおかけしました。 この授業は、あと残り一週間となりましたが、 期末を受けず、また別の機会にとることにしました。 お手数をおかけしました。 ありがとうございました。
補足
ご丁寧なお答えありがとうございます。 しかし、自分の勉強不足でもう少し伺いたいことがあります。 MallocはMemoryAllocationすなわちOSシステムがメモリーを プログラムを読みこむためやデータを読み込むためやセットするために、そのエリアを確保する(割り当てる)こと。 とありますが、そのエリアは、EAXやAX、AH,ALといったCPUにあるレジスターの内と考えてよろしいのでしょうか? ポインターはオブジェクトプログラムのアドレスや変数の先頭番地を記憶するエリアや機能。とアレーは、一組と考えてよろしいのでしょうか? また、アドレスは、CPUにあるレジスタ内に作られるのでしょうか? Mallocもレジスター内にメモリーを確保するのでしょうか? これらのメモリーは、ハードディスクやRAMではなく、CPU内のレジスターと考えてよろしいのでしょうか? 追加の質問なのですが、 mov( $41, DH ); //DH is the letter A mov( EAX, EBX ); //EBX is address of A[i] mov( DH, [ EBX ] ); // A[i] = i番目のアルファベット とすると$41=Aは、EBXとなるのでしょうか? もし、教えていただけるようなら幸いです。 よろしくおねがいします。