- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了一个将输入打印到标准输出的 c 程序。然后我把它转换成汇编语言。顺便说一句,我使用的是 AT&T 语法。
这是简单的 C 代码。
#include <stdio.h>
int main()
{
int c;
while ((c = getchar ()) != EOF)
{
putchar(c);
}
return 0;
}
int c 是局部变量。
然后我把它转换成汇编语言。
.file "question_1.c"
.text
.globl main
.type main, @function
//prolog
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $20, %esp // we add 20 bytes to the stack
jmp .L2
.L3:
subl $12, %esp
pushl -12(%ebp)
call putchar
addl $16, %esp
.L2:
call getchar
movl %eax, -12(%ebp)
cmpl $-1, -12(%ebp)
jne .L3
//assumption this is the epilog
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.9.4-2ubuntu1) 4.9.4"
.section .note.GNU-stack,"",@progbits
通常在 epilog 中我们应该添加 20,因为在 prolog 中我们减去 20。那么堆栈框架还在那里吗?还是我错过了一个关键点?
我还有一个关于 main 函数的问题。通常函数通常被“调用”,但它发生在汇编代码中的什么地方?
提前谢谢你。
最佳答案
就在main
标签之后,leal 4(%esp), %ecx
在%ecx
中保存了四个加上堆栈指针。在例程结束时,leal -4(%ecx), %esp
将比保存值少 4 的值写入堆栈指针。这直接恢复了原始值,而不是通过添加减去的量来完成。
关于c - stackframe 不会从堆栈中删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493372/
我编写了一个将输入打印到标准输出的 c 程序。然后我把它转换成汇编语言。顺便说一句,我使用的是 AT&T 语法。 这是简单的 C 代码。 #include int main() { int c;
我正在考虑使用类似 StackFrame stackFrame = new StackFrame(1) 的东西来记录执行方法,但我不知道它对性能的影响。堆栈跟踪是在每次方法调用时构建的东西,所以性能不
我有一个 IEnumerable frames用于存储一些自定义 StackFrame。我想将其转换为 StackTrace.ToString() 之类的字符串类型格式。例如: at TestS
这是我的代码: public class UserPreferences { /// /// The EMail signature. /// [UserPrefe
我在我的 ASP.NET Web 应用程序中使用以下方法来接收异常的堆栈跟踪: public static void getStackTraceInfo(System.Diagnostics.Stac
在我的日志记录模块中有一行: MethodBase methodBase = new StackFrame(2, false).GetMethod(); 我检查的方法是泛型方法,定义为T[] MyMe
我写了一个方法 Assert(): [System.Diagnostics.Conditional("DEBUG")] internal static void Assert(bool conditi
我正在开发一些内部日志记录框架,为了性能起见,懒惰地获取 StackFrame 似乎是个好主意。我想使用此 StackFrame 获取我的日志记录框架之外的第一个方法。 我最初的想法是这样的: usi
写题目的时候碰到的其他一些最相关的帖子...导致 MSDN http://msdn.microsoft.com/en-us/library/system.reflection.parameterinf
目标是根据调用我的方法的类型创建一个通用实例。 问题是,当从泛型调用时,StackFrame 似乎只包含开放定义类型参数,而不是封闭定义类型参数。如何从 StackFrame 获取类型参数?类似于 t
我正在尝试编写一个将信号实现为 xv6 的程序 我已经弄清楚如何操纵堆栈(我认为),但我只是无法恢复它。这是我的信号传递代码: 此函数将信号帧添加到进程堆栈并保存 volatile 寄存器 void
我通过在 StackFrameStream 上使用 walk 方法得到了一个 StackFrames 列表。但我只需要找到前 3 个 stackFrames。 我有 StackFrameStream
目前,我通过 StackFrame 来获取当前文件/行号: Log.Message(new StackFrame(0, true), "FAILED to start cooling."); Log
这其实挺难处理的,有人暗示我这不正常? 我继承了这个项目,所以我想也许在我看不到的地方设置了一个标志 这是我的一个异常(exception)的片段: 27 libswiftCore.dyli
我正在关注 Memory Layout And The Stack理解栈帧.. 作者很好地解释了堆栈帧并说明了在给定时间点堆栈中的内容 他还在下面问了一些问题 假设一个程序进行了 5 次函数调用。堆栈
如果我只是想执行以下操作以查看是什么调用了我, var st = new StackTrace(); var callingMethod = st.GetFrame(1).GetMethod() 只购
我看到在 .NET 中实现登录时使用 StackFrame 和 MethodBase 的两个独立代码。 我知道 MethodBase 类提供有关方法和构造函数及其来源的信息。 StackFrame 表
我是一名优秀的程序员,十分优秀!