Адресация памяти в Long Mode

Тема в разделе "WASM.OS.DEVEL", создана пользователем olegsys, 4 апр 2010.

  1. olegsys

    olegsys New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2010
    Сообщения:
    10
    Привет. Помогите разобраться, а то написал уже кучу 64-битного кода на NASM, стал просматривать листинги и заметил то, что никак не могу понять.
    В доках от Intel и AMD указывается что адресация в Long Mode по умолчанию 64 битная, однако когда компилирую например такой код:
    Код (Text):
    1. mov rax,qword [12345678h]
    то получаю машинные коды:
    Код (Text):
    1. 48 8B 04 25 78 56 34 12
    Вот и вопрос: Почему NASM под адрес отводит всего 4 байта??? а не 8 ???

    и соответственно такой код
    Код (Text):
    1. mov rax,qword [1234567890ABCDEFh]
    совсем не компилируется как надо: warning: dword data exceeds bounds

    Собственно неужели нельзя напрямую адресовать более 4 Гб памяти??

    У меня написан модуль вывода графики в линейный видеобуфер, там я транслирую физические страницы видеопамяти в ЛИНЕЙНОЕ адресное пространство начиная с 1 0000 0000 h и ВСЁ ПРЕКРАСНО РАБОТАЕТ, поскольку вывожу точки примерно таким кодом
    Код (Text):
    1.  ... .... ....
    2.         add rdi,r8              ; прибавим X, т.к. 4 байта на пиксель
    3.         add rdi,100000000h  ; высчитываем линейный адрес первого пикселя, буфер с 1 0000 0000 h
    4.         mov eax,r12d
    5.         cld
    6.         rep stosd
    т.е. адрес выше 4 Гб у меня в регистре RDI и косвеная адресация работает так как надо.

    Я бы и не заметил этого если бы не дошёл до момента программирования APIC.
    Пытаюсь прочесть dword из адреса FEE0 0000h. Само собой заранее установил соответствие страниц физическая=линейная.
    на реальном компе - сразу сброс процессора на инструкции чтения mov eax, dword [0FEE00000h]
    в отладчике Bochs на этой инструкции вижу что она интерпретируется как
    8B 04 25 0000E0FE ==== mov eax,dword ptr ds:0xFFFFFFFFFEE00000
    ОТКУДА ТАКОЙ АДРЕС ????

    Помогите, кто в этом хорошо разбирается, пожалуйста, а то мозг кипит :)
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    olegsys
    Там 64х битный адрес вроде только для MOV RAX,[A64] можно указать.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    olegsys
    Адрес 64битный, а вот imm макимум 32.

    Врет отладчик.
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    olegsys
    nasm не правильно код генерит(кстати fasm 1.68 тоже не правильно)

     
  5. olegsys

    olegsys New Member

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

    ОГРОМНОЕ СПАСИБО !!!
    действительно код A1 00 00 E0 FE 00 00 00 00 работает как надо!

    а то как говоорится "чувствую что-то не так, а понять не могу..." :). Не ожидал от NASMa такого подвоха, версию юзаю последнюю 2.08.01.
    Кстати и Bochs перестал тупить на этой команде.

    Спасибо. Сейчас курю мануалы по Local и I/O APICам. Теорию от корки до корки прочёл раз 15, а примеров находится оччень-очень мало и то под Protected Mode, вот сейчас в раздумьях какие подводные камни встретятся при программирование APIC не из 32битного а из 64-битного режима.
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    olegsys
    >add rdi,100000000h
    Вот это настораживает. Заглянули в ман – такое не закодировать; К любому reg64 можно добавлять лишь imm32, с пропагацией знака.

    Pavia
    >Врет отладчик.
    Не, там всё верно по идее – происходит знаковое расширение 32х-разрядного смещения при использовании опкода 8B.

    P.S.
    fasm 1.69.11:
    mov eax, [qword 123456789abcdef0h] <-> A1F0DEBC9A78563412
     
  7. olegsys

    olegsys New Member

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

    виноват, это я "подправил" для "большей наглядности" при написании поста, на самом деле конечноже у меня так:
    Код (Text):
    1. ...
    2.         add rdi,qword [data_VBE_linearbuffer]
    3. ...
    4. data_VBE_linearbuffer   dq  100000000h          ; адрес линейного видеобуфера
    Сегодня первый день зарегился на этом форуме и сразу приятно удивлен встретить действительно
    грамотных людей! Респект !
     
  8. olegsys

    olegsys New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2010
    Сообщения:
    10
    Зря я NASM обругал, оказывается он может правильно опкод вставлять
    в документации написано:
    т.е. пишем
    mov eax,[qword 0x123456789ABCDEF0] - слово qword внутри скобок а не снаружи
    и получаем верный код: A1F0DEBC9A78563412
     
  9. olegsys

    olegsys New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2010
    Сообщения:
    10
    Зря я NASM обругал, оказывается он может правильно опкод вставлять
    в документации написано:
    т.е. пишем
    mov eax,[qword 0x123456789ABCDEF0] - слово qword внутри скобок а не снаружи
    и получаем верный код: A1F0DEBC9A78563412