Математика ASM

Тема в разделе "WASM.BEGINNERS", создана пользователем Andrei, 17 апр 2018.

  1. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Не особо силен в ASM.
    Только изучаю, подскажите как вот это сделать ...
    Как ПРАВИЛЬНО !
    Записать функцию int sm=((((y-1)*40)+x)*2)-2;
    на x86 ASM ?
    Исходные данные:
    40 константа
    al; x
    ah; y
    di; результат ?
     
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Andrei,
    сперва покажи, ЧТО сделал САМ, дальше поможем
    вычитание команда SUB
    сложение команда ADD
    умножение команда MUL
    поместить команда MOV
     
    avanti нравится это.
  3. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Код (C):
    1. void sm ()
    2. {
    3. asm {
    4.          mov ah,y   // Записываем у в ah
    5.          mov ax,ah // Записываем у в ax
    6.          sub ax,1     // Вычитаем 1
    7.          mov ch,ax // Переносим в ch
    8.          mov al,40  // Записываем константу
    9.          mul ch      // Умножаем
    10.          //add ax,2 //
    11.          add ax,x  //Прибавляем x
    12.          mov ch,ax // Переносим в ch
    13.          mov al,2  // заносим константу в al
    14.          mul ch   // умножаем
    15.          sub ax,2 // вычитаем 2
    16.          mov di,ax // сохраняем результат в di
    17.          }
    18. }
     
    Последнее редактирование модератором: 7 май 2018
  4. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Нужно ли при этом регистры в стеке сохранять ?
    push
    pop

    Делать ? И какие регистры нужно сохранять обязательно ?
     
  5. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Andrei,
    ((y-1)*40+x)*2-2=80y+2x-82
    Код (ASM):
    1. mov al,80
    2. mul y; ax=80*y
    3. sub ax,82
    4. mov bh,0
    5. mov bl,x
    6. add bx,bx; bx=x*2
    7. add ax,bx; ax=((y-1)*40+x)*2-2
    8. mov di,ax
     
    Последнее редактирование: 7 май 2018
    Andrei и HESH нравится это.
  6. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Держи. Вот так правильно по условию.

    Код (ASM):
    1.  
    2.     mov al, 7 ; Init X = 7
    3.     mov ah, 19 ; Init Y = 19
    4.  
    5.     movzx di, ah ; di = y
    6.     dec di ; di = (y-1)
    7.     imul di, di, 40 ; di = (y-1)*40
    8.     and ax, 0FFh ; ax = al = x ()
    9.     add di, ax ; di = ((y-1)*40)+x
    10.     shl di, 1 ; di = (((y-1)*40)+x)*2
    11.     sub di, 2 ; di = ((((y-1)*40)+x)*2)-2
    12.    
    P.S. А вообще, я бы не стал использовать для этого 8- и 16-битные регистры. Вполне приемлемы и 32, если софтина не досовская.

    Не факт что нужна такая оптимизация. Скорее всего это кусок лабы. Преподы спецом могут такие задачи ставить, хотя такой вариант и правильнее.
    P.S.: код может быть оптимизирован еще лучше.
     
    Последнее редактирование: 17 апр 2018
    Andrei нравится это.
  7. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Насчет раскрытия скобок, и упрощения может быть и сработает, попробую, ...
    В любом случае, я понял как решаются подобные вещи )
     
  8. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    ..да хоть и досовская, лишь-бы проц на борту был 386+
     
  9. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Коцит,
    судя по комментариям ― это вставка в Си, то есть, вряд ли C под DOS, да и топик я перенес из Win32, так что скорее всего это 386+
     
  10. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    Mikl___, ясно...
    просто я имею ввиду, что и в R-моде можно юзать 32-бит регистры.
     
  11. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Си под таки под Dos, компилятор Turbo C ver 3.2.
     
    Последнее редактирование: 18 апр 2018
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Коцит,
    можно, то оно можно, только вот Turbo C ver 3.2 не поймет, хотя, можно и в машинных кодах (через db), только это преподаватель не оценит :)
     
  13. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    А не подскажите какую IDE ASM под win (dos) лучше неопытному использовать, ну там masm, tasm и.т.д
    Я вот допустим хочу написать код чтобы светодиод scroll на клавиатуре начал мигать, секунду горит секунду не горит ...
     
  14. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Определись сначала с языком masm/tasm. Я, например, предпочитаю MASM и Notepad++, IDE, как правило, сильно тормозные. Компилить и батниками можно, а отлаживать при помощи OllyDbg.
    Однажды батники мне надоели и я написал для компиляции проектов плагин для Notepad++. Вообщем я предпочитаю не среды разработки, а блокнот.

    Это вполне нормальная простенькая задача для новичка. Имитируй нажатие на клавишу и все :)
     
  15. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ok, а кроме имитации нажатия клавиши есть варианты ? Например запись по адресу регистра бита включения светодиода ? Ведь есть же где то в памяти регистр хранения вкл выкл светодиода (1 или 0) ???
     
  16. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    это в досе можно, а винда не пускает к портам - получишь исключение:

    0011.png
     
  17. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Andrei,
    если писать под Windows, то можно использовать WinAPI, которое будет включать/выключать лампочки на клавиатуре (например keybd_event) или написать драйвер, который даст доступ на запись байта в порт 60h, младшие три бита этого байта будут определять состояние светодиодов на клавиатуре, но для начала определись ― под какую систему будешь писать (DOS/Win32/Win64)?
     
    vasya нравится это.
  18. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Для начала DOS ...