ida arm64 base function

文章详细解析了C++中的三个内存操作函数:memcpy、memmove和mem_cmp的汇编代码实现,包括它们的参数处理、条件判断和循环结构,有助于理解底层内存操作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__int64 __fastcall memmove(__int64 a1, __int64 a2, unsigned __int64 a3)
{
  unsigned __int64 v5; // x3
  unsigned __int64 v6; // x5
  unsigned __int64 v7; // x1
  __int64 i; // x0

  if ( a1 - a2 >= a3 )
    return memcpy(a1, a2, a3);
  v5 = a1 + a3;
  v6 = a2 + a3;
  v7 = a1 + ~(a1 + a3);
  for ( i = 0i64; v7 != --i; *(_BYTE *)(v5 + i) = *(_BYTE *)(v6 + i) )
    ;
  return a1;
}

ROM:000000008001A14C ; =============== S U B R O U T I N E =======================================
ROM:000000008001A14C
ROM:000000008001A14C
ROM:000000008001A14C memmove                                 ; CODE XREF: sub_8001BD10+60↓p
ROM:000000008001A14C                 SUB             X6, X0, X1
ROM:000000008001A150                 MOV             X4, X0
ROM:000000008001A154                 CMP             X6, X2
ROM:000000008001A158                 B.CC            loc_8001A160
ROM:000000008001A15C                 B               memcpy
ROM:000000008001A160 ; ---------------------------------------------------------------------------
ROM:000000008001A160
ROM:000000008001A160 loc_8001A160                            ; CODE XREF: memmove+C↑j
ROM:000000008001A160                 ADD             X3, X0, X2
ROM:000000008001A164                 ADD             X5, X1, X2
ROM:000000008001A168                 MVN             X1, X3
ROM:000000008001A16C                 ADD             X1, X0, X1
ROM:000000008001A170                 MOV             X0, #0
ROM:000000008001A174
ROM:000000008001A174 loc_8001A174                            ; CODE XREF: memmove+44↓j
ROM:000000008001A174                 SUB             X0, X0, #1
ROM:000000008001A178                 CMP             X1, X0
ROM:000000008001A17C                 B.NE            loc_8001A188
ROM:000000008001A180                 MOV             X0, X4
ROM:000000008001A184                 RET
ROM:000000008001A188 ; ---------------------------------------------------------------------------
ROM:000000008001A188
ROM:000000008001A188 loc_8001A188                            ; CODE XREF: memmove+30↑j
ROM:000000008001A188                 LDRB            W2, [X5,X0]
ROM:000000008001A18C                 STRB            W2, [X3,X0]
ROM:000000008001A190                 B               loc_8001A174
ROM:000000008001A190 ; End of function memmove
ROM:000000008001A190
ROM:000000008001A194

ROM:000000008001A12C ; =============== S U B R O U T I N E =======================================
ROM:000000008001A12C
ROM:000000008001A12C
ROM:000000008001A12C memcpy                                  ; CODE XREF: read_otp_param+A0↑p
ROM:000000008001A12C                                         ; read_otp_param+118↑p ...
ROM:000000008001A12C                 MOV             X3, #0
ROM:000000008001A130
ROM:000000008001A130 loc_8001A130                            ; CODE XREF: memcpy+1C↓j
ROM:000000008001A130                 CMP             X2, X3
ROM:000000008001A134                 B.NE            loc_8001A13C
ROM:000000008001A138                 RET
ROM:000000008001A13C ; ---------------------------------------------------------------------------
ROM:000000008001A13C
ROM:000000008001A13C loc_8001A13C                            ; CODE XREF: memcpy+8↑j
ROM:000000008001A13C                 LDRB            W4, [X1,X3]
ROM:000000008001A140                 STRB            W4, [X0,X3]
ROM:000000008001A144                 ADD             X3, X3, #1
ROM:000000008001A148                 B               loc_8001A130
ROM:000000008001A148 ; End of function memcpy
ROM:000000008001A148

