
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
ポインタについて
-
デバイスハンドルとは?
-
ExcelVBAでのkernel32(64bit)
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
別のDLLのダイアログを・・・
-
LPSTR型の初期化について
-
アプリを32bitから64bit移行
-
リトルエンディアンというもの...
-
c言語のエラーについて
-
アドレス値はどの型にキャスト...
-
C++とWIN32APIとゲームプログラ...
-
ReadFileの読み込みエラーについて
-
NULLと’\\0’のNULL文字は違うも...
-
Excel VBAで絶対アドレスのメモ...
-
プーさんのマウスポインタを教...
-
C言語の文字列?処理 strcpyやl...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
init関数の意味
-
セグメントエラー
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
C言語でのconstを返す関数
-
C++で関数ポインタから関数名を...
-
パスからファイル名を抽出
-
ReadFileの読み込みエラーについて
-
#define NULL ((void *)0) の弊害
-
CImage GetBitsメソッドについて
-
ポインタ変数の疑問
-
Cで作成したDLL関数をVBから呼...
おすすめ情報