2014-02-17 1 views
1

Мне нужно сохранить регистры с плавающей запятой в стек.
Я попытался использовать инструкцию fsave.
я сделать следующее:Как получить согласованный адрес по 16 байт в сборе

fsave (%esp) 

Но как аргумент fsave использует 16 байт выровненный адрес.

У меня нет идеи, как сделать адрес в% esp равным 16 байт.

+2

И адрес с низким 4 бита расчищенных выравнивается по 16 байт. – Michael

+0

новый = (старый + 0xF) & (~ 0xF); –

ответ

3

Используя синтаксис Intel стиль:

push ebp    ;save ebp 
    mov  ebp,esp   ;save esp in ebp 
    and  esp,0fffffff0h ;round esp down to 16 byte boundary 
    sub  esp,128   ;allocate multiple of 16 bytes 
+0

Это полу полезный совет; если вы выполняете 'fsave (% esp)' _ after выше, вы перезапишете существующий стек. В то время как вам нужно выровнять указатель стека, не забывайте, что вы также должны выделять стек здесь ... –

+1

обновил пример кода. в моих старых документах отмечается, что fsave может сэкономить до 108 байтов, теперь он может быть больше. – rcgldr

Смежные вопросы