アセンブリ言語と機械語のアドレス表現について

このQ&Aのポイント
  • アセンブリ言語と機械語のアドレス表現について、C 言語プログラムをアセンブリ言語に変換し機械語にアセンブルした結果を解析する中で、BSS セグメント内の変数 data_one のアドレス表現がリトルエンディアンで逆順になっていることについての質問です。
  • C 言語プログラムで使用されている変数 data_one のアドレスは 0x8 バイト(0000000000000008)ですが、機械語の表現はリトルエンディアンで逆順になります。
  • なお、BSS セグメントが存在するオブジェクトファイルは機械語で書かれているため、0x8 バイト(0000000000000008)という表現も機械語の一部だと考えられます。
回答を見る
  • ベストアンサー

アセンブリ言語と機械語のアドレス表現について

下記、C 言語プログラムをアセンブリ言語に変換し、そして アセンブリ言語をアセンブルして機械語との関係を見たところ、 下記のようなアセンブル結果が得られました。 アセンブル結果についてお聞きしたいのですが、 BSS セグメント内の変数 data_one のアドレスは 0x8 バイト(0000000000000008)だが、 機械語としての表現はリトルエンディアンで逆順になって 08000000 となるということでしょうか? BSS セグメントが存在するオブジェクトファイルは機械語で書かれているので、 0000000000000008 という表現も機械語なのだろうかと思い混乱しています ■ C 言語プログラム #include <stdio.h> main() { static int data_one ; static int data_two ; static int data_three ; int counter ; data_one = 1000 ; for (counter=0 ; counter < 5 ; counter++) { data_two = data_one + 1 ; data_three = data_two + 2 ; data_one = data_one - 3 ; } printf("data one,two,three : %d,%d,%d \n",data_one,data_two,data_three) ; printf("logical address of data_one : 0x%x \n", &data_one); printf("logical address of data_two : 0x%x \n", &data_two); printf("logical address of data_three : 0x%x \n", &data_three); } ■アセンブル結果のリダイレクト 44 0046 A3080000 movl %eax, data_one.1931 44 00 (中略) DEFINED SYMBOLS sample_4_2.s:7 .bss:0000000000000008 data_one.1931 以上、お手数おかけしますがコメントいただけると嬉しいです。 よろしくお願いします

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

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

> DEFINED SYMBOLS > sample_4_2.s:7 .bss:0000000000000008 data_one.1931 .bss の先頭アドレスからのオフセットでしょう。global 変数や static 宣言された変数を割り当てた仮の位置です。 丁度 64bit 表記になってる気がしますし、シンボル定義って書いてありますから。

その他の回答 (1)

  • davidfox
  • ベストアンサー率58% (21/36)
回答No.1

詳しくは知りませんが... >BSS セグメント内の変数 data_one のアドレスは 0x... --> (少なくとも直接な)アドレスとは思えません。余計な0が多過ぎます。 >0000000000000008 という表現も機械語なのだろうかと思い混乱しています --> データですから有り得ないと思います。

