Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13

Тема: Взаимодействие с ассемблером

  1. #1 Взаимодействие с ассемблером 
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,911
    Сказал(а) спасибо
    1,841
    Поблагодарили 976 раз(а) в 834 сообщениях
    Записей в блоге
    1
    Здравствуйте, почитал темку, может быть тут отвтит кто.
    Вопрос заключается в том, что при интерпретации на QBasic и QuickBasic 4.0\4.5 мои программы использующие ABSOLUTE, работают вполне нормально, но при компиляции на версиях QuickBasic, не работает вообще ничего, т.е. даже банальная прога которая делает:
    Код :
    MyVal   dw(0)  
    MyProcedure   Proc Far
       mov MyVal, 1
       retf
    MyProcedure   Endp
    Там я для безопасности сохраняю и флаги и регистры и вообще всё очень аккуратно кодю. В машинные перевожу программой turbo debugger, перевожу реально правильно без косяков(в своё время кодил на асме под MS-DOS). Естественно я не забываю подключать хедер, причём компилировал и сам через командную строку подключая qb.lib.
    Если кто сталкивался, прошу помочь в понимании сути проблемы.
    Последний раз редактировалось Konstantin Shcherba; 13.04.2011 в 01:17. Причина: Перенес сообщения в отдельную тему
    Ответить с цитированием  
     

  2. #2  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    >Quiet Snow<, покажите пожалуйста пример программы с ABSOLUTE (BAS файл), которая нормально интерпретируется, но после компиляции не хочет работать.
    Ответить с цитированием  
     

  3. #3  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,911
    Сказал(а) спасибо
    1,841
    Поблагодарили 976 раз(а) в 834 сообщениях
    Записей в блоге
    1
    Я уже всё, что мог перепробовал, перерыл кучу ссылок в гугле.
    Причём, когда делают строкой и оператором SADD, всё работает.
    Но хочу понять, почему не работает так(хотя работает же при интерпретации и в справке QBasic\QuickBasic указан именно такой способ).

    Код :
    '$STATIC
    DIM InLn%(15)
     
    CLS
         ' Наш код помещает
         ' значение 32 в cs:[0000]
         ' т.е. в InLn%(0)
         ' после CALL cs:[ip] прыгают в
         ' сегмент и смещение исполняемого кода.
         ' относительно которого ведётся отсчёт.
      InLn%(1) = -14802      '2EC606000020CB
      InLn%(2) = 6
      InLn%(3) = 8192
      InLn%(4) = 203
     
       DEF SEG = VARSEG(InLn%(1))
          CALL ABSOLUTE(VARPTR(InLn%(1)))
       DEF SEG
     
      PRINT InLn%(0)
     
    WHILE INKEY$ = "": WEND
     
       '  В QuickBasic 4.0\4.5 вызов
       '  подпрограммы закоден так:
       '  Пробовал рекомпилировать файл
       '  и использовать заместо идкщего в комплекте
     
       ' DOSSEG          ; Написано что требует MASM 5.0
       ' .MODEL medium   ; Я пользуюсь MASM 5.1
       '
       ' Public ABSOLUTE
       '
       ' .DATA?
       '
       ' EXTRN b$seg:WORD    ;Seg segment
       '
       ' ABSOLUTE    PROC FAR
       '                  ;  Как я понял адрес возврата в
       '                  ;  основную программу после инструкции
       '                  ;  CALL ABSOLUTE
       '                  ;  И смещение кода, который должен быть
       '                  ;  выполнен, всё это берётся из стека.
       '
       '      pop ax            ;return offset
       '      pop dx            ;return segment
       '      pop bx            ;get pointer to routine address
       '                  ;  После 2-го retf управление уйдёт сюда
       '      push dx           ;restore return address
       '      push ax           ;
       '                  ;  После 1-го retf управление уйдёт сюда
       '      push [b$seg]      ;stack DEF SEG segment
       '      push [bx]         ;stack routine offset
       '
       '      ret     ; т.к. FAR то = RETF
       ' ABSOLUTE    ENDP

    Парюсь потому, что хотелось бы иметь свои программы в "совместимом виде", т.е. чтобы работали и в QBasic и в QuickBasic, при интерпретации и после компиляции. На PDS в таком случае по любому заработает, можно даже и не проверять.
    Последний раз редактировалось >Quiet Snow<; 12.04.2011 в 15:26.
    Ответить с цитированием  
     

  4. #4  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Я, честно говоря, не понял, зачем так мучать стек?

    Может быть проще сделать так:

    Код qbasic:
    AsmStr$ = байты вашей программы, заканчивающиеся на ret
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] = [Ссылки могут видеть только зарегистрированные пользователи. ](AsmStr$)
    CALL [Ссылки могут видеть только зарегистрированные пользователи. ]([Ссылки могут видеть только зарегистрированные пользователи. ](AsmStr$))

    Компилировать асмовский исходник можно в COM файл - в MASM 6.0 - ML.EXE с параметром AT

    Какой смысл в строке
    Код :
    PRINT InLn%(0)
    Ответить с цитированием  
     

  5. #5  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,911
    Сказал(а) спасибо
    1,841
    Поблагодарили 976 раз(а) в 834 сообщениях
    Записей в блоге
    1
    Может быть проще сделать так:
    Проще то проще, хочется разобраться почему не работает самый стандартнейший вариант. А в чём заключается мучение стека?
    Если забивкой программы, то это просто пример, на самом деле, в моих программах весь код загружается заранее.

    Какой смысл в строке
    Просмотр изменённого значения(его мы меняем в inline программе), после компиляции там 0, при интерпретации всё отлично и там 32.

    можно в COM файл - в MASM 6.0 - ML.EXE с параметром AT
    Понятно, но уже как-то привык через TD всё делать, к тому же отлаживать там удобно, а код я прямо в дату перепечатываю(у меня спец оператор есть, достаточно удобный).

    В QuickBasic'ах я вообще не парюсь, библиотека создаётся проще некуда из кода на ассемблере.

    P.S: Если идёт оффтоп(тут же VESA обсуждается), то могли бы вы перенести посты в тему, посвящённую вставкам в машинных кодах, чтобы не захламлять эту тему.
    Ответить с цитированием  
     

  6. #6  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    >Quiet Snow<, ход Ваших мыслей мне понятен, чисто теоретически должно работать, но не работает.

    Сделал такой вариант на основе примера из справки

    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ] nASMBYTES = 8
    [Ссылки могут видеть только зарегистрированные пользователи. ] A-Z
    [Ссылки могут видеть только зарегистрированные пользователи. ] AsmProg(0 TO (nASMBYTES / 2))
     
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    AsmBytes:
    [Ссылки могут видеть только зарегистрированные пользователи. ] &H2E, &HC6, &H06, &H00, &H00, &H20
    [Ссылки могут видеть только зарегистрированные пользователи. ] &HCB, &H90      
     
    P = [Ссылки могут видеть только зарегистрированные пользователи. ](AsmProg(1))
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] = [Ссылки могут видеть только зарегистрированные пользователи. ](AsmProg(1))
    [Ссылки могут видеть только зарегистрированные пользователи. ] AsmBytes
    FOR I = 0 TO nASMBYTES - 1
       [Ссылки могут видеть только зарегистрированные пользователи. ] J
       [Ссылки могут видеть только зарегистрированные пользователи. ] (P + I), J
    NEXT I
     
    CALL [Ссылки могут видеть только зарегистрированные пользователи. ]([Ссылки могут видеть только зарегистрированные пользователи. ](AsmProg(1)))
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
     
    [Ссылки могут видеть только зарегистрированные пользователи. ] AsmProg(0)
    [Ссылки могут видеть только зарегистрированные пользователи. ]

    После компиляции в 4.5 работает нормально, интерпретация также проходит без проблем.
    Ответить с цитированием  
     

  7. #7  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,911
    Сказал(а) спасибо
    1,841
    Поблагодарили 976 раз(а) в 834 сообщениях
    Записей в блоге
    1
    admin, большое спасибо!

    Если честно, до сих пор не могу понять в чём проблема. Неужели в инструкции NOP?
    Сейчас проверю на своей программе.
    Ответить с цитированием  
     

  8. #8  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    >Quiet Snow<, nop здесь ни при чем. Я ее добавил только для того, что бы ко-во байтов было четным.

    По сути отличие только в том, что ассемблерная вставка заносится сначала в DATA, а потом перегоняется в массив, а у Вас изначально в массиве.
    Ответить с цитированием  
     

  9. #9  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,911
    Сказал(а) спасибо
    1,841
    Поблагодарили 976 раз(а) в 834 сообщениях
    Записей в блоге
    1
    По сути отличие только в том, что ассемблерная вставка заносится сначала в DATA, а потом перегоняется в массив, а у Вас изначально в массиве.
    В других программах у меня всё в DATA, заносится через POKE и тоже не работает после компиляции, буду ковырять дальше. На проблему наткнулся совершенно случайно...
    Ответить с цитированием  
     

  10. #10  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    >Quiet Snow<, покажите пример такой программы, если не сложно.
    Ответить с цитированием  
     

Страница 1 из 2 12 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •