FromNandの日記

自分的備忘録

【x86アセンブラ】PUSHAL・POPALについて調べてみた【順番・レジスタの種類など】

この記事は32bitレジスタを対象に考えておりますのでご了承ください。
参考 : PUSHAD - Push All General-Purpose Registers


x86には一括してレジスタを操作する命令PUSHAL・POPALがあるらしい。
それぞれが行う命令を分解して考えると、こうだ。

PUSHAL (PUSHAD)

PUSH EAX
PUSH ECX
PUSH EDX
PUSH EBX
PUSH ESP
PUSH EBP
PUSH ESI
PUSH EDI

POPAL (POPAD)

POP EDI
POP ESI
POP EBP
# POP ESP will be ignored.
POP EBX
POP EDX
POP ECX
POP EAX


PUSHALではEAX→ECX→EDX→EBX→ESP→EBP→ESI→EDIの順番に操作されるようだ。
POPALの方ではESPの値が復旧されないらしいが、これは当然そうなる。
なぜなら、少しでもおかしな番地からPOPADした場合、ESPは当然変な値になってしまうが、こうなった場合プログラムはかんたんにダウンすることになる。
また、これは憶測だが、POPADを行っている途中もESPの値を参照しているわけで、これを変更してしまうとPOPAD命令にも影響が出るかもしれない。
POPALがCPUのアトミック命令になっているんだったら問題ないと思うんだけど。(よくわかってない。)


ここでPUSHALを行った際のメモリレイアウトを確認して締めようと思う。

低アドレス

EDI    ← ESP indicate here!!
ESI
EBP
ESP
EBX
EDX
ECX
EAX

高アドレス