VC6で以下のようにメモリ上の4バイトは逆さなのでしょうか?
非常に使いづらいです。
正しく?1を取得する方法が知りたいです。
int a[2] = { 1, 2 };
_asm{ // 2003年頃の本を見ると__asmだし、他ではasmだった。 _asmはVC特有?
mov esi, a // メモリ上では 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00と逆さに入ってる
mov eax, [esi+0]; // eaxが 0x10000000
// eaxには1が入って欲しいのですが無理なのでしょうか?
普通の感覚から考えてビックエンディアンが良いと思うのですが、
リトルエンディアンは何に便利なのでしょうか?
No.7ベストアンサー
- 回答日時:
やりたいことを Cで記述しその部分にブレークポインタを設定、実行します
ブレークしたら 表示 > デバッグウィンドウ > 混合モード
で アセンブラコードとソースが一度に参照できます
コンパイラがどのようなコードを吐いているの確認してみましょう
ポインタなら その中身は何処かのアドレスを挿しています
引数の配列なら Cではポインタで渡されます
mov命令でレジスタに設定できます
リスティングファイルでアセンブラファイルを作ってしまうなんて方法もあります
プロジェクト > 設定 > C++タブ > カテゴリ-> リスティングファイル
で設定できます
No.6
- 回答日時:
#3のzwiです。
>x自体がポインタだからと思います。
>そう理解してよいでしょうか?
そうです。
mov esiは、メモリから値(この場合はポインタ値)をesiレジスタにロードする命令です。
lea esiは、アドレスを計算してesiレジスタにロードする命令です。
ポインタの場合は上記を、変数を直接参照する場合は下記の命令を使います。
ここで例を挙げてみます。
int a[2];
と書かれていた場合と
int b[2];
int *a = b;
と書かれた場合ですが、C言語での値の取り出しはどちらもa[0]で取り出せますよね。
しかしアセンブラでは違いを意識しないといけません。
a変数からアクセスをする場合、上記はlea、下記はmovを使うことになります。
No.4
- 回答日時:
リトルエンディアン:ビッグエンディアンよりすぐれた方式。
ビッグエンディアン:リトルエンディアンよりすぐれた方式。
No.3
- 回答日時:
リトルエンディアンのメリットですか?
そもそもは設計思想の違いとしか言いようが無いですね。
リトルエンディアンは、小さい桁の数値を小さいアドレスから書くべきだという考え方で設計されています。これはソフト的な思想ではなくハード設計者の思想です。
一度そういう思想で設計しちゃったら同じ会社でCPUを作る限り続けるしかないわけです。前のCPUで作ったデータの読み書きで困りますからね。インテルだと初期の8ビットCPUの8008がそういう設計思想でした。そこから今の64ビットCPUまで延々と続いているんです。
特徴としては、元の格納データサイズを知らずにデータを取り出せることでしょうか?
例えば、0x12345678という値はメモリ上では、
0x78 0x56 0x34 0x12
と格納されています。
下位1バイトを取り出すと、0x78と言う下位データが取り出せます。
下位2バイトを取り出すと、0x5678と言う下位2バイトのデータが取り出せます。
これはビックエンディアンでは、元々の格納長を知らなければ取り出せません。4バイトと知っていて始めて取り出せるのです。
何に使えるか?って聞かれると困るんですけどね(^^ゞ
No.2
- 回答日時:
インテル系x86 CPUでしたら
esiが配列 aを取得できているのであれば
mov eax,[esi+0];
で eaxは 1が格納されます
ただ mov命令で esiに 配列aの先頭アドレスを取得できません
やるなら leaなどのLoad系の命令を使います
lea esi, a;
といった具合です
>ただ mov命令で esiに 配列aの先頭アドレスを取得できません
>やるなら leaなどのLoad系の命令を使います
大域変数の場合、
lea esi, a
でうまくいきました。
関数で配列のポインタを使う場合
void test(const int x[])
の場合は、
mov esi, x
でないと、うまくいきません。
x自体がポインタだからと思います。
そう理解してよいでしょうか?
最初の1が取得できない件は、指すアドレスが間違っていて、たまたま指しているデータが0x1000000でした。すみませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- その他(SNS・コミュニケーションサービス) ゲームでボイスチャットを使いたいんですが、親にどう説明したらいいですか 2 2022/08/03 14:07
- その他(プログラミング・Web制作) プログラムについて。 2 2022/04/07 18:48
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- その他(パソコン・周辺機器) iPhone→ PC取り込んだHDR動画が白くなってる 1 2023/07/24 22:55
- Mac OS MacのFinderでmovファイルのサムネイルが表示されないのと、クイックルックが出来ません。 こ 3 2023/07/24 18:40
- USBメモリー・SDカード・フラッシュメモリー SDカードの写真データ 何処に行った? 2 2023/07/17 20:29
- CPU・メモリ・マザーボード PCのメモリは4GBX2枚と 4+8GBはどちらがお勧めですか? 4 2023/07/06 08:21
- CPU・メモリ・マザーボード Dell製ノートパソコンのメモリ増設についてです! 6 2023/06/10 21:31
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
【お題】 ・ありそうだけど、絶対に無いことわざを教えてください。
-
集合写真、どこに映る?
あなたが集合写真を撮られるとき、画角のどのあたりにいることが多いですか? 私は振り返ってみると右の端にいることが多い気がします。
-
【穴埋めお題】恐竜の新説
【大喜利】 考古学者が発表した衝撃の新説「恐竜は、意外にもそのほとんどが〇〇〇」 (〇〇〇に入る部分だけを回答して下さい)
-
そもそも何故、2つのエンディアンが存在するのでしょう?
その他(パソコン・周辺機器)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
TCHAR文字列内の検索について
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
【C言語】別関数でポインタの値...
-
構造体についての問題なんですが
-
リトルエンディアンというもの...
-
構造体の中の構造体
-
ハンドルはポインタか
-
C++ vectorのbeginについて
-
型変換について
-
連結リスト 要素の入れ替え
-
関数ポインタの利点
-
PCと連動するレーザポインタ
-
#define NULL ((void *)0) の弊害
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
ExcelVBAでのkernel32(64bit)
-
C言語でのconstを返す関数
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
CImage GetBitsメソッドについて
-
C++で関数ポインタから関数名を...
-
Cで作成したDLL関数をVBから呼...
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
TCHAR文字列内の検索について
-
c言語で任意のファイルから読み...
-
デバイスハンドルとは?
おすすめ情報