1. ホーム
  2. assembly

[解決済み] インテルアセンブリの%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