как получить адрес определённого дворда?

Тема в разделе "WASM.BEGINNERS", создана пользователем Arisu, 15 май 2008.

  1. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    сам ты Commer .(((((((((

    Я ЭМО!
     
  2. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    харе офтопить.

    Так. меня задолбал встроенный ассемблер и я переписал код на обычный тасм.

    теперь беда в другом: параметры для mov он высчитывает относительно начала сегмента кода, но после переноса этого кода в память - сегментный регистр указывает на начало сегмента памяти, и имеет мало общего с сегментом кода контейнерного куска кода. и по этому не получаеться сделать даже банальную вещь: записать в ax некий ворд описанный ниже.

    на пример ниже приведённый код я копирую в память и передаю исполнение на него.
    Код (Text):
    1. pusha
    2.    
    3. mov ax, cs
    4. mov ds, ax
    5. xor ax, ax
    6.  
    7. mov ax, word1
    8. mov dx, word2
    9. cmp ax, dx
    10.    
    11. jne _NOE
    12. jmp _EQA
    13.  
    14. dw word1 0DDDDh
    15. dw word2 0DDDDh
    В результате он сравнивает не два ворда, а что-то где-то в памяти.
     
  3. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    сделал так:

    mov ax, word ptr [$ + 39]
    mov dx, word ptr [$ + 36]

    стало лучше. теперь он 10 раз делает несравнение и на 11 говорит что они равны )) супер.
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Зачем заморачиватся с сегментными регистрами когда виндоус нам подарила flat
     
  5. FireFox

    FireFox New Member

    Публикаций:
    0
    Регистрация:
    9 май 2008
    Сообщения:
    19
    Arisu, можешь выложить это чудо-юдо? Очень интересно поюзать.
     
  6. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    FireFox
    если ты про проект, то на http://depositfiles.com/files/5394143

    если ты про что-то другое, то уточни

    но на самом деле понять зачем всё это нужно вне контекста очень трудно, но на деле это очень важный жук будет ))
     
  7. FireFox

    FireFox New Member

    Публикаций:
    0
    Регистрация:
    9 май 2008
    Сообщения:
    19
    Компилятор скинь.
     
  8. FireFox

    FireFox New Member

    Публикаций:
    0
    Регистрация:
    9 май 2008
    Сообщения:
    19
    А код у тебя злодейский! Не хорошо!
     
  9. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    офтоп:
    нормальный код. просто тяжело писать на ассемблере не зная его.
    где-то под вечер я уже понял почти что к чему. может быть потом напишу книгу "как освоить асм за 2 дня" )))

    одного теперь не пойму:
    я кладу код в память по физическому адресу 1E0.
    процессор при вызове обработчика прерывания кладёт в регистр si значение прямиком из вектора.
    число должно указывать на начало кода, как я понял.
    в коде я si кладу в di, и считаю, что теперь процессор при выполнении всяких mov и т.д. будет отсчитывать смещение относительно di. И di+10h в моём случае должно указывать на первой из моих обьявленных вордов.

    Но чёрт возьми! после mov ax, word ptr word1 в ax оказываеться некое слово, но не 0DDDDh и при этом в моём коде такого слова не встречаеться! т.е. mov берёт слово из памяти чёрти откуда. Даже не поподая в мой код! Если бы я хотябы попал в своий код - я бы понял что к чему и от какого места надо плясать.

    возникает вопрос: если si, после передачи управления обработчику прерывания указывает не на начало обработчика, то куда????
     
  10. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    "Men learn while they teach" _)
     
  11. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    ну вот наконец добил это дело. Моя ошибка была в том, что я понадеялся на инженерингов Интела:

    если в вектор записать адрес 1E0, то при прерывании процессор перейдёт по адресу 1E0, но внутри обработчика все смещения будут отсчитываться от 0
    если в вектор записать адрес 1E0000, то опять же будет переход по адресу 1E0, но на этот раз в cs будет 1E0.

    я по глупости полагал что в cs адрес обработчика в качестве сегмента будет положен процессором в любом случае. И естественно не мог достучаться до своих вордов.
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Arisu
    Твоя ошибка в том, что даже идеальное знание ассемблера не поможет без других знаний.
    Интел не причем - х86 грузит CS и IP из дворда, а все остальное - это были твои домыслы от незнания.
    Если в SI что-то и оказалось, то Интел тут не виноват - это было сделано в другом месте.