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

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

  1. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
  2. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Назовите старший физический адрес буфера, если начало буфера (первый байт) находится по физическому адресу 0xb8000, а размер буфера равен 16кб? Поясните вычисления.
     
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Задача детская.
    0xb8000 + 0x4000 - 1 = 0xbbfff
     
    2Hard2Forget нравится это.
  4. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Я понимаю, что 0xb8000 - это начало буффера видеопамяти, а что такое 0x4000, зачем прибавлять 0х4000 и зачем минус один - уже не совсем понятно
     
  5. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Помимо сокетов IOCP в ОС Windows можно использовать и для других видов объектов. Какие виды объектов поддерживаются IOCP? К сокетам применяют WSARecv и WSASend, а какие функции применяют для чтения/записи к другим объектам при использовании IOCP?
     
  6. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    600
    Кто нибудь реализовывал стандартную библиотеку Си под MS-DOS для программирования на ассемблере?
    Имеется ввиду набор стандартных функций типа printf и т.п. Я недавно сделал несколько макросов(тот же printf, но пока без float'ов), и да, придётся реализовывать через макросы, или ещё как, чтобы код подключался по мере необходимости. Вроде что-то на форуме не так давно мелькало, но точно не помню что.
    Отдельную тему пока не создаю, т.к. ещё ничего не готово.
     
  7. JhonyBoy

    JhonyBoy New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2020
    Сообщения:
    6
    Hi!
    Задача следующая: задать одномерный массив, состоящий из 10 элементов. Заполнить массив константами. Переместить заданный массив в другую область памяти (другой массив), поменяв местами элементы с чётными и нечетными номерами (поставив каждый элемент с четным номером на место нечетного элемента и каждый элемент с нечетным номером - на место четного)
    a) элементы массива - однобайтовые;
    б) элементы массива - двухбайтовые.
    Работаю в emo8086. Написал следующий код:
    Код (Text):
    1. #fasm#
    2. use16
    3. org 100h
    4.  
    5.      len equ 10
    6.      oldArray db 2,0,1,3,4,1,2,6,4,7
    7.      newArray db ?,?,?,?,?,?,?,?,?,?
    8.    
    9.      mov  cx,len
    10.      shr  cx,1
    11.      mov  si,oldArray
    12.      mov  di,newArray
    13. @00: lodsd
    14.      rol  ax,16
    15.      stosd
    16.      loop @00
    17.    
    18. ret
    19.  
    Программа работает некорректно, в чем может быть проблема?
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Код (Text):
    1. AA STOSB Store AL at address ES:(E)DI
    2. AB STOSW Store AX at address ES:(E)DI
    3. AB STOSD Store EAX at address ES:(E)DI
    stosd в use16 конпелируется как 66 AB (Operand-size override prefix, 16/32), stosw как AB. В 32-бит режиме этот префикс отличает stosw от stosd. Скорей всего в 16-бит режиме вообще фасм должен отказываться lodsd/stosd конпелировать. В любом случае заменяй на lodsw/stosw, это же логично.
    --- Сообщение объединено, 13 апр 2020 ---
    Кстати да, крутить 16-бит регистр циклическим сдвигом на 16 бит влево это тоже по-своему шедевр. xchg al,ah и не выёживайся.
     
    Последнее редактирование: 13 апр 2020
  9. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    JhonyBoy,
    а программа действительно скомпилировалась? Ведь она у тебя работает? Или ты нас обманываешь? У меня сомнения, что emu8086 знает команды lodsd и stosd, а потом, что произойдет с содержимым 16 разрядного регистра АХ когда над ним выполнят операцию циклического сдвига влево 16 раз? Правильно, все разряды снова встанут на свои места
     
  10. JhonyBoy

    JhonyBoy New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2020
    Сообщения:
    6
    Честно говоря я уже потерялся :-%
    На самом деле она скомпилировалась, выполняется циклично до тех пор, пока регистр AX не будет нулевым.
     
  11. НетРегистрации

    НетРегистрации Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    72
    в emo8086, в fasm (не знаю)
    ;rem в xxxx.bat
    ; C:\masm32\bin\ml /AT /c /omf /FlA.LST /FeA.com /TaA.ASM
    ; C:\masm32\bin\link16 a.obj,a.com,,, /TINY

    Code Segment
    .486
    org 100h
    Start:
    ; mov cx,len/2 ; однобайты
    mov cx,len/4
    ClD
    mov si,offset [oldArray]
    mov di,offset [newArray]
    _0:
    ; lodsw ; однобайты
    ; xchg al,ah ; однобайты
    ; stosw ; однобайты
    lodsd
    RoL eAx,16
    stosd
    loop _0

    Mov Ah,4Ch ;ФУНКЦИЯ 4С КОНЕЦ ПРОГРАММЫ,
    Int 21h ;Al=КОД ВОЗВРАТА ДЛЯ ERRORLEVEL

    Align 16
    oldArray db 2,0,1,3,4,1,2,6,4,7
    Align 16
    newArray db ?,?,?,?,?,?,?,?,?,?
    len equ 10

    Code EndS
    End Start
     
    Последнее редактирование: 14 апр 2020
    JhonyBoy нравится это.
  12. JhonyBoy

    JhonyBoy New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2020
    Сообщения:
    6
    Привет!

    Есть два числа в шестнадцатеричной сс.
    Число А = D11
    Число B = EF51E

    Необходимо их сложить. Вот код, который я написал.
    Код (Text):
    1. #fasm#
    2. use16
    3. org 100h
    4.       mov ax,0D11h
    5.       mov bx,0EFh
    6.       mov cx,51Eh
    7.       adc ax,bx
    8.       adc ax,cx
    9. hlt
    При сложении A и B ответ должен получится F022F. При выполнении программы в регистр AX записывается 13Е1.[​IMG]
    В чем заключается ошибка и как её исправить?
     
  13. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Не должен. Открой справочник по инструкциям x86 и найди описание adc:
    Если практикуешь 16-битный мазохизм, то тебе надо сложить (add) младшие 16 двоичных разрядов (0D11 и F51E) обоих чисел (переполнение окажется в carry флаге), затем с учетом этого переполнения сложить старшие (0 и E) 16 бит чисел (adc). Каждый разряд в нехе это 4 бита, 16 бит это четыре разряда.
    Код (Text):
    1. mov ax,0x0D11
    2. mov cx,0xF51E
    3. mov bx,0x0E
    4. add ax,cx
    5. adc bx,0
     
    Последнее редактирование: 21 апр 2020
  14. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Я, как человек знающий асм лишь чуток, погуглив нашел, по моему, то что надо:
     
  15. JhonyBoy

    JhonyBoy New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2020
    Сообщения:
    6
    А вот для чисел -9C3BA9A и -9066 в hex программа верна?
    Код (Text):
    1. #fasm#
    2. use16
    3. org 100h
    4.  
    5.         mov ax,0x-9066
    6.         mov cx,0xBA9A
    7.         mov bx,0x9C3
    8.         add ax,cx
    9.         adc bx,0
    10.  
    11. hlt
    И для пары десятичных -406608 и 106198
    Код (Text):
    1. #fasm#
    2. use16
    3. org 100h
    4.  
    5.         mov ax,-13392
    6.         mov cx,-7894
    7.         mov bx,-12
    8.         mov dx,12
    9.         add ax,cx
    10.         adc bx,dx
    11.  
    12. hlt
     
  16. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    И для отрицательных и для десятичных. Тебе осталось только прочитать где-нибудь (в конспекте) как отрицательные числа кодируются и вписать 4 константы в исходник. Я за каким-то смыслом пытался объяснить так, чтобы стало понятно, но похоже не в коня корм.
     
  17. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    600
    Как в приложении windows включить полноэкранный режим, можно ли настроить прерывание по обратному году луча(чтобы работало на частоте монитора)? В DOS это всё легко сделать, а как в виндосе?
     
  18. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    А что за приложение?
    Можно многими путями сделать, к примеру через Direct3D/2D. Также можно обычное окно без рамки на весь экран раскрыть.
     
  19. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    600
    Порт игры Battle City. Делать наверно лучше через OpenGL, графический режим 320х240х256 или 640х480х256, обработчик окна должен вызываться на частоте 60 Гц. Как-то так, сейчас делаю вариант для DOS'а, но я ещё хочу сделать и для Win32 чтобы от XP(или меньше) и до 10-ки работало.
     
  20. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    С OpenGL не знаком, могу только по Direct3D/2D/Draw подсказать. Вообще BattleCity совсем простая, там возможностей GDI хватит за глаза. Если нужно именно 60Гц, то проще сделать через мультимедийный таймер, если нужна привязка именно к частоте монитора (vsync) то для GDI решения можно воспользоваться функцией D3DKMTWaitForVerticalBlankEvent.