为什么推后缀只允许2和8个字节的值?

时间:2020-08-29 20:59:30

标签: assembly x86 x86-64

我注意到只允许对8字节或2字节的值执行push。例如:

push $5 # same as pushq
# sub  $8, %rsp
# movq $5,(%rsp)

或者:

pushw $3
# sub  $2, %rsp
# movw $3,(%rsp)

并使用gdb确保堆栈看起来正确:

>>> x/5hd $rsp
0x7fffffffe426: 3   5   0   0   0

但是,所有其他后缀都给我:

错误:“ push”的指令后缀无效

为什么push只允许使用64位或16位值?使用sub...mov来更具体是常见的做法,还是那是一种反模式?最后,CPU是将push解释为与sub...mov指令一样,还是它们完全是两个不同的东西(产生相同的结果)?

0 个答案:

没有答案