【Android 逆向】x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )





一、push / pop 入栈 / 出栈 指令



push / pop 入栈 / 出栈 指令 , 可以有如下选项 :

  • f : 表示 16 16 16 位标志位 , 下面列举几个常用的标志位 ;

    • C 对应 进位 位 , 此处指的是减法操作是否有借位 ;
    • P 对应 奇偶 位 , 运算结果 的 奇偶 , 检测结果最后一个位是 0 0 0 还是 1 1 1 ;
    • A 对应 辅助进位 位 , 32 32 32 位的整型中 , 低 16 16 16 位是否发生了 借位 或 进位 ;
    • Z 对应 零标志 , 如果 减法操作 最后的结果是 0 0 0 , 该 零标志位 会被设置成 1 1 1 , 如果 减法操作 结果不为 0 0 0 , 该 零标志位 会被设置成 0 0 0 ;
    • O 对应 溢出标志 , 减法操作是否会导致溢出 , 负数 - 负数 会出现溢出 ;
    • S 对应 符号标志位 , 计算结果如果是负数 , 该标志位设置成 0 0 0 , 计算结果如果是正数 , 该标志位设置成 1 1 1 ;
  • fd : 表示 32 32 32 位标志位 ;

  • fq : 表示 64 64 64 位标志位 ;

  • a : 表示 16 16 16 位的通用寄存器 ;

  • ad : 表示 32 32 32 位的通用寄存器 ;





二、ret / retn 函数调用返回指令



ret / retn 是 函数调用返回指令 ;

2 2 2 个指令的机器码都是相同的 ;





三、set 设置目标值指令



set 指令 用于 设置 目标值为 0 0 0 1 1 1 ;

set a eax

eax 是目标值 , 设置成 0 0 0 1 1 1 ;

上述代码中 a 表示无符号大于 , 如果 a 条件达成 , eax 设置为 1 1 1 , 如果不满足 , 则设置为 0 0 0 ;

  • a : above , 无符号 大于 跳转 ;

  • b : below , 吗无符号 小于 跳转 ;

  • g : great , 有符号 大于 跳转 ;

  • l : less , 有符号 小于 跳转 ;

  • e : equal , 等于 ;

  • n : negative , 反条件 ;

  • o : 对应 溢出标志 , 减法操作是否会导致溢出 ; ( 与运算不存在进位 , 没有溢出 )

  • p : 对应 奇偶 位 , 运算结果 的 奇偶 , 检测结果最后一个位是 0 0 0 还是 1 1 1 ;

  • s : 对应 符号标志位 , 计算结果如果是负数 , 该标志位设置成 0 0 0 , 计算结果如果是正数 , 该标志位设置成 1 1 1 ;

  • z : 对应 零标志 , 如果 与操作 最后的结果是 0 0 0 , 该 零标志位 会被设置成 1 1 1 , 如果 与操作 结果不为 0 0 0 , 该 零标志位 会被设置成 0 0 0 ;





总结



align 字节对齐 , db 声明字符 / 字符串 , nop 空指令
cmp 比较 , test 比较
call 子函数调用指令 , jmp 跳转指令 ( 可选参数 a , b , c , g , l , o , p , s , z , e , n)
lea 加载指令 , lds , les , lfs , lgs , lss , mov 数据传送指令
push , pop , pushf , popf , pushd , popd , pushad , popad , pusha , popa
ret , retn , set
add , sub , mul , div
xor , not , shl , shr , sal , sar , rol , ror , rcl , rcr

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用NOAA日出日落算法计算日出和日落时间的示例代码: ```python import datetime import math def calculate_julian_day(year, month, day): if month <= 2: year -= 1 month += 12 A = math.floor(year / 100) B = 2 - A + math.floor(A / 4) julian_day = math.floor(365.25 * (year + 4716)) + math.floor(30.6001 * (month + 1)) + day + B - 1524.5 return julian_day def calculate_sunrise_sunset(latitude, longitude, date): julian_day = calculate_julian_day(date.year, date.month, date.day) n = julian_day - 2451545.0 + 0.0008 Jc = n / 36525.0 Jd = 2451545.0 + 0.0009 + Jc M = (357.5291 + 0.98560028 * (Jd - 2451545.0)) % 360 L = (280.46646 + 0.98564736 * (Jd - 2451545.0)) % 360 ec = 0.016708634 - 0.000042037 * Jc C = (1.914602 - 0.004817 * Jc - 0.000014 * Jc**2) * math.sin(math.radians(M)) + (0.019993 - 0.000101 * Jc) * math.sin(math.radians(2 * M)) + 0.000289 * math.sin(math.radians(3 * M)) true_longitude = L + C omega = 125.04 - 1934.136 * Jc lambda_sun = true_longitude - 0.00569 - 0.00478 * math.sin(math.radians(omega)) epsilon = 23.439291 - 0.0130042 * Jc sin_alpha = math.cos(math.radians(epsilon)) * math.sin(math.radians(lambda_sun)) cos_alpha = math.sqrt(1 - sin_alpha**2) alpha = math.degrees(math.atan2(sin_alpha, cos_alpha)) hour_angle = math.degrees(math.acos((math.sin(math.radians(-0.83)) - math.sin(math.radians(latitude)) * math.sin(math.radians(alpha))) / (math.cos(math.radians(latitude)) * math.cos(math.radians(alpha))))) Jtransit = 2451545.0 + 0.0009 + ((hour_angle + longitude) / 360.0) + n delta_Jtransit = Jtransit - math.floor(Jtransit) Jset = Jtransit + (0.0053 * math.sin(math.radians(omega))) - (0.0069 * math.sin(2 * math.radians(lambda_sun))) delta_Jset = Jset - math.floor(Jset) Jrise = Jtransit - delta_Jtransit Jrise_next = Jrise + 1.0 sunrise_time = datetime.datetime.utcfromtimestamp((Jrise - 2451545.0) * 86400.0) sunset_time = datetime.datetime.utcfromtimestamp((Jset - 2451545.0) * 86400.0) return sunrise_time, sunset_time # 示例使用 latitude = 37.7749 # 纬度 longitude = -122.4194 # 经度 date = datetime.datetime(2022, 1, 1) # 日期 sunrise, sunset = calculate_sunrise_sunset(latitude, longitude, date) print("日出时间:", sunrise) print("日落时间:", sunset) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值