关于汇编用法–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 快捷键,调出反汇编代码

关于汇编用法--1

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

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

关于汇编用法--1

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

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

关于汇编用法--1

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

关于汇编用法--1

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

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

 

原文链接: https://www.cnblogs.com/strive-sun/p/11897920.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    关于汇编用法--1

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/405047

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:51
下一篇 2023年4月25日 下午4:52

相关推荐