Прошу знающих людей проверить, есть ли ошибке в данной программе. Программа составлена для решения уравнения y=4x1-2x2+3x3+x4. При этом х1=41, х2=1В, х3=08, х4=1D. Коды команд приведены для процессора К580. Это первая программа, которую я пишу на ассемблере, поэтому мне очень важно разобраться во всем детально. Если написал не в том разделе, то прошу прощения и прошу перенести в соответствующий раздел.
Правильно процессор называется К580ВМ80А? Возьми эмулятор под него, и посмотри. Вряд ли кто-то сейчас вспомнит, то, что умерло 20 лет назад. Я уже не помню, даже синтаксиса.
В таблице трудно разбираться, на глаз. В следующий раз пиши в виде кода. Могу только сказать, что логичнее сразу набивать все в А, без предварительных загрузок регистров. Как-то так: Код (Text): mvi A, #x1 add a ;a=2X1 add a ;a=4X1 mvi B, #x2 sub b ;a=4x1-x2 sub b ;a=4x1-2x2 mvi b, #x3 add b add b add b mvi b, #x4 add b Потому что место в памяти не резиновое, и регистров кот наплакал И еще - в зависимости от задачи, может быть переполнение (если к примеру X1>64) аккумулятора. По хорошему, сумму надо организовывать в регистровой паре, или вообще в памяти, и учитывать переполнение.
Есть ошибка. В операции 17 в регистр C Вы кладёте 2x2+3x3+x4 После вычитания в 19 у Вас будет 4x1-2(x2+3x3+x4), а не 4x1-2x2+3x3+x4
Нет, последовательным сложением вида 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
FatMoon, спасибо. Будем разбираться. И еще, какой командой выводится результат вычислений? Скачал себе эмулятор К580ВМ80, а разобраться с ним не могу.
Исправил программу Код (Text): mvi b, 41 mvi c, 1B mvi d, 08 mvi e, 1D mov a, b add a add a sub c sub c add d add d add d add e mov b, a Теперь эмулятор дает результат 03, по моим подсчетам должно быть 103 (4*41-2*1B+3*08+1D*=*103). Но, как я понял из работы стенда, в регистрах не может быть 3-значных чисел. Как быть, подскажите, а то зашел в тупик :-(
Не 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): mvi h, 0 mvi b, 41 mvi c, 1B mvi d, 08 mvi e, 1D mov a, b add a cc IncrH add a cc IncrH sub c cc DecrH sub c cc DecrH add d cc IncrH add d cc IncrH add d cc IncrH add e cc IncrH mov l, a Результат - правильная сумма в паре регистров HL )) сс - это условный call (call if Carry), есть такая команда на ВМ80. Хотя правильнее (короче, экономнее с регистрами), как припоминаю, писать 2 подпрограммы (сложение с переносом) и (вычитание с переносом). Например SummABH и SubsABH. Тогда будет выглядеть так: Код (Text): mvi A, #x1 mov B, A call SummABH mov B, A call SummABH mov B, #x2 call SubsABH call SubsABH mov B, #x3 call SummABH call SummABH call SummABH mov B, #x4 call SummABH mov L, A А в процедуре что-то вот такое: Код (Text): SummABH sub add A, B xchg A, H aci 0 xchg A, H ret end sub