关于汇编用法--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

原文地址:https://www.cnblogs.com/strive-sun/p/11897920.html