Tasm ругается при компиляции

Тема в разделе "WASM.BEGINNERS", создана пользователем BlackWolf, 21 янв 2010.

  1. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    Есть задача на определенную клавишу совершать некое действие. При компиляции 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!!! Ничего не понимаю.((
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.562
    Адрес:
    Russia
    Возможно метки Act_5\6\7\8 стоят очень "далеко", от места перехода. Попробуйте сделать не относительные, а дальние прямые переходы (jmp far).
     
  3. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    Сорри, не тот код дал, запутался уже с разными вариантами.
    вот тот, что работает
    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
     
  4. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    метки далеко,об этом 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 (((
    помогите разобраться, если кто знает...
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Код (Text):
    1.  je far_jump
    2. far_jump :
    3.  jmp  Act_1
    заменить на

    Код (Text):
    1.  jne skip
    2. far_jump :
    3.  jmp  Act_1
    4. skip:
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    BlackWolf
    почитайте Пильщикова
     
  7. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    Спасибо за совет, уже качаю книгу))
    сделал переходы дальними как написано одном из многочисленных сайтов

    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
    все скомпилировалось, только работает все равно неправильно - на любую клавишу сразу все переходы обрабатывает (((
    буду внимательней учить теорию, спасибо за помощь!))
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    вообще если не ошибаюсь, то без директив указания типа процессора, ТАСМ компилит код для 8086 процессора. на нем нет длинных условных переходов. поставив директиву .386 вы тем самым разрешаете компилятору использовать таблицу двухбайтных опкодов и соответственно команды длинных условных переходов. т.к. кроме как у меня дома (да и то не 8086, а 8088) 8086 процессор уже не встретишь, то логичнее просто поставить эту директиву и использовать больший набор доступных команд.
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    BlackWolf
    внимательнее смотрите на мнемоники команд
    в ваших кусках условные переходы равносильны безусловному
    и все только потому чт вы просчелкали букву n в jne
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Код (Text):
    1. получилось вот так        
    2.         cmp ah, 02h       ;клавиша 1
    3.         je far_jump
    4.         far_jump :
    5.         call  Act_1
    опять у вас хрень получилась

    Код (Text):
    1. cmp ah, 01h
    2.  jne skip1
    3. far_jump :
    4.  jmp  Act_1
    5. skip1:
    6.  
    7. ; следующая проверка
    8. cmp ah, 02h
    9.  jne skip2
    10. far_jump :
    11.  jmp  Act_2
    12. skip2:
     
  11. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    В первом варианте именно так и было. Стояла директива 386, но переходы все равно осуществлялись только лишь по первым 4 клавишам, остальные клавиши (абсолютво все, а не те что указанны) обрабатывались через процедуру обработчика клавиши "1". Смотрел в отладчике - там переход именно на первую метку...Уже каша в голове, совсем запутался...А надо-то всего лишь на каждую клавишу сообщение выводить и включать соответствующий выход на lpt порту.
    P.S у меня в гараже есть 286 проц))
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    BlackWolf
    ты внимательно посмотри на то что я написал и сравни побуквам со своей хренью
    буковки n видишь в jnz у меня и то что у тебя они отсутствуют видишь???
    на метки skip обратил внимание ???
     
  13. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    сравнил, действительно хрень)) сижу теорию учу))
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    лет 10 назад студентом раскурочил айбиэмовскую оригинальную XT, жалею ну и что теперь ???
     
  15. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    да ничего, просто типа похвастали)
     
  16. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    BlackWolf
    http://www.wasm.ru/forum/viewtopic.php?id=34428
    должна пойти на твоей древности
     
  17. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    там freedos,по моему, стоит,не помню уже. Правда машина уже года 3 валяется,всеми ветрами продувается, может и не запустится сейчас...
     
  18. BlackWolf

    BlackWolf New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2010
    Сообщения:
    27
    "Умка, Глупка и Тупка" я скорее к третьему отношусь) Если моя все правильно понял, то
    "jne - если не так, то" прыгаем на пустую метку, и проверяем дальше, если же "правда",то прыгаем на обработчик. Так?
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.562
    Адрес:
    Russia
    jne - jump not equal, что в переводу на наш великий и могучий, "если не равно, то переходим".
     
  20. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    да