LINUX.ORG.RU

gas optimization


0

0

Использую в программе самомодифицирующийся код (не кидайти в меня тухлыми яйцами - работает все это в RealMode.

Вот такое дело: .byte 0x66 /* префикс изменения разрядности операнда */ .byte 0xea /* код команды ljmp */ .comm pmode32_entry_offset, 4 /* 32-битное смещение */ .word 0x08 /* селектор */

Это эквивалентно ljmpl $0x08, pmode32_entry_offset

Все это дело благополучно не работает. Долго думал в чем дело, потом догадался запустить biew. И что я вижу:

00000060: 66EA08000F20C024 jmpf32 24C0:+200F0008

То есть в целях оптимизации .word 0x08 и .comm pmode32_entry_offset, 4 были переставлены, чтобы обеспечить pmode32_entry_offset адрес, делящийся на 4.

Как отключить такую оптимизацию?

Спасибо.

Использую в программе самомодифицирующийся код (не кидайти в меня
тухлыми яйцами - работает все это в RealMode.

Вот такое дело:
    .byte   0x66                    /* префикс изменения разрядности операнда */
    .byte   0xea                    /* код команды ljmp */
    .comm   pmode32_entry_offset, 4 /* 32-битное смещение */
    .word   0x08                    /* селектор */

Это эквивалентно ljmpl $0x08, pmode32_entry_offset

Все это дело благополучно не работает. Долго думал в чем дело, потом догадался запустить biew. И что я вижу:

00000060: 66EA08000F20C024      jmpf32    24C0:+200F0008

То есть в целях оптимизации .word 0x08 и .comm pmode32_entry_offset, 4
были переставлены, чтобы обеспечить pmode32_entry_offset адрес,
делящийся на 4.


Как отключить такую оптимизацию?

Спасибо.

satanic-mechanic
() автор топика
Ответ на: комментарий от satanic-mechanic

Не думаю, что это оптимизация. .comm объявляет поименнованную общую область в секции bss, а остальной код, скорее всего в другой секции. Т.е. gas или ld перемещает положение pmode32_entry_offset в bss.

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.