Size: a a a

Ассемблер

2020 September 30

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
https://www.opennet.ru/opennews/art.shtml?num=52911

о, новая версия-форк вышел
источник

RS

Rusty Shackleford in Ассемблер
Подскажите пожалуйста, для того, что бы сохранить регистры неимезнными в соответствии с calling convention, я делаю вот так:
        push   RBP
       push   RBX
       push   RDI
       push   RSI
       push   R12
       push   R13
       push   R14
       push   R15
       mov    RBP, RSP
       sub    RSP, 8   ;align saved registers
       ;--- /пролог
...some code...
       ;--- эпилог
       mov    RSP, RBP
       pop    R15
       pop    R14
       pop    R13
       pop    R12
       pop    RSI
       pop    RDI
       pop    RBX
       pop    RBP
       ret

и я так понимаю, что так делать нельзя, потому что теперь некоторые winapi затирают ret адрес в моих функциях
так делать нельзя ? ) я знаю, что в линуксе например есть красная зона за указателем стека процедуры которая сохраняется неизменной и не трогается системой, смею предположить, что написав эпилог таким образом я вышел за рамки этой красной зоны или что-то в этом роде в винде, что скажите ?
источник

RS

Rusty Shackleford in Ассемблер
как грамотнее сохранить регистры которые должны оставаться не изменными в соответствии с каллинг конвеншен ?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
sub    RSP, 8
а зачем это делаешь?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
если хочешь сохранить неизменными, то делай это вне процедуры, как это делает uses
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
или он внутри процедуры сохраняет?
источник

RS

Rusty Shackleford in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮bot
sub    RSP, 8
а зачем это делаешь?
выравнивание на 16 стека
источник

RS

Rusty Shackleford in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮bot
если хочешь сохранить неизменными, то делай это вне процедуры, как это делает uses
ну как же вне, если внутри они изменяются, как то это не логично мне кажется
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
в винде эт называется теневой область, когда в стеке резервируется место под 4 параметра (там где локальные переменные делаются)
источник

RS

Rusty Shackleford in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮bot
в винде эт называется теневой область, когда в стеке резервируется место под 4 параметра (там где локальные переменные делаются)
это я знаю
источник

RS

Rusty Shackleford in Ассемблер
ну вот к примеру если процедура основана на фрейме стековом, какая область безопасная для хранения данных, тоесть call кладет на стек адрес возврата, следующая инструкция push rbp сохраняет RBP
источник

RS

Rusty Shackleford in Ассемблер
тоесть уже ret адрес и RBP (16 байт) получается безопасными будут
источник

RS

Rusty Shackleford in Ассемблер
и да, еще теневая область за ними 8*4 байт
источник

RS

Rusty Shackleford in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮bot
в винде эт называется теневой область, когда в стеке резервируется место под 4 параметра (там где локальные переменные делаются)
теневая область для сохранения только 4х регистров через которые передаеются параметры по фасткалл
источник

RS

Rusty Shackleford in Ассемблер
а вот как остальные которые должны быть не имезнными сохранить, RSI RDI RBX ..etc
источник

RS

Rusty Shackleford in Ассемблер
в winapi функциях я вообще не вижу, что бы они в начале как-то сохранялись, но в итоге они не меняются, чудо ))
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
иебе типа этого надо?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
сохраняй регистры после того как базу самой процедуры сделал
источник

RS

Rusty Shackleford in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮bot
иебе типа этого надо?
да не, ну я по крайней мере не вижу тут как сохранить регистры неимезнные которые должны оставаться, вижу только что теневую область сохраняет
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
Rusty Shackleford
да не, ну я по крайней мере не вижу тут как сохранить регистры неимезнные которые должны оставаться, вижу только что теневую область сохраняет
я мя тут теневая незадейчтвована
источник