push和pushl的区别

AT&T汇编中,命令中可以指定操作范围,如pushb是将一个byte压栈,而pushw就是将一个word压栈,同样pushl就是压栈long(也就是双字)。
%esp指的是esp寄存器,已知是双字;而0xfffffff8(�p)指的是一个内存空间,所以要用pushl来指明那里存放的是一个双字。

当要压栈的对象已经确定(也就是说已经知道是字节、字或者双字),那么使用push就不会产生歧义,也就是说汇编器可以自己判断自己要操作的是什么长度的操作对象;但是当汇编器不能自己判断操作对象长度时,就需要使用pushl之类的指令来指明操作对象长度;
%ebp指的是esp寄存器,这是一个32位的寄存器,汇编器是知道这个寄存器存放的是dword,不需要显式的指明也没有歧义;而 0xfffffff8(�p)是使用基址寻址方式指向的一个内存空间,内存是连续的,汇编器不能仅仅根据一个内存地址就判断出那里存放的数据的长度,所以直接这样写就会产生歧义,所以要使用pushl之类的指令来指明要操作的数据的长度;

其实说白了:pushl就相当于intel汇编中的push dword;

错误例子:"push 01h";nasm汇编器会提示一个警告。
正确例子:Intel格式的"push dword 01h"或者AT&T格式的"pushl 01h";

http://blog.sina.com.cn/s/blog_6345fbdd0101gl87.html


你可能感兴趣的:(汇编)