Assembly 将非dword参数传递到堆栈会导致页面错误吗?

Assembly 将非dword参数传递到堆栈会导致页面错误吗?,assembly,stack,masm,page-fault,Assembly,Stack,Masm,Page Fault,我目前正在阅读Irvine第六版,以自学汇编,我在第277页(第8.2.2节“访问堆栈参数”,子标题“在堆栈上传递8位和16位参数”)上看到了这句话,它指出: 虽然您可以将16位操作数推送到堆栈上,但这样做会防止ESP在双字边界上对齐。可能会出现页面错误,运行时性能可能会降低 我知道,由于内存访问的粒度,未对齐的内存访问可能会导致性能问题,但我不明白为什么会出现页面错误。据我所知,当进程对虚拟内存中当前未加载到物理内存中的位置进行内存访问时,就会出现(硬)页面错误 一,。因此,引用是否表示堆栈可

我目前正在阅读Irvine第六版,以自学汇编,我在第277页(第8.2.2节“访问堆栈参数”,子标题“在堆栈上传递8位和16位参数”)上看到了这句话,它指出:

虽然您可以将16位操作数推送到堆栈上,但这样做会防止ESP在双字边界上对齐。可能会出现页面错误,运行时性能可能会降低 我知道,由于内存访问的粒度,未对齐的内存访问可能会导致性能问题,但我不明白为什么会出现页面错误。据我所知,当进程对虚拟内存中当前未加载到物理内存中的位置进行内存访问时,就会出现(硬)页面错误

一,。因此,引用是否表示堆栈可能同时存在于多个页面中,并且未对齐可能会使后续内存访问越过页面边界

二,。如果我已经回答了自己的问题,那么将堆栈大小分配为一页大小(即,在MASM中使用
.stack 4096
指令)是否会强制堆栈在一页上连续存在,从而消除此问题?或者堆栈可能仍然驻留在两个不同的页面上

三,。如果后者是真的,填充数据(建议这样做)不会仍然导致页面错误吗?例如:如果16字节变量为“val1”,我们希望访问它后面的一个dword,称为“val2”,堆栈位于两个页面中,页面与0x1000对齐:

填充后填充前

----------------                   ----------------
0x1002 |[val1]| 0x1002 |[PADDING]|
0x1000 |[val2高]| 0x1000 |[val1]|
--PG边界-----PG边界--
0x0FFE |[val2低]| PG故障!0x0FFE |[val2高]| PG故障!
0x0FFC |[无关]| 0x0FFC |[val2低]|
--------------------------------

谢谢大家!!(对于所有有条件的问题,我很抱歉,如果我想得太多了)