__int64 __fastcall memcpy(__int64 result, __int64 a2, __int64 a3)
{
  __int64 i; // x3

  for ( i = 0i64; a3 != i; ++i )
    *(_BYTE *)(result + i) = *(_BYTE *)(a2 + i);
  return result;
}

ROM:000000008001A0F8 ; =============== S U B R O U T I N E =======================================
ROM:000000008001A0F8
ROM:000000008001A0F8
ROM:000000008001A0F8 mem_cmp                                 ; CODE XREF: sub_80005584+98↑p
ROM:000000008001A0F8                                         ; sub_800056B4+88↑p ...
ROM:000000008001A0F8                 MOV             X4, #0
ROM:000000008001A0FC
ROM:000000008001A0FC loc_8001A0FC                            ; CODE XREF: mem_cmp+28↓j
ROM:000000008001A0FC                 CMP             X2, X4
ROM:000000008001A100                 B.NE            loc_8001A10C
ROM:000000008001A104                 MOV             W0, #0
ROM:000000008001A108                 RET
ROM:000000008001A10C ; ---------------------------------------------------------------------------
ROM:000000008001A10C
ROM:000000008001A10C loc_8001A10C                            ; CODE XREF: mem_cmp+8↑j
ROM:000000008001A10C                 LDRB            W3, [X0,X4]
ROM:000000008001A110                 ADD             X4, X4, #1
ROM:000000008001A114                 ADD             X5, X1, X4
ROM:000000008001A118                 LDURB           W5, [X5,#-1]
ROM:000000008001A11C                 CMP             W3, W5
ROM:000000008001A120                 B.EQ            loc_8001A0FC
ROM:000000008001A124                 SUB             W0, W3, W5
ROM:000000008001A128                 RET
ROM:000000008001A128 ; End of function mem_cmp
ROM:000000008001A128

__int64 __fastcall mem_cmp(__int64 a1, __int64 a2, __int64 a3)
{
  __int64 v3; // x4
  int v5; // w3
  int v6; // w5

  v3 = 0i64;
  do
  {
    if ( a3 == v3 )
      return 0i64;
    v5 = *(unsigned __int8 *)(a1 + v3++);
    v6 = *(unsigned __int8 *)(a2 + v3 - 1);
  }
  while ( v5 == v6 );
  return (unsigned int)(v5 - v6);
}

ROM:000000008001A0DC
ROM:000000008001A0DC ; =============== S U B R O U T I N E =======================================
ROM:000000008001A0DC
ROM:000000008001A0DC
ROM:000000008001A0DC mem_set                                 ; CODE XREF: sub_800040BC+20↑p
ROM:000000008001A0DC                                         ; read_otp_param+100↑p ...
ROM:000000008001A0DC                 MOV             X3, #0
ROM:000000008001A0E0
ROM:000000008001A0E0 loc_8001A0E0                            ; CODE XREF: mem_set+18↓j
ROM:000000008001A0E0                 CMP             X2, X3
ROM:000000008001A0E4                 B.NE            loc_8001A0EC
ROM:000000008001A0E8                 RET
ROM:000000008001A0EC ; ---------------------------------------------------------------------------
ROM:000000008001A0EC
ROM:000000008001A0EC loc_8001A0EC                            ; CODE XREF: mem_set+8↑j
ROM:000000008001A0EC                 STRB            W1, [X0,X3]
ROM:000000008001A0F0                 ADD             X3, X3, #1
ROM:000000008001A0F4                 B               loc_8001A0E0
ROM:000000008001A0F4 ; End of function mem_set
ROM:000000008001A0F4
ROM:000000008001A0F8

__int64 __fastcall mem_set(__int64 result, char a2, __int64 a3)
{
  __int64 i; // x3

  for ( i = 0i64; a3 != i; ++i )
    *(_BYTE *)(result + i) = a2;
  return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值