Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2011, 17:01   #1
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию Сгенерировать опкод JMP near 32bit

Привет, делаю JIT компиляцию и столкнулся с проблемой. Вот выстраивается у меня скажем такой код:
Код:
      80 3E 00        cmp byte ptr [esi], 0
      0F 84 xx xx xx xx        je @done
тут тело цикла, какие-то команды
@done:
Итого, когда я генерю опкод je, я вместо xx могу подставить просто количество байт, на которые нужно прыгнуть от текущего смещения. Тут никаких сложностей. Сложность возникла, когда мне нужно командой jmp прыгнуть на вверх кода, типа того:
Код:
@loop_main:
тут какие-то команды
E9 xx xx xx xx jmp @loop_main
Как вычислить, что мне нужно подставить вместо xx. Я знаю например длинну кода между @loop_main и jmp. Этого достаточно?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 07.02.2011, 17:22   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

вот отрицательную длину (в дополнительном коде) и надо забить.
Кстати, ты ж в курсе, что есть длинный (E9) и короткий (EB) джамп? Или не заморачиваешься таким?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.02.2011, 17:27   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
вот отрицательную длину (в дополнительном коде) и надо забить.
Кстати, ты ж в курсе, что есть длинный (E9) и короткий (EB) джамп? Или не заморачиваешься таким?
В курсе конечно. Думаю пока хоть каким-нибудь сделать, чтоб только завелось. Оптимизить на короткие уже потом буду, пускай пока все длинными. То есть грубо говоря если мне нужно прыгнуть назад на 50 байт, я просто заношу -50 (0xFFFFFFCE). Или стоп, дополнительный код это как? Это в смысле перевернуть все, то есть 0xCEFFFFFF ?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 07.02.2011, 17:28   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
-50 (0xFFFFFFCE)
все верно, это и называют дополнительным кодом )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.02.2011, 18:01   #5
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Ага, разобрался, спасибо.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 07.02.2011, 21:17   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> Оптимизить на короткие уже потом буду

А кто тебе сказал что шортджампы всегда и безусловно оптимальнее соответсвующих лонгджампов ?
mss вне форума Ответить с цитированием
Старый 07.02.2011, 21:48   #7
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
> Оптимизить на короткие уже потом буду

А кто тебе сказал что шортджампы всегда и безусловно оптимальнее соответсвующих лонгджампов ?
Хммм.. Если честно, то никто не говорил, я это как-то почему-то сам подразумевал. А это разве не так? По идее конвееру легче шортджампы обрабатывать и может кеширование лучше..

ЗЫ Теперь учитываю шортджампы. И JE, и JMP ...
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 07.02.2011, 22:58   #8
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Современные механизмы предсказания ветвлений настолько нивелируют эту разницу, что подобная оптимизация становится сродни ловле блох
mss вне форума Ответить с цитированием
Старый 07.02.2011, 23:34   #9
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Современные механизмы предсказания ветвлений настолько нивелируют эту разницу, что подобная оптимизация становится сродни ловле блох
Возможно, я не спорю. Но хуже-то наверняка не будет. А юзерам за не очень современными ПК приятно.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как праильно посчитать опкод? FRIZS Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 15.04.2010 11:20
jmp illegal descriptor type 0 deHimer Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 06.01.2010 15:30
как из 64bit в 32bit -ную систему??? Sergeu Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 07.11.2009 20:01
Direct3d ZBuffer 32bit не устанавливается Selestis Мультимедиа в Delphi 0 23.10.2009 22:31
Сгенерировать много GIF Dj_smart Мультимедиа в Delphi 3 20.05.2008 21:38