Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Всмысле дизассемлированный код из обработчика?
    Код (Text):
    1. mov ecx, 23
    2. push 30
    3. pop fs
    4. mov ds, cx
    5. mov cs, cx
    6. ...
    Если речь об этом, то не нужно :)
     
  2. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Ладно, давайте по-другому: где формируется трап-фрейм?
     
  3. CHeRTeNok

    CHeRTeNok New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2011
    Сообщения:
    1
    Как добраться до сектора с содержимым файла в FAT32?
    Файл не дефрагментирован.
     
  4. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Нектуально. Нашел этот самый KiFastCallEntry
     
  5. stupidstudent

    stupidstudent New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2012
    Сообщения:
    1
    добрый день.
    нужно чтобы по выбору пользователя выводилось число из 2х мерного массива, которое захотел пользователь .... как сделать не знаю.

    Код (Text):
    1. include macro.lib
    2.  
    3. data segment
    4. mas db 3 dup(4 dup(?))
    5. v1 db 'vvedite elementy: $'
    6. viv db 'vy vveli elementy: $'
    7. viv2 db 'vvedite nomer stroki: $'
    8. viv3 db 'vvedite nomer stolbca: $'
    9. s db ?
    10. e db ?
    11. probel db ' $'
    12. data ends
    13.  
    14. sst segment stack
    15. db 128 dup (?)
    16. sst ends
    17.  
    18. code segment
    19. assume ss:sst, cs:code, ds:data
    20.  
    21. metka:
    22.  CLS
    23.  CRLF
    24.  mov dx,data
    25.  mov ds,dx
    26.  mov bx, 0
    27.  mov cx, 3 ; строки
    28.  
    29. m1:
    30.  mov si, 0
    31.  push cx
    32.  mov cx, 4 ; элементы
    33.  
    34. m2:
    35.  message v1
    36.  key_$2bin
    37.  CRLF
    38.  mov mas[bx][si], al
    39.  inc si
    40.  loop m3
    41.  jmp m4
    42.  
    43. m3:
    44.  jmp m2
    45.  
    46. m4:
    47.  pop cx ; из стека возвращаем счетчик внесенного цикла
    48.  add bx, 4; увеличение смещения строки на длину строки
    49.  loop m5
    50.  jmp m6
    51.  
    52. m5:
    53.  jmp m1
    54.  
    55. m6:
    56.  CLS
    57.  message viv
    58.  CRLF
    59.  mov bx, 0
    60.  mov cx, 3
    61.  
    62. m7:
    63.  mov si, 0
    64.  push cx
    65.  mov cx, 3
    66.  
    67. m8:
    68.  mov al, mas[bx][si]
    69.  cbw
    70.  print_number
    71.  message probel
    72.  inc si
    73.  loop m9
    74.  jmp m10
    75.  
    76. m9:
    77.  jmp m8
    78.  
    79. m10:
    80.  pop cx
    81.  add bx, 4
    82.  loop m11
    83.  jmp m12  
    84.  
    85. m11:
    86.  crlf
    87.  jmp m7
    88.  
    89. m12:
    90.  cls
    91.  message viv2
    92.  key_$2bin
    93.  clrf
    94.  mov s, al
    95.  mov al, s
    96.    
    97.    
    98.  message viv3
    99.  key_$2bin
    100.  crlf
    101.  
    102.  
    103.  
    104. mov ax,4c00h
    105. int 21h
    106. code ends
    107. end metka
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    stupidstudent
    bx не нужен. Т.к. для "пробега" по массиву достаточно увеличения si. И вообще для твоей задача бегать не нужно. Достаточно вычислить расположение элемента и считать его. Типа si=4*I+J-1 , где I и J заданные юзером. Возможно I и J в формуле надо поменять. Я давно уже такой элементарщиной не занимаюсь. В крайнем случае с помощью отладчика "подправляю".
     
  7. SUNNY

    SUNNY Member

    Публикаций:
    0
    Регистрация:
    1 окт 2009
    Сообщения:
    32
    Какой способ описания сегментов в MASM32 идеалогически более верный?
    Код (Text):
    1. .data
    или
    Код (Text):
    1. dseg segment
    2. dseg ends
     
  8. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    SUNNY
    Да пофигу какой, какой нравится.
    .data -- это способ описания сегмента с помощью упрощенных директив, с 5-ой версии масма появилась.

    Разница в том, что если вы юзаете обычные директивы, например
    Код (Text):
    1. STACK     SEGMENT   PARA     STACK   'Stack'
    2. DATASEG SEGMENT    PARA    'Data'
    3. etc
    То вы вынуждены описывать каждый сегмент.
    Ручками.

    А если упрощенные директивы, то транслятор сам сиим займется. Только надо указать модель.

    Код (Text):
    1. .MODEL    SMALL
    2. .STACK    64
    3. .DATA
    4. .CODE
    Как видите тут следует только указывать размер стека.
     
  9. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    Забыл добавить -- вообще вопрос у вас немного не корректен.
    МАСМ32 -- это просто СДК, пакет так скажем, а способ описания сегментов относится только к транслятору, ml.exe. То есть непосредственно к ассемблеру масм.
    Поэтому тут может возникнуть заблуждение, что вы интересуетесь вин32. А ей на сегменты пофигу.
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Если сегментов данных максимум два (.data/.data?) и один сегмент кода, тогда голову ломать ни к чему
    Код (Text):
    1. .model tiny(или small или flat)
    2. .code
    3. start: ...
    4. end start
    но вот если потребуется model huge/medium/compact/large/tchuge, то есть более одного сегмента кода, более двух сегментов данных, тогда придется использовать segment, assume, ends и т.п.
     
  11. SUNNY

    SUNNY Member

    Публикаций:
    0
    Регистрация:
    1 окт 2009
    Сообщения:
    32
    Тогда подкорректирую: мой вопрос относится к той версии ml.exe, что входит в состав MASM32,v.11

    Интересуюсь написанием простых программ и для DOS, и для win32, как консольных, так и GUI. Но начну с DOS.

    А вообще запутался я с этими директивами. Если гуглишь по DOS-приложениям, то находятся доки в основном по TASM (который как я слышал сейчас мёртв), самая вменяемая книга из институтской библиотеки описывает NASM, а изучать я вообще-то MASM собрался. А везде ведь всё по разному.

    Или вот только что сказали про модель TINY. Вот тут, например, сказано, что в директиве .MODEL может применяться: TINY, SMALL, MEDIUM, COMPACT, TCHUGE. А в моей книге сказано, что можно SMALL, MEDIUM, COMPACT, LARGE, HUGE, TCHUGE, FLAT и ещё могут быть модификаторы USE16 и USE32, а вот про TINY не слова.

    И ещё такой вопрос. Вот есть директива ASSUME, в которой я прописываю какой сегментный регистр при выполнении программы на какой сегмент указывает. Если я поступлю вторым способом через упрощённые директивы, то сегменты у меня будут неименованы, что же тогда в ASSUME писать?
     
  12. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    SUNNY
    Вот сие более верно, да. :) Там 6.14 вроде.

    Вообще самые годные книги по асму для начинающих имхо конечно -- это Лео Скэнлон и Питер Абель. Скэнлон правда там вообще седая древность, масм 2.0 по-моему описывает. Абель более современен, там масм где-то 6-ой версии или 5-ой. Объясняют оба хорошо, в старых книгах намного круче объясняют. Так что советую прикупить абеля и начать изучить, база имхо хорошая.
    Можно юзать и тасм, есть и такие некрофилы до сих пор. Неподдерживаемые инструкции добавляют через db или макросами, юзают переправленный пакет хатча и т.п. Короче извращаются как могут хехе.

    Ну значит атору спасибо скажите. :)

    ассмуме для упрощенных директив не используется.
     
  13. SUNNY

    SUNNY Member

    Публикаций:
    0
    Регистрация:
    1 окт 2009
    Сообщения:
    32
    MMIX
    То есть без разницы использовать MASM v.6 или MASM32, сам ассемблеровщик в них одной и той же версии. А в чём тогда различия пакетов, тем что MASM32 предоставляет большую библиотеку инклюдов для современных WIN32-приложений?

    Может я неправильно понимаю смысл директивы ASSUME?
    Вот что означает такая запись:
    Код (Text):
    1. ASSUME DS:DSEG, CS:CSEG
    2. DSEG   SEGMENT
    3. A        DB (?)
    4.           ;...
    5. DSEG   ENDS
    6. CSEG   SEGMENT
    7. start:  ;...
    8. CSEG   ENDS
    Что в начале выполнения программы в DS заносится адрес сегмента DSEG, в CS - адрес сегмента CSEG, в IP - смещение сегмента CSEG, то есть нет необходимости в командах:
    Код (Text):
    1. mov AX, DSEG
    2. mov DS, AX
    Почему же тогда вот в этом хеллоуворде они есть?
     
  14. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    SUNNY
    Ну если короче то,

    сам ассемблер (транслятор) -- ml.exe, линковшик -- link.exe. все. это не пакет.

    masm32 -- это сборная солянка:
    транслятор, линкер в комплекте с ватниками + трансляторы для роасма;
    инклуды разныя -- windows.inc (константы и проч.), прототипы функций, библиотеки импорта и т.д.;
    примеры кодеса, библиотека сопроцессорная, хэлп, наборы макросов, туторы икзелиона, редакторы кодеса и создатели гуев и прочая, и прочая.

    Вся эта приблуда в общем-то и не нужна, по крайней мере вам для доса.

    Вы правильно понимаете. Ассуме указывает транслятору, к какому регистру надо привязать сегмент, т.е., по сути определяет назначение сегмента.

    Вот процитирую Абеля:

    SUNNY
    Потому что мы заносим в регистр ДС физический адрес.
     
  15. SUNNY

    SUNNY Member

    Публикаций:
    0
    Регистрация:
    1 окт 2009
    Сообщения:
    32
    MMIX
    Не понял. Физический адрес состоит из сегмента и смещения. Сегмент мы определили директивой ASSUME. Так зачем же заносить адрес в DS, если он и так там уже там присутствует?
     
  16. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    SUNNY
    Физический адрес -- это ячея в памяти на физ уровне.
    Сегмент + смещение есть логический адрес.

    Адрес там не присутствует. Условно говоря мы просто сказали транслятору что дс будет использоваться как база сегмента данных и усе. Адресов конкретных транслятор не знает. А потом при загрузке программы в память они появляются, и мы их юзаем. Я не смогу все это вам грамотно объяснить (ибо сам понимаю сие на подсознательном уровне, да и то фрагментарно).

    Лучше возьмите, напишите хэллоуворд (с обычными и с упрощенными директивами определения сегментов), посмотрите кодес как конпилится (создайте .lst), а потом проверьте под отладчиком debug
     
  17. SUNNY

    SUNNY Member

    Публикаций:
    0
    Регистрация:
    1 окт 2009
    Сообщения:
    32
    MMIX
    Посмотрел листинг. Да, директива ASSUME действительно никакого кода не генерирует. Кроме того, obj-файлы в которых она присутствует и в котоом она отсутствует абсолютно идентичны. Так для чего же вообще она нужна, если ассемблер на неё не реагирует?
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    SUNNY
    Похоже что мой ответ в #2534 ты не прочитал, а зря. Посмотрел доки, оказывается применять упрощенный способ описания сегментов можно для всех типов моделей памяти. Если у тебя более одного сегмента памяти, то он задается так: .code имя_сегмента, для моделей памяти с более чем один сегмент данных он (сегмент данных) задается так: .fardata имя_сегмента и забудь, как страшный сон о директивах SEGMENT, ENDS и ASSUME
    привожу табличку
    Код (Text):
    1. Модель | Код |Данные| Кодовых |Сегментов|                                  |     Тип   | ОС
    2.        |     |      |сегментов|  данных |Предполагаемые значения регистров | программы |
    3. -------+-----+------+---------+---------+----------------------------------+-----------+---
    4. TINY   | near| near | один    | нет     |       CS=DS=SS=ES=DGROUP         |   com     | DOS
    5. SMALL  | near| near | один    | один    |       CS=_TEXT DS=SS=ES=DGROUP   |   exe     | DOS
    6. MEDIUM | far | near |несколько| один    | CS=<имя_модуля>_TEXT DS=SS=DGROUP|   exe     | DOS
    7. COMPACT| near| far  | один    |несколько|    CS=_TEXT DS=SS=ES=DGROUP      |   exe     | DOS
    8. LARGE  | far | far  |несколько|несколько| CS=<имя_модуля>_TEXT DS=SS=DGROUP|   exe     | DOS
    9. HUGE   | far | far  |несколько|несколько| CS=<имя_модуля>_TEXT DS=SS=DGROUP|   exe     | DOS
    10. TCHUGE | far | far  |несколько|несколько|CS=<имя_модуля>_TEXT DS=SS=NOTHING|   exe     | DOS
    11. TPASCAL| near| far  | один    |несколько|     CS=CODE DS=DATA SS=NOTHING   |   exe     | DOS
    12. FLAT   | near| near | один    |несколько|     CS=_TEXT DS=SS=ES=FLAT       |exe,dll,sys|Windows32,OS/2
     
  19. SUNNY

    SUNNY Member

    Публикаций:
    0
    Регистрация:
    1 окт 2009
    Сообщения:
    32
    MMIX
    Mikl___
    Мало что понял из этих моделях, может потом пойму. Я так понимаю, можно в DOS программах использовать SMALL и не париться, а в WINDOWS только FLAT без вариантов. И зачем директивы я кажется догадываюсь, чтобы ассемблер знал близкие или долгие команды формировать.
    Вообще не думайте, что я про ассемблер узнал чисто из интернета, я и бумажные книги читал, Пильщикова вот книгу (если кто знает) прочитал полностью, там правда MASM 4 описывается. Теперь у меня следующий шаг, не изучать принцыпы, а что-то реально работающее создавать.
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    SUNNY
    Используй упрощенные директивы описания сегментов и указывай используемую модель памяти, всё остальное остальное за тебя сделают компилятор и линкер