标签: stack-frame

在C#中获取带扩展名的类名?

我试图在我的代码中使用扩展名(例如Employee.cs或Employee.aspx.cs)获取类名.我能够获得没有扩展名的类的名称,但是有人知道我怎么能得到类的扩展?

这就是我为了获得类名而做的事情:

var frame = new StackFrame(1);
string className = frame.GetMethod().ReflectedType.Name;
Run Code Online (Sandbox Code Playgroud)

.net c# reflection class stack-frame

0
推荐指数
1
解决办法
578
查看次数

函数调用的返回值是什么,如果该函数没有提供一个函数

假设我们有以下代码:

int func(char str[], int len) {
    // Don't return anything here.
}

int main() {
    char str[] = "Hello";
    int result = func(str, strlen(str));
    printf("%d\n", result);
}
Run Code Online (Sandbox Code Playgroud)

它会在我的电脑上打印一些字符串值-1679929632.当我执行时,它会不时变化.

谁能解释为什么会这样?

c stack-frame

0
推荐指数
1
解决办法
522
查看次数

函数序言中的“mov rbp, rsp”

push   rbp
mov    rbp, rsp
mov    DWORD PTR [rbp-0x4],edi
Run Code Online (Sandbox Code Playgroud)

在汇编函数序言中,不是push rbp已经将其值移到了rsp?为什么mov rbp, rsp指令再次移动相同的rsprbp?是必要的还是多余的?

x86 assembly callstack stack-frame

0
推荐指数
1
解决办法
3567
查看次数

程序如何知道在堆栈上为局部变量分配多少空间?

在这个简单的函数中,为局部变量分配了空间。然后,变量被初始化并被printf调用以输出它们。

000000000040056a <func>:
  40056a:       55                      push   rbp                     ; function prologue
  40056b:       48 89 e5                mov    rbp,rsp                 ; function prologue
  40056e:       48 83 ec 10             sub    rsp,0x10                ; deallocating space for local variables
  400572:       8b 4d fc                mov    ecx,DWORD PTR [rbp-0x4] ; variable initialization
  400575:       8b 55 f8                mov    edx,DWORD PTR [rbp-0x8] ; variable initialization
  400578:       8b 45 f4                mov    eax,DWORD PTR [rbp-0xc] ; variable initialization
  40057b:       89 c6                   mov    esi,eax                 ; string stuff
  40057d:       bf 34 06 40 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 stack-frame

0
推荐指数
1
解决办法
843
查看次数

alloca() 如何与其他堆栈分配交互?

让我们从一个简单的堆栈分配示例开始:

void f() {
    int a, b;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的话。a那么和的地址b与栈基址(即寄存器 )有固定的偏移量ebp。如果我们以后需要它们,这就是编译器找到它们的方式。

但请考虑以下代码。

void f(int n) {
    int a;
    alloca(n);
    int b;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果编译器不做任何优化,堆栈将为a->n->b. 现在 的偏移量b取决于n。那么编译器做了什么?

模仿alloca() 在内存级别如何工作?。我尝试了以下代码:

#include <stdio.h>
#include <alloca.h>

void foo(int n)
{
    int a;
    int *b = alloca(n * sizeof(int));
    int c;
    printf("&a=%p, b=%p, &c=%p\n", (void *)&a, (void *)b, (void *)&c);
}

int main()
{
    foo(5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是&a=0x7fffbab59d68, b=0x7fffbab59d30, …

c x86 alloca stack-frame

0
推荐指数
1
解决办法
182
查看次数

标签 统计

stack-frame ×5

x86 ×3

assembly ×2

c ×2

.net ×1

alloca ×1

c# ×1

callstack ×1

class ×1

reflection ×1

x86-64 ×1