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

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

  1. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Ну это так - приблизительно. Сейчас на асме напишу.
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    AntonBV
    На FASM`е примерно так
    Код (Text):
    1. org 100h
    2. mov si,a
    3. mov cx,16
    4. main:lodsw
    5.      mov  dx,si
    6.      shl  dx,30
    7.      test ax,dx ;если индекс нечётный и число отрицательное
    8.      jnl  @2
    9.      add  [sum2],ax
    10.      adc  [sum2+2],0
    11.      jmp  quit
    12.      @2:
    13.      xor  dx,ax ;если индекс чётный и число положительное
    14.      jl   quit
    15.      add  [sum1],ax
    16.      adc  [sum1+2],0
    17.      quit:
    18. loop main
    19. ret
    20.  
    21. sum1  dw 0
    22. sum2  dw 0
    23. align 4 ;первая ячейка имеет чётный индекс (бит 1 установлен)
    24. a     dw 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
    В коде возможны ошибки
     
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Ukito
    y = (a^2*b)+((a-10*c)/(5*b*c))=a*a*b+a/(5*b*c)-2/b :)
     
  4. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Код (Text):
    1. org  100h
    2. mov  si,a
    3. mov  cx,16
    4. main:lodsw
    5.      mov  dx,si
    6.      shl  dx,14
    7.      test dx,ax ;если индекс нечётный и число отрицательное
    8.      jns  @2
    9.      add  word[sum2],ax
    10.      adc  word[sum2+2],0
    11.      jmp  quit
    12.      @2:
    13.      or   dx,ax ;если индекс чётный и число положительное
    14.      js   quit
    15.      add  word[sum1],ax
    16.      adc  word[sum1+2],0
    17.      quit:
    18. loop main
    19.  
    20. mov  ax,3
    21. int  10h
    22.  
    23. push 0B800h
    24. pop  es
    25. mov  ax,word[sum1];печатаем первую сумму (2 знака)
    26. aam
    27. add  ax,3030h
    28. mov  [es:0],ah
    29. mov  [es:2],al
    30. mov  ax,word[sum2];печатаем вторую сумму (2 знака)
    31. neg  ax
    32. aam
    33. add  ax,3030h
    34. mov  byte[es:160],'-'
    35. mov  [es:162],ah
    36. mov  [es:164],al
    37.  
    38. xor  ax,ax
    39. int  16h
    40. ret
    41.  
    42. sum1  dd 0
    43. sum2  dd 0
    44. align 32 ;первая ячейка имеет чётный индекс (бит 1 не установлен)
    45. a     dw -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7
     
  5. SpiRiToiD

    SpiRiToiD New Member

    Публикаций:
    0
    Регистрация:
    12 май 2009
    Сообщения:
    9
    Добрый день, господа. Нуждаюсь в вашей помощи, у меня правда не совсем лабораторная работа, но по масштабам наверняка от нее мало отличается. В общем в нашем учебном заведении нам поясняли лишь самые базисы - а ля что такое mov, как складывать/вычитать, и вообще самый минимум... Я с удивлением глазею на функции возведения в степень - я там буквально каждую цифру или функцию вижу впервые.

    Но тем не менее появилась задачка, которую нужно было бы закончить до сессии, то бишь до 1 июня.

    Собственно суть в чем - есть 3 некоторых числа(они могут быть статическими и задаваться не пользователем, а быть в программе изначально), которые нужно сложить по принципу 1/x+1/y+1/z = 1/result. Задача получить этот result, то бишь полученную дробь нужно еще и перевернуть в конце, и конечно - вывести на экран. Учитывая мои знания в области Ассемблера, которые просто исчерпывающе малы, и тот язык, которым объясняют на наших лабах(настолько научный, что хоть бы слова разобрать, не то чтобы понять смысл текста), я смог добиться только лишь следующего:

    Код (Text):
    1.     .MODEL TINY
    2.     .STACK  100h
    3.  
    4.     .DATA
    5.  
    6.     A       dw  5 ;5 Om
    7.     B       dw  4 ;4 Oma
    8.     K       dw  3 ;3 Oma
    9.     D       dw  1 ;4islitel
    10.     Temp    dw ? ;Z1
    11.     Temp2   dw  ? ;Z2
    12.     Temp3   dw  ? ;Z3
    13.  
    14.     ASCIIstroka DB  'Rezultat: ',?,13,10,'$'
    15.  
    16.     .CODE
    17.     mov ax, @Data
    18.     mov ds, ax
    19.    
    20.     mov     ax, D
    21.     div     A
    22.     mov     Temp,dx
    23.     mov     ax, D
    24.     div     B
    25.     mov     Temp2,dx
    26.     mov     ax, D
    27.     div     K
    28.     mov     Temp3,dx
    29.     mov     ax,Temp
    30.     add     ax,Temp2
    31.     add     ax,Temp3
    32. ;[b]-- Тут что-то должно быть, но его нет --[/b]
    33.     mov     ah, 9          
    34.     mov     dx, OFFSET ASCIIstroka
    35.     int     21h
    36.        
    37.     mov     ax, 4C00h      
    38.     int     21h            
    39.  
    40.     END
    По сути я сложил остатки от деления 1 на числа 3, 4 и 5. А как дальше "перевернуть"(возвести в -1 степень) результат? И позже коим раком его на экран вывести - я уже как только не ломал. Нашел на вашем форуме возведение в степень, использовал 3 способа, все они выводят ошибки то Illegal instruction, то еще что-то, а сами понимаете - как они воспринимаются, когда их видишь впервые. Конечно, я не знаю, что с ними делать. Помогите пожалуйста с решением.

    Если что - о награде можем через ЛС договориться (:
     
  6. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    SpiRiToiD
    Вспоминаем алгебру и добавляем немного здравого смысла
    1/x+1/y+1/z = 1/result
    приводим к общему знаменателю (yz+xz+xy)/(xyz)=1/result
    result=xyz/(yz+xz+xy) и ничего не нужно переворачивать!
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    SpiRiToiD
    да, и переполнение при умножении xyz обработать не забудьте.
     
  8. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    все не правильно. Или я не понимаю, при чем тут остатки от деления.

    Код (Text):
    1. fild [x]
    2. fld1
    3. fdiv st0, st1
    4. fild [y]
    5. fld1
    6. fdiv st0,st1
    7. ;сейчас результат предыдущего деления в st2, в st1 y, в st0 результат последнего деления
    8. fadd st0,st2
    9. fild [z]
    10. fld1
    11. fdiv st0,st1
    12. fadd st0,st2 ;аналогично
    13. fld1
    14. fdiv st0,st1
    15. ;в st0 лежит результат. Его можно выгрузить в целом виде (отбрасывая все после запятой)
    16. fist dword[r]
    17. ;или с плавающей точкой - fst dword[r]
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    так конечно можно (на сопроцессоре решать), а надо было инструкциями процессора для работы с целыми числами ;)
     
  10. Daaamirka

    Daaamirka New Member

    Публикаций:
    0
    Регистрация:
    12 май 2009
    Сообщения:
    1
    Здравствуйте!
    Кто может помочь с освоением асма. нужно программный код грамотно написать.просто обратиться не к кому.Отпишите плиз в аську 349-270-020.Заранее благодарен.
     
  11. Po1ntMaker

    Po1ntMaker New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2009
    Сообщения:
    6
    Привет всем!
    Помогите написать простенькую программку
    условие в картинке
     
  12. Po1ntMaker

    Po1ntMaker New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2009
    Сообщения:
    6
    http://slil.ru/27643178 тут, прикреплением не получилось
     
  13. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Po1ntMaker, Daaamirka
    Охренеть до чего студент ленивый пошел! Да же задание лень написать!
     
  14. twista

    twista New Member

    Публикаций:
    0
    Регистрация:
    7 май 2009
    Сообщения:
    3
    Дайте ссылочку пожалуйста где почитать можно о работе с файлами
     
  15. newbie553

    newbie553 New Member

    Публикаций:
    0
    Регистрация:
    1 май 2009
    Сообщения:
    20
    вот тут например:
    Румянцев. - Работа с файлами в Win32 API.pdf
     
  16. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Только сейчас дошло, что требуется мультипликация, тогда вот это
    Код (Text):
    1. .286
    2. .model tiny
    3. .code
    4. .386
    5.     org   100h
    6. start:  mov   ax,3h
    7.     int   10h
    8.     mov ax,0B800h
    9.     mov es,ax
    10.     mov edi,20*80
    11.     mov ecx,40
    12. a1: push ecx
    13.         mov eax,72E075Fh
    14.     stosd         ; рисуем на экране штрих-пунктир
    15.     mov ah, 0 ; получить системное время
    16.     int 1Ah   ; cx:dx при возврате содержат число
    17.     mov bx, dx; тиков, прошедших от полуночи
    18. a2: mov ah, 0; снова получили системное время
    19.     int 1Ah ;организовали задержку на 55 мСек
    20.     cmp bx, dx
    21.     jz  a2
    22.     pop ecx       ;переходим к рисованию следующего
    23.     loop a1       ;штрих-пунктира, пока не доберемся
    24.     xor   ax,ax   ;до конца экрана
    25.     int   16h;нажатие на любую клавишу приводит к выходу из программы
    26.     ret
    27. end start
     
  17. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Po1ntMaker
    Код (Text):
    1. org   100h
    2. mov   ax,3h
    3. int   10h
    4.  
    5. push  40h
    6. pop   fs
    7. push  0B800h
    8. pop   es
    9. mov   dx,[fs:6Ch]
    10. mov   ax,30
    11.  
    12. @@:mov     di,ax
    13.    mov     di,word[keys+di]
    14.    test    di,di
    15.    cmovne  bx,di
    16.    mov     [es:0],bl
    17.    mov     cx,[fs:6Ch]
    18.    sub     cx,dx
    19.    cmp     cx,5*18
    20.    cmovae  bx,word[sost+bx-30h]
    21.    cmovae  dx,[fs:6Ch]
    22.    xor     bh,bh
    23.    in      al,60h
    24.    cmp     al,1
    25. jne @b
    26. @@:ret
    27.  
    28. sost    db '2','3','4','0','1'
    29. keys    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'4',0,0,0,0,0,0,0,0,0,0,0,'0',0,'3',0,0,0,0,0,0,0,0,0,0,0,0,0,'2',0,'1',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
    30.            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
    31.            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
    32.            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
     
  18. SpiRiToiD

    SpiRiToiD New Member

    Публикаций:
    0
    Регистрация:
    12 май 2009
    Сообщения:
    9
    Вы меня невероятно выручили. Вот что значит забить на математику. Заработало... Почти. У меня числа простые, в принципе, так что переполнений не будет. Возникла такая вот иниха - при делении командой div - в dx хранится остаток, такой, будто мы делили столбиком. Каким образом можно получить десятичный остаток? Скажем по моей формуле если числа 3, 4 и 5 - то получается 60/47 - и результат 1 и остаток 13, а хотелось бы получить нечто вида 1,2765....

    Зы и заодно - если возможно - то как обрезать полученную дробь допустим до 2 знаков (1,27).
     
  19. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    SpiRiToiD
    1) используй fpu -- как в примере FatMoon либо
    2) если хочешь получить дробь с точностью до 2 знаков, но используешь целочисленное деление -- предварительно умножаешь делимое на 1000, делишь, к частному добавляешь 5, чтобы было правильное округление, при выводе на экран или печать устанавливаешь запятую в нужную позицию
     
  20. SpiRiToiD

    SpiRiToiD New Member

    Публикаций:
    0
    Регистрация:
    12 май 2009
    Сообщения:
    9
    Майкл спс, совет бы подошел, но понимать надо при умножении на 1к получается переполнение?(Illegal Immediate, Arguments Need Type Override). Я вроде указывал, что я совсем мало чего смыслю - буду благодарен за ссылки на инфу или еще лучше - обьяснение, как такое дело устранить. Достаточно ли будет изменить тип всех переменных на dd с dw или нужно пол проги менять(регистры и тп)?