Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory x86推送/弹出可以小于4字节吗? 我正在阅读弗吉尼亚大学的x86指南,它指出,推栈和弹出堆栈可以将一个4字节的数据元素删除或添加到堆栈中。p>_Memory_Assembly_X86_Stack - Fatal编程技术网

Memory x86推送/弹出可以小于4字节吗? 我正在阅读弗吉尼亚大学的x86指南,它指出,推栈和弹出堆栈可以将一个4字节的数据元素删除或添加到堆栈中。p>

Memory x86推送/弹出可以小于4字节吗? 我正在阅读弗吉尼亚大学的x86指南,它指出,推栈和弹出堆栈可以将一个4字节的数据元素删除或添加到堆栈中。p>,memory,assembly,x86,stack,Memory,Assembly,X86,Stack,为什么设置为4字节?这可以改变吗?你可以通过压缩更小的数据元素来节省堆栈上的内存吗 如果有人想查看指南,可在此处找到: 简短回答:是,16或32位。对于64位 堆栈的主要原因是从嵌套函数调用返回和保存/恢复寄存器值。它还通常用于传递参数和返回函数结果。除了最小的参数外,这些项目通常根据处理器的设计具有相同的大小,即指令指针寄存器的大小。对于8088/8086,它是16位。对于80386及其后续版本,它是32位。因此,让堆栈指令在其他大小上运行没有什么价值 还需要考虑内存总线上数据的大小。检索或存

为什么设置为4字节?这可以改变吗?你可以通过压缩更小的数据元素来节省堆栈上的内存吗

如果有人想查看指南,可在此处找到:
简短回答:是,16或32位。对于64位

堆栈的主要原因是从嵌套函数调用返回和保存/恢复寄存器值。它还通常用于传递参数和返回函数结果。除了最小的参数外,这些项目通常根据处理器的设计具有相同的大小,即指令指针寄存器的大小。对于8088/8086,它是16位。对于80386及其后续版本,它是32位。因此,让堆栈指令在其他大小上运行没有什么价值


还需要考虑内存总线上数据的大小。检索或存储单词所需的时间与检索或存储字节所需的时间相同。(除了有16位寄存器但有8位数据总线的8088)对齐也起作用。堆栈应该在字边界上对齐,这样每个值都可以作为一个内存操作进行检索。这种折衷通常是为了节省时间而不是节省内存。要传递一个字节作为参数,通常使用一个字。(或者,根据编译器可用的优化,将使用一个字大小的寄存器,完全避免堆栈。)

该语句仅在32位模式下适用,并且您还可以推送/弹出2字节元素。在x86-64中,您不能推送32位寄存器或存储在内存中的值,只有16位或64位寄存器和值存储在内存中
push-ax
push-rax
push-word[rax]
push-qword[rax]
都是有效的x86-64指令,但是
push-eax
push-dword[rax]
在x86-64中无效。历史注释,(很少使用)80188(16位字,8位数据总线)和(一度流行)386SX(32位字,16位数据总线)在数据总线大小不匹配方面与8088处于同一条船上。对于“堆栈应在字边界上对齐,以便每个值可以作为一个内存操作检索。”,这是否适用于函数中的局部变量?@Thomson。是的,编译器确实在堆栈和寄存器中排列局部变量,以便优化访问时间。通常不要求局部变量以任何顺序或不填充的方式排列在堆栈上。