jmp short и jmp near, или стрельба с танка по комарам

Тема в разделе "WASM.BEGINNERS", создана пользователем rudik, 14 июл 2007.

  1. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Есть бут-сектор, который загружает есчё несколько секторов и передает управление. Написан на фасме. Сектора грузятся 100%.
    Последняя команда бут-сектора jmp 0x800:0x0, тобыш cs=0x800 и ip=0. По этому адресу загружены сектора. Режим процессора - реальный.
    Теперь проблема: передается правильно, но по адресу 800:0000 находится код:
    Код (Text):
    1. org 0x0
    2. use16
    3.     jmp short Begin_l
    4.     boot_devise db 0
    5.     boot_devise_logic db 0
    6.     Begin_l:
    7.     mov bp,LOADER_START_MESSAGE
    8.     mov ax,0x1301
    9.     mov bx,0x0F              
    10.     mov cx,LOADER_START_MESSAGE_SIZE
    11.     mov dx,0203h                          
    12.     int 0x10
    13.     jmp $
    В этом варианте всё ОК, но если команду jmp short Begin_l сменить на jmp near Begin_l - работать отказывается(попадает не на метку а хз куда). Как такое может быть???
     
  2. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Помогите пожалуйста. Все длиные прыжки заканчиваются зависанием. А без них - как с руками, но не оттуда. Также не работают вызовы процедур. Блин, если я за сёдня не пойму в чём поблема - пойду в монахи! :"(
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Не совсем понятно, что именно не работает: длинные прыжки/вызовы процедур?

    Почему бы не просмотреть, что генерирует FASM в самом файле с помощью шестнадцатеричного редактора/просмотрщика? Для этого неплохо было бы "обернуть" прыжки и вызовы командами 'nop' (код 0x90) для наглядности.
     
  4. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    А почему org 0 ? бут всю жизнь был org 7c00h, потому near и не работает вследствие неправильного рассчёта смещения.
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Так ведь это, по-видимому, вторичный загрузчик -- на него идет 'jmp 0x800:0x0'.
     
  6. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Бут сектор загружает есче несколько секторов по адресу 0х8000 и передает управу.

    Уже разобрался. Лажа была в компиляторе фасм 1.60.