[解決済み] インテルアセンブリの%ripレジスタを理解する
2022-03-01 13:52:32
質問
構造体のサイズとデータを正しく配置するためのすべての可能性についての別の記事で説明した次の小さなコード、に関して。
struct
{
char Data1;
short Data2;
int Data3;
char Data4;
} x;
unsigned fun ( void )
{
x.Data1=1;
x.Data2=2;
x.Data3=3;
x.Data4=4;
return(sizeof(x));
}
対応する逆アセンブルを取得します(64ビットで)。
0000000000000000 <fun>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # b <fun+0xb>
b: 66 c7 05 00 00 00 00 movw $0x2,0x0(%rip) # 14 <fun+0x14>
12: 02 00
14: c7 05 00 00 00 00 03 movl $0x3,0x0(%rip) # 1e <fun+0x1e>
1b: 00 00 00
1e: c6 05 00 00 00 00 04 movb $0x4,0x0(%rip) # 25 <fun+0x25>
25: b8 0c 00 00 00 mov $0xc,%eax
2a: 5d pop %rbp
2b: c3 retq
と思われる右側の項をどう計算すればいいのかわかりません。
address of local variables
を使用します。しかも、それを
%rip register
との関連がわかるような例を教えてください。
%rip
と
%rsp
または
%rbp
特にアドレスの計算で
move
という命令があります。
解決方法は?
RIPアドレス指定は、常にRIP(64bit命令ポインタ)レジスタに対する相対アドレスです。そのため、グローバル変数にのみ使用することができます。オフセット0は、RIPアドレス指定命令の次の命令のアドレスに等しくなります。例えば、以下のようになります。
mov al,[rip+2] al=53
jmp short next (length=2 bytes)
db 53
next:
mov bl,[rip-7] (length=6 bytes) bl=53
通常は、即時性を除いて、コードにデータをそのまま混ぜることはないでしょうが、これは、非常に小さなオフセットで実際にコードを実行した場合にどうなるかを示しています。
あなたのコードでは、オフセットを確認することができません(4つのゼロが表示されます)。
.o
. 使用方法
objdump -drwC
は、ディスアセンブル時にシンボル名や再配置を表示するために使用します。 これらは、このオブジェクトを実行ファイルにリンクする際に、リンカーによって埋められます。
rbpから相対的にローカルにアクセスする例です。
push rbp ;save rbp
mov rbp,rsp ;rbp = pointer to return address (8 bytes)
sub rsp,64 ;reserve 64 bytes for local variables
mov rax,[rbp+8]; rax = the last stack-passed qword parameter (if any)
mov rdx,[rbp]; rdx = return address
mov rcx,[rbp-8]; rcx = first qword local variable (this is undefined now)
mov r8, [rbp-16]; r8 = second qword local variable (this is undefined now)
.
.
mov rsp,rbp
pop rbp
ret
関連
-
[解決済み】バイナリーボム - フェーズ4
-
[解決済み] callq命令とは何ですか?
-
[解決済み] NASMでscanfを使うには?
-
[解決済み] objdumpの出力にあるdata16とはどういう意味ですか?
-
[解決済み] x86アセンブリの角括弧の意味は何ですか?
-
[解決済み] アセンブリの追加要求の明確化
-
[解決済み] cmp命令の理解
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み] gcc を使ってインテル構文のアセンブリコードを生成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Nasmエラー:オペコードとオペランドの無効な組み合わせ
-
[解決済み】MARIEアセンブリ言語で`Skipcond`はどのように動作しますか?
-
[解決済み] 着信側セーブレジスタ、発信側セーブレジスタとは何ですか?
-
[解決済み] 8086アセンブリ言語での2つのレジスタのスワッピング(16ビット)
-
[解決済み] BL命令ARM - その仕組み
-
[解決済み] アセンブリ言語 新規ライン
-
[解決済み] MIPSアセンブリ言語では、なぜ.globl mainを使うのですか?
-
[解決済み] MIPSプログラムにおける`lw`と`sw`の実際の働きを理解する。
-
[解決済み] アセンブルmov命令
-
[解決済み] MIPSのオペコードにおけるlaとliの違いは何ですか?