【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 高アドレス