· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Проблемы с переходами

Посл.отвђт Сообщенiе


Дата: Май 20, 2003 17:59:15

1. тасм при компиляции листинга выдает ошибку:
Relative jump out of range by 000bh bytes (78)
она относиться к строке
jne mainloop
компилирую я com файл. jne по идее поддерживает переходы типа short и near. Последний разрешает переходы в пределах одного сегмента. в сom он *вроде* всего один. Намекните (а лутше прямо скажите или пошлите на нужную документацию) где может быть ошибка?
2. тасм при компиляции того же листинга выдает ошибку:
Forward reference needs override (45,51,52,65,71,95,109,123)
Она относиться к строкам типа
kUP:
--> cmp stat,01h
не могу понять что это значит и относиться ли ошибка к переходу на метку или сравнению с переменной...

Из документации по описанию ошибок полезной информации по этому вопросу извлечь не смог...
Спасибо за уделенное внимание и искренне надеюсь на вашу помощь и совет... Ворон
Код листинга:
.model small
.stack 100h
.code
org 100h


start:

mov ah,00h
mov al,03h
int 10h


call scrM


mainloop:

mov ah,08h
int 21h
test al,al
jz ARR
cmp al,1bh
je ESCe
jmp mainloop
ARR:
int 21h
cmp al,48h
je kUP
cmp al,50h
je kDOWN
jmp mainloop

ESCe:
mov ah,13h
mov al,01h
mov cx,11h
mov bl,00001111b
mov bp,offset ec
int 10h
ret

kUP:
cmp stat,01h
jne upt1
mov stat,03h
call scrM
jmp mainloop
upt1:
cmp stat,02h
jne upt2
mov stat,01h
call scrM
jmp mainloop
upt2:
cmp stat,03h
jne mainloop
mov stat,02h
call scrM
jmp mainloop


kDOWN:
cmp stat,01h
jne dpt1
mov stat,02h
call scrM
jmp mainloop
dpt1:
cmp stat,02h
jne dpt2
mov stat,03h
call scrM
jmp mainloop
dpt2:
cmp stat,03h
jne mainloop
mov stat,01h
call scrM
jmp mainloop


scrM:

mov dh,10d
mov dl,35d


mov ah,13h
mov al,01h
mov cx,op1l

mov bl,00000010b
cmp stat,01h
jne go2
mov bl,00001010b
go2:
mov bp,offset op1
int 10h

inc dh

mov ah,13h
mov al,01h
mov cx,op2l

mov bl,00000010b
cmp stat,02h
jne go3
mov bl,00001010b
go3:
mov bp,offset op2
int 10h

inc dh

mov ah,13h
mov al,01h
mov cx,op3l

mov bl,00000010b
cmp stat,03h
jne go1
mov bl,00001010b
go1:
mov bp,offset op3
int 10h

ret
op1 db "option1"
op1l equ $-op1
op2 db "option2"
op2l equ $-op2
op3 db "option3"
op3l equ $-op3
stat db 01
ec db "exit key pressed",0dh,0ah,"$"
upk db "up key pressed",0dh,0ah,"$"
dok db "down key pressed",0dh,0ah,"$"
rk db "right key pressed",0dh,0ah,"$"
lk db "left key pressed",0dh,0ah,"$"
end start


Дата: Май 20, 2003 20:41:17

Давно это было... Эх, давно. Но насколько помню, лимит для jcc в реальном режиме вовсе не один сегмент, а 128 байт. Я не знаю, сколько байт между mainloop и jne на нее - ты же не указал строку, по идее, jmp проходит (вот для него как раз и есть ограничение на сегмент!), первый jne должен по идее тоже проходить, а вот последние - вряд ли. Литература по данному вопросу - Абель. Всех к Абелю :-)


Дата: Май 20, 2003 21:36:44

ТАSМ имеет директиву %JUMPS - если не изменяет память. Она должна автоматом оптимизировать такие случаи. Также, чтобы не было предупреждений "...forward reference..." - нужно указать /m2 в коммандной строке.


Дата: Май 21, 2003 00:14:49

Есть две формы комманд условного перехода:
7xh BYTE (I)
0Fh 8xh WORD (или DWORD) (II)
Вторая форма появилась в 386х процессорах. Что бы tasm мог генерить вторую форму необходимо указать директиву .386
Директиву JUMPS рекомендую не использовать, так как если смещение перехода меньше 128 байт,
то tasm генерит короткий переход и три nop'а.


Дата: Май 21, 2003 18:29:02

Спасибо за ответы!
Все заработало как только добавил дерективу .386 и добавил при компиляции /m.

2volodya: ***Всех к Абелю :-)*** - у меня Зубков ;-) и я уже в нем по самое не могу...

С искренней признательностью Ворон.


Дата: Май 21, 2003 19:31:04 · Поправил: AsmGuru62

Black_mirror:
NOP'ы пропадут, если задать ТАSМу 2 прохода через /m2.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.064