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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 16:34   #1
Ra88
Пользователь
 
Регистрация: 26.05.2009
Сообщений: 21
По умолчанию jump destination too far

Суть затруднения в следующем: имеется работающая программа, содержащая некоторый цикл. Вот её фрагмент:
Код:
.....
push eax
push ecx
invoke wsprintf,ADDR buf,ADDR ifmt,dl
invoke WriteConsoleA,stdout,ADDR buf,Bsize,ADDR cWritten,NULL
pop ecx
pop eax

loop met1    ;здесь ругается 
.....
При добавлении в цикл фрагмента (выделенного жирным шрифтом) выдаёт ошибку jump destination too far (назначение скачка слишком далеко), т.е. это видимо связано с тем что цикл слишком велик по размеру. Как правильно решаются такого рода проблемы?

Пользуюсь MASM 10
Ra88 вне форума Ответить с цитированием
Старый 12.10.2010, 17:07   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Код:
dec ecx
jnz met1
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.10.2010, 17:49   #3
Ra88
Пользователь
 
Регистрация: 26.05.2009
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Код:
dec ecx
jnz met1
Спасибо большое за совет! А не могли бы вы пояснить как оно так то?
Ra88 вне форума Ответить с цитированием
Старый 12.10.2010, 17:55   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

В опкоде loop для указания смещения, на которое должен происходить прыжок, выделен только 1 байт, т.е. перейти можно не дальше чем на 128 байт в обе стороны.
Опкод jmp имеет форму в котором под смещение выделено 4 байта, т.е переход может быть осуществлен на 2147483648 байт в обе стороны.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.10.2010, 18:53   #5
Ra88
Пользователь
 
Регистрация: 26.05.2009
Сообщений: 21
По умолчанию

ОГО ! Понял!
Ra88 вне форума Ответить с цитированием
Старый 13.10.2010, 06:37   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Ra88
Есть еще один способ чтобы loop оставался в пределах 127/128 байт -- это оформить фрагмент вашего кода в вид процедуры
Код:
met1: ...
   call func
   loop met1
...
func proc uses eax ecx
invoke wsprintf,ADDR buf,ADDR ifmt,dl
invoke WriteConsoleA,stdout,ADDR buf,Bsize,ADDR cWritten,NULL
ret
func endp
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
После загрузки картинки в RichView, задать стиль с Jump Shouldercannon Общие вопросы Delphi 3 01.07.2010 14:54
List/MENU или Jump Menu с mysql vanDJ PHP 0 09.02.2009 11:19
Скрипт Jump.cgi (или просто редирект) galok PHP 12 18.02.2008 15:26