Есть задача на определенную клавишу совершать некое действие. При компиляции Tasm начинает ругаться вот таким образом: Цитата: 1)Relative jump out of range by 0003h bytes 2)Relative jump out of range by 0015h bytes 3)Relative jump out of range by 0027h bytes 4)Relative jump out of range by 0039h bytes Вот кусок исходника, на который ругается : Код ASM mov ah, 0 ;считать код с клавиши int 16h cmp ah, 20h ;клавиша 1 je Act_1 ;если да - переход на обработку cmp ah, 20h ;клавиша 2 jnz Act_2 cmp ah, 21h ;клавиша 3 je Act_3 cmp ah, 22h ;клавиша 4 jnz Act_4 cmp ah, 23h ;клавиша 5 je Act_5 cmp ah, 24h ;клавиша 6 je Act_6 cmp ah, 25h ;клавиша 7 jnz Act_7 cmp ah, 26h ;клавиша 8 jnz Act_8 cmp ah, 1Eh je Exit если убрать код начиная с "клавиша 5", то все работает без проблем. если вначале поставить директиву .386 - все компилируется без проблем, но переходы все равно не осуществляются.А именно - при нажатии на любую клавишу,кроме первый четырех, перебрасывает на метку Act_1!!! Ничего не понимаю.((
Возможно метки Act_5\6\7\8 стоят очень "далеко", от места перехода. Попробуйте сделать не относительные, а дальние прямые переходы (jmp far).
Сорри, не тот код дал, запутался уже с разными вариантами. вот тот, что работает mov ah, 0 ;считать код с клавиши int 16h cmp ah, 20h ;клавиша 1 je Act_1 ;если да - переход на обработку cmp ah, 20h ;клавиша 2 je Act_2 cmp ah, 21h ;клавиша 3 je Act_3 cmp ah, 22h ;клавиша 4 je Act_4 cmp ah, 23h ;клавиша 5 je Act_5 cmp ah, 24h ;клавиша 6 je Act_6 cmp ah, 25h ;клавиша 7 je Act_7 cmp ah, 26h ;клавиша 8 je Act_8 cmp ah, 1Eh je Exit
метки далеко,об этом Tasm и ругается((. Дальние переходы не помогли, либо я что-то неверно делаю (я новичек - только месяц пытаюсь с асмом подружиться). Вот так ,вроде бы, нужно дальний переход делать (в интернете нашел вариант) mov ah, 0 ;считать код с клавиши int 16h cmp ah, 02h ;клавиша 1 je far_jump far_jump : jmp Act_1 cmp ah, 03h ;клавиша 2 je far_jump2 far_jump2 : jmp Act_2 cmp ah, 04h ;клавиша 3 je far_jump3 far_jump3 : jmp Act_3 cmp ah, 05h ;клавиша 4 je far_jump4 far_jump4 : jmp Act_4 cmp ah, 06h ;клавиша 5 je far_jump5 far_jump5 : jmp Act_5 cmp ah, 07h ;клавиша 6 je far_jump6 far_jump6 : jmp Act_6 cmp ah, 08h ;клавиша 7 je far_jump7 far_jump7 : jmp Act_7 cmp ah, 09h ;клавиша 8 je far_jump8 far_jump8 : jmp Act_8 cmp ah, 1Eh je far_exit far_exit : jmp Exit Вышеуказанный код скомпилился, но на ЛЮБУЮ клавишу перекидывает на метку номер 1 ((( помогите разобраться, если кто знает...
Code (Text): je far_jump far_jump : jmp Act_1 заменить на Code (Text): jne skip far_jump : jmp Act_1 skip:
Спасибо за совет, уже качаю книгу)) сделал переходы дальними как написано одном из многочисленных сайтов MODEL TINY ; по умолчанию расстояния NEAR ; test1 - это дальняя процедура test1 PROC FAR ; тело процедуры RET ; это будет дальним возвратом: ENDP ; test2 по умолчанию является ; ближней процедурой test2 PROC ; тело процедуры RET ; это будет ближним возвратом ENDP получилось вот так cmp ah, 02h ;клавиша 1 je far_jump far_jump : call Act_1 все скомпилировалось, только работает все равно неправильно - на любую клавишу сразу все переходы обрабатывает ((( буду внимательней учить теорию, спасибо за помощь!))
вообще если не ошибаюсь, то без директив указания типа процессора, ТАСМ компилит код для 8086 процессора. на нем нет длинных условных переходов. поставив директиву .386 вы тем самым разрешаете компилятору использовать таблицу двухбайтных опкодов и соответственно команды длинных условных переходов. т.к. кроме как у меня дома (да и то не 8086, а 8088) 8086 процессор уже не встретишь, то логичнее просто поставить эту директиву и использовать больший набор доступных команд.
BlackWolf внимательнее смотрите на мнемоники команд в ваших кусках условные переходы равносильны безусловному и все только потому чт вы просчелкали букву n в jne
Code (Text): получилось вот так cmp ah, 02h ;клавиша 1 je far_jump far_jump : call Act_1 опять у вас хрень получилась Code (Text): cmp ah, 01h jne skip1 far_jump : jmp Act_1 skip1: ; следующая проверка cmp ah, 02h jne skip2 far_jump : jmp Act_2 skip2:
В первом варианте именно так и было. Стояла директива 386, но переходы все равно осуществлялись только лишь по первым 4 клавишам, остальные клавиши (абсолютво все, а не те что указанны) обрабатывались через процедуру обработчика клавиши "1". Смотрел в отладчике - там переход именно на первую метку...Уже каша в голове, совсем запутался...А надо-то всего лишь на каждую клавишу сообщение выводить и включать соответствующий выход на lpt порту. P.S у меня в гараже есть 286 проц))
BlackWolf ты внимательно посмотри на то что я написал и сравни побуквам со своей хренью буковки n видишь в jnz у меня и то что у тебя они отсутствуют видишь??? на метки skip обратил внимание ???
там freedos,по моему, стоит,не помню уже. Правда машина уже года 3 валяется,всеми ветрами продувается, может и не запустится сейчас...
"Умка, Глупка и Тупка" я скорее к третьему отношусь) Если моя все правильно понял, то "jne - если не так, то" прыгаем на пустую метку, и проверяем дальше, если же "правда",то прыгаем на обработчик. Так?