Помогите найти ошибки в программе

Тема в разделе "WASM.BEGINNERS", создана пользователем albertik, 27 мар 2011.

  1. albertik

    albertik New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2011
    Сообщения:
    10
    Прошу знающих людей проверить, есть ли ошибке в данной программе. Программа составлена для решения уравнения y=4x1-2x2+3x3+x4. При этом х1=41, х2=1В, х3=08, х4=1D. Коды команд приведены для процессора К580. Это первая программа, которую я пишу на ассемблере, поэтому мне очень важно разобраться во всем детально.
    [​IMG]
    Если написал не в том разделе, то прошу прощения и прошу перенести в соответствующий раздел.
     
  2. albertik

    albertik New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2011
    Сообщения:
    10
    Неужели никто не подскажет?
     
  3. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Правильно процессор называется К580ВМ80А?
    Возьми эмулятор под него, и посмотри.
    Вряд ли кто-то сейчас вспомнит, то, что умерло 20 лет назад.
    Я уже не помню, даже синтаксиса.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    В таблице трудно разбираться, на глаз. В следующий раз пиши в виде кода. Могу только сказать, что логичнее сразу набивать все в А, без предварительных загрузок регистров. Как-то так:

    Код (Text):
    1. mvi A, #x1
    2. add a  ;a=2X1
    3. add a  ;a=4X1
    4. mvi B, #x2
    5. sub b  ;a=4x1-x2
    6. sub b  ;a=4x1-2x2
    7. mvi b, #x3
    8. add b
    9. add b
    10. add b
    11. mvi b, #x4
    12. add b
    Потому что место в памяти не резиновое, и регистров кот наплакал ;)
    И еще - в зависимости от задачи, может быть переполнение (если к примеру X1>64) аккумулятора. По хорошему, сумму надо организовывать в регистровой паре, или вообще в памяти, и учитывать переполнение.
     
  5. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Есть ошибка.
    В операции 17 в регистр C Вы кладёте 2x2+3x3+x4
    После вычитания в 19 у Вас будет 4x1-2(x2+3x3+x4), а не 4x1-2x2+3x3+x4
     
  6. albertik

    albertik New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2011
    Сообщения:
    10
    Спасибо. Учту.
    То есть сложением содержимого двух регистров?
     
  7. albertik

    albertik New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2011
    Сообщения:
    10
    Спасибо. А как правильно написать в данном случае?
     
  8. FatMoon

    FatMoon New Member

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

    mvi a, #1
    add a
    xchg a, h
    aci 0
    xchg a, h
    ...

    или манипуляциями с jc / jnc:

    mvi a, #1
    add a
    jnc @next
    inr h
    @next:
    ...

    , или с rlc (или как оно там на вм80). Понятно, о чем говорю? При переполнении в результате сложения или вычитания будет поднят флаг С. Если его не учитывать, то 4*72 = 20h. а если учитывать, то все-таки 120h
     
  9. albertik

    albertik New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2011
    Сообщения:
    10
    FatMoon, спасибо. Будем разбираться. И еще, какой командой выводится результат вычислений? Скачал себе эмулятор К580ВМ80, а разобраться с ним не могу.
     
  10. albertik

    albertik New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2011
    Сообщения:
    10
    Исправил программу
    Код (Text):
    1. mvi b, 41
    2. mvi c, 1B
    3. mvi d, 08
    4. mvi e, 1D
    5. mov a, b
    6. add a
    7. add a
    8. sub c
    9. sub c
    10. add d
    11. add d
    12. add d
    13. add e
    14. mov b, a
    Теперь эмулятор дает результат 03, по моим подсчетам должно быть 103 (4*41-2*1B+3*08+1D*=*103). Но, как я понял из работы стенда, в регистрах не может быть 3-значных чисел. Как быть, подскажите, а то зашел в тупик :-(
    [​IMG]
     
  11. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Не 3-х значных чисел, а... в ВМ80А 8-битные регистры. Могут содержать число от 0 до 255 (от 00 до FF шестнадцатиричного). Если в результате очередной арифметической операции происходит переполнение (получается больше 255 или меньше 0), взводится флаг С (перенос). Перенос надо обрабатывать, складывать в другой (предварительно обнуленный, конечно же) регистр, где будет старший байт. Я ж как раз про это и написал, не?
    Во, кстати - напиши подпрограмму (даже 2):

    IncrH sub
    inr h
    ret
    end sub

    DecrH sub
    dcr h
    ret
    end sub

    Код (Text):
    1. mvi h, 0
    2. mvi b, 41
    3. mvi c, 1B
    4. mvi d, 08
    5. mvi e, 1D
    6. mov a, b
    7. add a
    8. cc IncrH
    9. add a
    10. cc IncrH
    11. sub c
    12. cc DecrH
    13. sub c
    14. cc DecrH
    15. add d
    16. cc IncrH
    17. add d
    18. cc IncrH
    19. add d
    20. cc IncrH
    21. add e
    22. cc IncrH
    23. mov l, a
    Результат - правильная сумма в паре регистров HL :))) сс - это условный call (call if Carry), есть такая команда на ВМ80. Хотя правильнее (короче, экономнее с регистрами), как припоминаю, писать 2 подпрограммы (сложение с переносом) и (вычитание с переносом). Например SummABH и SubsABH. Тогда будет выглядеть так:

    Код (Text):
    1. mvi A, #x1
    2. mov B, A
    3. call SummABH
    4. mov B, A
    5. call SummABH
    6. mov B, #x2
    7. call SubsABH
    8. call SubsABH
    9. mov B, #x3
    10. call SummABH
    11. call SummABH
    12. call SummABH
    13. mov B, #x4
    14. call SummABH
    15. mov L, A
    А в процедуре что-то вот такое:
    Код (Text):
    1. SummABH sub
    2. add A, B
    3. xchg A, H
    4. aci 0
    5. xchg A, H
    6. ret
    7. end sub