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

Discussion in 'WASM.BEGINNERS' started by BlackWolf, Jan 21, 2010.

  1. BlackWolf

    BlackWolf New Member

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    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 Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Возможно метки Act_5\6\7\8 стоят очень "далеко", от места перехода. Попробуйте сделать не относительные, а дальние прямые переходы (jmp far).
     
  3. BlackWolf

    BlackWolf New Member

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    Code (Text):
    1.  je far_jump
    2. far_jump :
    3.  jmp  Act_1
    заменить на

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

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    BlackWolf
    почитайте Пильщикова
     
  7. BlackWolf

    BlackWolf New Member

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    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

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

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    BlackWolf
    внимательнее смотрите на мнемоники команд
    в ваших кусках условные переходы равносильны безусловному
    и все только потому чт вы просчелкали букву n в jne
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    Code (Text):
    1. получилось вот так        
    2.         cmp ah, 02h       ;клавиша 1
    3.         je far_jump
    4.         far_jump :
    5.         call  Act_1
    опять у вас хрень получилась

    Code (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

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

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    BlackWolf
    ты внимательно посмотри на то что я написал и сравни побуквам со своей хренью
    буковки n видишь в jnz у меня и то что у тебя они отсутствуют видишь???
    на метки skip обратил внимание ???
     
  13. BlackWolf

    BlackWolf New Member

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    27
    сравнил, действительно хрень)) сижу теорию учу))
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    лет 10 назад студентом раскурочил айбиэмовскую оригинальную XT, жалею ну и что теперь ???
     
  15. BlackWolf

    BlackWolf New Member

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    27
    да ничего, просто типа похвастали)
     
  16. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    BlackWolf
    http://www.wasm.ru/forum/viewtopic.php?id=34428
    должна пойти на твоей древности
     
  17. BlackWolf

    BlackWolf New Member

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    27
    там freedos,по моему, стоит,не помню уже. Правда машина уже года 3 валяется,всеми ветрами продувается, может и не запустится сейчас...
     
  18. BlackWolf

    BlackWolf New Member

    Blog Posts:
    0
    Joined:
    Jan 19, 2010
    Messages:
    27
    "Умка, Глупка и Тупка" я скорее к третьему отношусь) Если моя все правильно понял, то
    "jne - если не так, то" прыгаем на пустую метку, и проверяем дальше, если же "правда",то прыгаем на обработчик. Так?
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    jne - jump not equal, что в переводу на наш великий и могучий, "если не равно, то переходим".
     
  20. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    да