关于汇编用法--1

Posted strive-sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于汇编用法--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

 

以上是关于关于汇编用法--1的主要内容,如果未能解决你的问题,请参考以下文章

关于汇编call指令的请教

Java中枚举的写法和用法

c_cpp 加载源图像固定用法(代码片段,不全)

win32汇编中nmake用法

汇编语言段和RSEG用法

RSEG用法和汇编问号的涵义