-
-
[旧帖]
[求助]PUSH 指令6A与68。
0.00雪花
-
发表于:
2010-10-16 10:47
7052
-
[旧帖] [求助]PUSH 指令6A与68。
0.00雪花
今天在学win32汇编的push指令时,发现有时指令占2字节,有时占5字节。
对照源码与机器码发现,有时操作数被翻译成1字节,有时操作数被翻译成4字节。为什么会这样?
地址| 机器码| 汇编源码
00401047 6A 30 push 30
00401049 68 30010000 push 130
0040104E 68 FF000000 push 0FF
00401053 68 FE000000 push 0FE
00401058 68 9F000000 push 9F
0040105D 68 99000000 push 99
00401062 6A 10 push 10
00401064 6A 50 push 50
00401066 6A 60 push 60
00401068 6A 70 push 70
0040106A 68 80000000 push 80
0040106F 6A 79 push 79
00401071 6A 7B push 7B
00401073 6A 7F push 7F
00401075 68 80000000 push 80
0040107A 6A FF push -1
0040107C 6A 81 push -7F
0040107E 6A 80 push -80
00401080 68 77FFFFFF push -89
00401085 68 7FFFFFFF push -81
从上面对照可以看出一些端倪吧。
我的猜想:
1) 为了精简机器码字节数,所以将大小在一个字节的操作数单独提供一个指令 6A。这一个字节的最高位是符号位。那么实际上能表示的数范围是(-128,+127)。
2)对于超过上面提到的一个字节范围的数,则操作数被按符号位扩展成32位的操作数。
3)当执行如下指令时,-1会被按符号位扩展成32位数放入栈中。
0040107A 6A FF push -1
执行后,栈顶是:FFFFFFFF。
以上经验证后,似乎正确。不过还请大牛们帮忙确认一下。是不是我猜想的那样?
另外,我有个疑问:
为什么不再搞个操作数是一个字的16位的操作数呢?(在32位机下)
才学习汇编,请大家多指教。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课