码迷,mamicode.com
首页 > 其他好文 > 详细

关于汇编用法--1

时间:2019-11-20 15:32:29      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:选择   net   stack   href   查看   最大   结果   没有   --   

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

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

 

关于汇编用法--1

标签:选择   net   stack   href   查看   最大   结果   没有   --   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!