(Что произойдет, если BYTE PTR [ebp + 0x8] получит параметр больше 1 байта? Например, 0xcdc485c1 - PullRequest
0 голосов
/ 07 апреля 2020

Итак ... У меня есть этот файл 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», это не paremeter или это?

1 Ответ

1 голос
/ 07 апреля 2020

При <+3> в функции стек выглядит следующим образом:

               0  1  2  3   byte offsets
     + 0x10 | 8d 54 c1 e4 |
     + 0x0c | 88 5e bd d6 |
     + 0x08 | c1 85 c4 cd |
     + 0x04 | return      |
 ebp + 0x00 | prev. ebp   |

, где в стеке пять DWORD (32-битных значений), каждый в обычном порядке с прямым порядком байтов.

По какой-то причине следующий код выбирает всего несколько байтов из стека и одно слово (16 бит) - поэтому он использует несколько частей из трех аргументов DWORD.

Все просто байты; Инструкция загрузки байтов не заботится о том, как она была сохранена или что она «означает», только то, что в данный момент находится в памяти. установки ax на ноль. x86 сдвиги маскируют их счет с помощью & 31, даже если размер операнда меньше 32-битного, поэтому узкие сдвиги могут сдвигать все биты, в отличие от shl eax, 0x20, который ничего не делает.

...