|
|
| Посл.отвђт | Сообщен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 |