関連するQ&A

  • 機械語とアセンブリ言語について。

    (機械語データ) (アセンブリ言語) 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 で、右側のアセンブリ言語のニーモニックとオペランドについて解説していただけないでしょうか?すみません。

  • 機械語とアセンブリ言語について。

    (機械語データ) (アセンブリ言語) 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 こちらのアセンブリ言語の命令がわかるおすすめの書籍を知らないでしょうか? 教えていただけないでしょうか?すみません。

  • アセンブリ言語について。

    >2進数の羅列では人間にはあまりに読み書きしにくいからです。 >それを命令単位に区切って、英単語を元にした名前を与えたのが、 >アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。 簡潔に要点がまとまっている、すばらしい説明ですね。その通りです。 これで理解できないなら、追加の説明のしようがありません。 (なお、このように、他人の発言は引用符を付けて引用すると、わかりやすくなります。是非そうしてください。) まあ具体例を挙げるならこんな感じ。 (機械語データ) (アセンブリ言語) 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 人間がCPUを直接動かすプログラムを書こうとするとき、アセンブリ言語を使って書きます(右側の部分)。 mov $0x616b6157,%eax push %ebx push %eax mov $0x4,%edx mov $0x1,%ebx mov $0x4,%eax mov %esp,%ecx int $0x80 pop %eax xor %eax,%eax pop %ebx ret そしてこれをアセンブルすると、1対1対応した機械語のデータ列が出来ます。 それが b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 この部分。 機械語には改行なんてありませんから、実際は一連の b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 と言うデータ列になります。 これをCPUが実行していきます。 相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません。 なので、人間が機械語レベルでプログラミングする際には、アセンブリ言語を使います。 ※この回答のプログラムはこちらから引用しました。 >31バイトでつくるアセンブラプログラミング アセンブラ短歌の世界 >https://book.mynavi.jp/support/pc/4946/c01_assembra.pdf で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • C言語初心者です。計算がうまく出来ず困っています。

    「苦しんで覚えるC言語」というサイトに載っている以下の問題を解きたいのですが、プログラムにエラーは出ないものの正常な結果が出ません。 定価を入力すると、1割引、3割引、5割引、8割引の値段を一覧表示するプログラムを作成せよ。 なお、結果の金額は整数値での表示が望ましいが、実数でもかまわない。 私は以下のようにプログラムを書いたのですが、実行して数値を入力すると、「0 ,0 ,0 ,0」と表示されてしまいます。 #include <stdio.h> int main(void) { int price,one,three,five,eight; scanf("%d",&price); /* 入力部分 */ one = price*0,9; three = price*0,7; five = price*0,5; eight = price*0,2; printf("%d ,%d ,%d ,%d \n",one,three,five,eight); return 0; } サイトでの解答は以下のようになっており、解答の他にも、変数を使用して書いても良いとあります。 #include <stdio.h> int main(void) { int price; printf("定価を入力して下さい : "); scanf("%d",&price); printf("1割引 = %d円\n",(int)(price * 0.9)); printf("3割引 = %d円\n",(int)(price * 0.7)); printf("5割引 = %d円\n",(int)(price * 0.5)); printf("8割引 = %d円\n",(int)(price * 0.2)); return 0; } これより前の内容を復習したり、調べたりもしたのですが、自分ではどこに間違いがあるのか見つけられませんでした。非常に初歩的な内容で恐縮ですが、助言をお願いします。

  • アセンブリ言語について。

    これが何をしているのか教えていただけないでしょうか?すみません。 これの事です。 (機械語データ) (アセンブリ言語) 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

  • C言語プログラム 配列

    C言語プログラム初心者です。以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。 #include<stdio.h> int func(int a[ ],int b[ ],int n); main(){ int i,k; static int a[12] ={1,2,3,4,5,(省略)・・・,12};  static int b[12] ={21,22,23,24,(省略)・・・,32}; k = func(a,b,6); k = func(b+3,a+3,6); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\n = b"); for(i=0;i<12;i++)printf("%d",b[i]); printf("\n k = %d\n",k); } int func(int a[ ],int b[ ],int n){ int i,x=0; for(i=0;i<n;i++);{ a[i] = b[i]; x = x+a[i]; } return(x); } 結果: a = 21 22 23 .... 26 7 8 9 10 11 12 b = 21 22 23 .... 26 7 8 9 30 31 32 k = 99

  • 複利の利率を求めるプログラムをC言語で作りたいんですが、、、

    計算を始める値、最終的な結果、計算回数(期間)、の3つから利率を求めたいんですが、、 単利の利率を求める公式から、利率を0.001ずつ減らすループを作れば、誤差0.001以内の値が出るのではないかと思ったんですが、、全く動いてくれなせん、何故でしょうか?? #include<stdio.h> double main() { double x; double s; double k; int counter1; double a; double b; double r; int counter2; printf("初期値=?\n"); scanf("%lf",&x); printf("結果=?\n"); scanf("%lf",&s); printf("期間=?\n"); scanf("%d",&counter1); k=((s-x)/(counter1*x));//*単利での利率の公式*// printf("単利での利率(%%)=%f\n",k*100); while(counter1==counter2){ b=x;//*bはxを上書きさせない為*// k=k-0.001; while(b<=s){ //*複利の計算*// a=b/100; r=a*k; b=b+r; counter1++; printf("複利での利率(誤差0.001)=%f\n",k);} }return 0;} whileの部分ををforで、 for(b=x;counter1==counter2;k-0.001){ for(counter1=1;b<=s;counter1++){ としても、、コンパイルはできるのですが、、ループ自体をしてくれません、、何故なのでしょうか??C言語以外でもいいですが、、複利の利率は公式とかはあるんでしょうか??

  • 複利の利率を求めるプログラムをC言語で作りたいんですが、、、

    計算を始める値、最終的な結果、計算回数(期間)、の3つから利率を求めたいんですが、、 単利の利率を求める公式から、利率を0.001ずつ減らすループを作れば、誤差0.001以内の値が出るのではないかと思ったんですが、、全く動いてくれなせん、何故でしょうか?? #include<stdio.h> double main() { double x; double s; double k; int counter1; double a; double b; double r; int counter2; printf("初期値=?\n"); scanf("%lf",&x); printf("結果=?\n"); scanf("%lf",&s); printf("期間=?\n"); scanf("%d",&counter1); k=((s-x)/(counter1*x));//*単利での利率の公式*// printf("単利での利率(%%)=%f\n",k*100); while(counter1==counter2){ b=x;//*bはxを上書きさせない為*// k=k-0.001; while(b<=s){ //*複利の計算*// a=b/100; r=a*k; b=b+r; counter1++; printf("複利での利率(誤差0.001)=%f\n",k);} }return 0;} whileの部分ををforで、 for(b=x;counter1==counter2;k-0.001){ for(counter1=1;b<=s;counter1++){ としても、、コンパイルはできるのですが、、ループ自体をしてくれません、、何故なのでしょうか??C言語以外でもいいですが、、複利の利率は公式とかはあるんでしょうか??

  • C言語 クロージャマクロの読み方

    #include <stdio.h> #define APPLY(type, closure, arg) (type)(&(closure), arg) #define APPLY_COUNTER(c, a) APPLY (((int (*)(Counter *, int))((c).func)), c, a) // <= #define MAKE_COUNTER(k) {k, counter_function}; typedef struct{ int n; void* func; }Counter; int counter_function (Counter * c, int a){ return c->n += a; } int main (void){ Counter c1 = MAKE_COUNTER (0); Counter c2 = MAKE_COUNTER (5); printf ("%d\n", APPLY_COUNTER (c1, 3)); /* => 3 */ printf ("%d\n", APPLY_COUNTER (c2, 1)); /* => 6 */ printf ("%d\n", APPLY_COUNTER (c1, 2)); /* => 5 */ printf ("%d\n", APPLY_COUNTER (c1, 8)); /* => 13 */ printf ("%d\n", APPLY_COUNTER (c2, 9)); /* => 15 */ } #define APPLY_COUNTER ここの APPLY への値渡しが読み解けません 詳しい方、教えてください

専門家に質問してみよう