zoukankan      html  css  js  c++  java
  • 关于汇编用法--1

    今天稍微熟悉了一点汇编语法,并就一个案例试验了一下

    VS里常见的汇编指令请见:https://blog.csdn.net/sinat_27382047/article/details/72810788

    我就目前一个api做解释

    CaptureStackBackTrace: 通过在堆栈上走动并记录每一帧的信息来捕获堆栈跟踪。

    CaptureStackBackTrace的第一个参数:FramesToSkip  => 从向后跟踪的开始要跳过的帧数 

    文档里面并没有说明这个参数的范围,其实这个参数范围是0-254,超过254将会返回0.

    下面最小的一个例子:

    #include <Windows.h>
    #include <assert.h>
    #include <stdio.h>
    
    __declspec(noinline) void CheckStack(void)
    {
        void* entireStack[USHRT_MAX];
        USHORT frameCount = CaptureStackBackTrace(255, USHRT_MAX, entireStack, NULL);
    }
    
    __declspec(noinline) void Test(int i)
    {
        if (i != 500)
            Test(++i);
        else
            CheckStack();
    }
    
    int main()
    {
        Test(0);
    }

    在 USHORT frameCount = CaptureStackBackTrace(255, USHRT_MAX, entireStack, NULL); 这行打断点

    编译运行,并按Alt+8 快捷键,调出反汇编代码

    可以看见汇编代码从CaptureStackBackTraces函数开始执行,接下来我按F11,在函数内运行,当运行到dword ptr这行时,我们会看到另外一个函数 -> RtlCaptureStackBackTrace,其实 CaptureStackBackTraces的内部是调用RtlCaptureStackBackTrace。

    所以到继续F11,会跳到RtlCaptureStackBackTrace函数内部,见下图

    注:cmp:比较大小指令,结果用来设置标志位。

    我们可以看见cmp  esi,0FEh  esi是寄存器,里面用来存放数据,我们查看esi里面的数据是255(鼠标右键esi,选择QuickWatch),见下图

    我们就可以看到当输入的参数超过254,返回值会为0

    最终我们可以知道FramesToSkip的size最大不能超过254。

    关于CaptureStackBackTrace的源代码可以参考:https://blog.csdn.net/pureman_mega/article/details/79006874

  • 相关阅读:
    扫盲如何在ECLIPSE中使用条件断点
    春困
    气虚咳喘案
    知足老师论糖尿病
    辨痰之病位与寒热
    常用中药功效比较(任之堂)
    女子全身窜痛案
    小儿外感案
    紫斑案
    读任之堂中药讲记笔记
  • 原文地址:https://www.cnblogs.com/strive-sun/p/11897920.html
Copyright © 2011-2022 走看看