【发布时间】:2020-07-07 00:22:45
【问题描述】:
我正在 Windows 上学习汇编,并试图弄清楚堆栈中的值是什么。
Visual C++ documentation
表示 RSP 以上的值为:
- 分配空间
- 保存的 RBP
- 退货地址
- 注册家(RCX、RDX、R8、R9)
- 函数参数
问题是文档中没有提到的堆栈中有 32 个额外字节。
在memory snapshot RSP 中从 0x0000000000DAF5E0 开始。彩色框是:
- 黄色:两个 64 位变量,值为 9
- 白色:保存旧 RBP + 返回地址
- 蓝色:函数参数
- 绿色:注册主页
- 红色:?
那些红色的字节可能是什么?
使用 VS2019、MASM64 构建并在 x64 调试模式下运行的 MASM 源代码。
C++ 标志:/JMC /permissive- /GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc142.pdb" /Zc:inline /fp:precise /D" _DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /FC /Fa"x64\Debug\" /EHsc /nologo /Fo "x64\Debug\" /Fp"x64\Debug\ConsoleApplication1.pch" /diagnostics:column
.code
; int64_t StackFrameDemo_(int8_t a, int16_t b, int32_t c, int64_t d, int8_t e, int16_t f, int32_t g, int64_t h)
StackFrameDemo_ proc frame
; prolog
push rbp
.pushreg rbp
; allocate 16 bytes on the stack
sub rsp, 16
.allocstack 16
.endprolog
; save registers to register home
mov qword ptr [rbp+8], rcx
mov qword ptr [rbp+16], rdx
mov qword ptr [rbp+24], r8
mov qword ptr [rbp+32], r9
; save the two variables
mov rax, 9
mov [rsp], rax
mov [rsp+type qword], rax
nop ; set the break point here to view memory
; epilog
add rsp, 16 ; release local stack space
pop rbp ; restore caller's rbp register
ret
StackFrameDemo_ endp
end
【问题讨论】:
-
我没有阅读您的问题,但您是在谈论为溢出参数寄存器保留的空间吗? IIRC 被称为“归巢/阴影空间/区域”之类的东西。确实有据可查。
-
您的图片与您的描述完全不符。 x86 堆栈向下增长。另外,不要写入野指针,这是一个糟糕的主意。
-
@EOF:我很确定这段代码不是有意通过野指针 (RBP) 编写的;没有注意到导致混乱的错误。另请注意,描述从位于最低地址的事物开始,因此它以地址递增的顺序描述它,与增长顺序相反。我想这就是图表的绘制方式?注意到缺少 RBP 初始化后,我没有仔细检查;我认为这是唯一的问题。
标签: assembly x86-64 masm callstack stack-frame