(начал изучать асму пару дней назад отсюда все вытекающее )) Что0то никак не могу понять подводных камней: использую ф-ю jne, после cmp, естественно, которая делает переход на метку Error, находящуюся в конце кода. TASM выдает такую ошибку: **Error** compile.asm(31) Relative jump out of range by 0001h bytes Долго не мог понять смысл, но, в рез-те упорных экспериментов, убрав одну команду между JNE и меткой - все пошло! Смотрел в отладчике - там не так много "расстояния" между ними - где-то 92h - в чем причина? Какие ограничения есть у JNE (и что значит БЛИЗКИЙ и КОРОТКИЙ переходы??? (Юров стр.529)) ЗЫЖ еще вопросик - раз уж пошла такая пьнка - в том же Юрове написано, что выбор правильного выравнивания сегментов в памяти может ускорить доступ к ним и соответственно работу - как выбрать этот правильный способ?
- short (БЛИЗКИЙ) - однобайтное смещение +127 .. -128 байт - near (КОРОТКИЙ) - размер смещения зависит от режима адресации 2 байта (+32767 .. - 32768) в 16ти разрядном режиме и 4 байта (+2<sup>31</sup>-1 .. -2<sup>31</sup> в 32х разрядном режиме. смещение считается от начала _следующей_ за переходом команды ты видимо написАл jne short, вот TASM и ругается, что слишком далеко.
Судя по всему, программа для ДОС. Если да, то: Зубков: Команды Jcc не поддерживают дальних переходов, поэтому, если требуется выполнить условный переход на дальнюю метку, необходимо использовать команду из набора Jcc с обратным условием и дальний JMP, как, например: Код (Text): cmp ax,0 jne local_1 jmp far_label local_1: т.е. JNE не может быть дальним.
Да, я чуть лоханулся... Но скомпилировать Код (Text): jne near_label db 128 dup (90h) near_label: в TASM никак не удается. В MASM - без проблем.
S_T_A_S_> ты видимо написАл jne short, вот TASM и ругается, что слишком далеко. Есть и другая гипотеза. jcc near не входит в базисный набор инструкций 8086, вот tasm и отказывается их компилировать без дополнительных директив.
Да, наверное так и есть, но я никогда не использовал tasm от борланда, а только от Rst#7 - там таких директив и в помине не было
Хитрый MASM компилирует jne offset_more_than_127 в Код (Text): _TEXT:0104 jz loc_10109 _TEXT:0106 jmp loc_10189 _TEXT:0109 loc_10109: , а чтобы получить четырехбайтную команду jne near, и В TASM, и в MASM нельзя пользоваться директивами .model, .code и т.п., а следует писать _TEXT segment word public 'CODE' use16 и т.п., и не забыть директиву .386. Вот такие капризные компиляторы
И напоследок: Код (Text): hey_stupid_comliler_let_me_jnz_over_127_bytes macro param local current_position dw 850Fh current_position: dw param - current_position - 2 endm ;drunk coded but seems to be working Название макроса можно изменить