所以...我有这个test.S文件,他在那里获得以下参数:asm3(0xcdc485c1,0xd6bd5e88,0xe4c1548d)
代码:
```asm3:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: xor eax,eax
<+5>: mov ah,BYTE PTR [ebp+0x8]
<+8>: shl ax,0x10
<+12>: sub al,BYTE PTR [ebp+0xe]
<+15>: add ah,BYTE PTR [ebp+0xc]
<+18>: xor ax,WORD PTR [ebp+0x10]
<+22>: nop
<+23>: pop ebp
<+24>: ret```
我想知道例如0xcdc485c1(ebp + 0x8)会发生什么,因为它有1个以上的字节吗?它只会得到有效字节吗?否则将整个存储,如果是,为什么?而且,如果您也知道,那么“ ebp + 0xe”在哪里,它不是参数表吗?
在函数的<+3>
处,堆栈如下所示:
0 1 2 3 byte offsets
+ 0x10 | 8d 54 c1 e4 |
+ 0x0c | 88 5e bd d6 |
+ 0x08 | c1 85 dc cd |
+ 0x04 | return |
ebp + 0x00 | prev. ebp |
堆栈上有五个DWORD(32位值),每个DWORD的顺序为小端顺序。
无论出于何种原因,下面的代码都只从堆栈中选择了几个字节,并选择了一个WORD(16位),因此它使用了三个DWORD参数的一部分。
FWIW:shl ax, 0x10
看起来像是将ax
设置为零的漫长方式。