Машинные коды
1. Имеется процессор К580ВМ80А. Нужно составить программу в машинных кодах для уравнения у=4X1-2X2+3X3+X4
X1=41, X2=1В, X3=08, X4=1D
2. Составить в машинных кодах программу для умножения методом суммирования множимого. Требуется решить 6х4.
Буду благодарен любой помощи. Сам даже не знаю, с чего начать.
P.S.: Если уравнение написано непонятно, то вот ссылка на картинку. Там скриншот уравнения и Word'a.
третья ссыль в гугле
третья ссыль в гугле
Спасибо. То, что надо. Только не пойму, как посмотреть результат вычислений. Я понимаю, что вопрос глуповатый, но я только начал разбираться во всем этом. Подскажите, пожалуйста. Я знаю, что результат должен быть равным 103 (4*41-2*1B+3*08+1D*=*103). Но как посмотреть, что насчитала программа? У меня только вот что получилось
т.е.:
mvi c, 1B
mvi d, 08
mvi e, 1D
mov a, b
add a ; a = a*2
add a ; a = a*2 --> a = b*2*2 = 4*41
sub c
sub c ; - 2*1B
add d
add d
add d ; + 3*08
add e ; + 1D
-- сравни со своей прогой )
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-значного числа. Как быть-то?
шутка, конечно же
ADC - это сложение с учетом переполнения. Мне нужно все ADD заменить на ADC?
шутка, конечно же
Я теперь окончательно запутался :(
1) http://www.codenet.ru/progr/asm/tasm/35.php
2)нет, не все, только добавить еще один adc после возникновения переполнения(флаг cf). не получится тебе запихнуть все число целиком в один регистр. получится два числа - 03 в младшей части и 01 в старшей.
Спасибо за ответ. Возможно вопрос глупый, но как определить, когда возникает переполнение?
Или вообще не проверять никакие флаги,а сразу ADC,ибо при отсутствии переполнения там будет 0 и ничего лишнего не добавится
Так правильно?
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
adc e
mov l, a
Или вообще не проверять никакие флаги,а сразу ADC,ибо при отсутствии переполнения там будет 0 и ничего лишнего не добавится
Прошу прощения, но ничего не понял :(
после каждого сложения вызывать инструкцию jc, например, которая проверит, было ли переполнение и сделает скачек на участок кода с adc, если флаг CF установлен в 1
если не ошибаюсь, не хватает одного x1. к тому же, если adc тоже с одним аргументом, то складывать он будет со значением в регистре а, где уже лежит какое-то значение. его лучше бы сначало перенести в другой регистр, регистр а обнулить и потом вызвать adc с x4.ответ будет либо в двух регистрах, либо переноси в память
Хоть убейте, не пойму, где этот флаг. Бьюсь головой об стену :(
пологаю, что в регистре признаков, флаг CF - это циферка, под буковкой С.
прочти прошлое сообщение. ту часть, где говорил о другом регистре
если не ошибаюсь, не хватает одного x1.
add a ; 2x1 -> a
add a ; 4x1 -> a
Я думал, что вот так. Это неправильно?
к тому же, если adc тоже с одним аргументом, то складывать он будет со значением в регистре а, где уже лежит какое-то значение.
Если я все правильно понимаю, то в регистре А будет лежать значение 4X1-2X2+3X3, к которому и надо прибавить X4. Вот только не знаю, прав ли я...
mvi c, 1B ; x2 -> c
mvi d, 08 ; x3 -> d
mvi e, 1D ; x4 -> e
mov a, b ; b -> a
add a ; 2x1 -> a
add a ; 4x1 -> a
sub c ; 4x1-x2 -> a
sub c ; 4x1-2x2 -> a
add d ; 4x1-2x2+x3 ->a
add d ; 4x1-2x2+2x3 -> a
add d ; 4x1-2x2+3x3 -> a
adc e ; 4x1-2x2+3x3+x4 -> a
его лучше бы сначало перенести в другой регистр
Так?
mvi c, 1B ; x2 -> c
mvi d, 08 ; x3 -> d
mvi e, 1D ; x4 -> e
mov a, b ; b -> a
add a ; 2x1 -> a
add a ; 4x1 -> a
sub c ; 4x1-x2 -> a
sub c ; 4x1-2x2 -> a
add d ; 4x1-2x2+x3 ->a
add d ; 4x1-2x2+2x3 -> a
add d ; 4x1-2x2+3x3 -> a
mov h; a 4x1-2x2+3x3 -> h
регистр а обнулить
Как это сделать?
либо переноси в память
А это как?
Это то, что обведено красным?
Спасибо.
У вас так много вопросов,что кажется,что вы в 1й раз за это берётесь
Именно так. В первый раз. И мне очень важно во всем разобраться.
Я думал, что вот так. Это неправильно?
првильно. это я что-то не подумал, что там уже 2x1 :)
mvi c, 1B ; x2 -> c
mvi d, 08 ; x3 -> d
mvi e, 1D ; x4 -> e
mov a, b ; b -> a
add a ; 2x1 -> a
add a ; 4x1 -> a
sub c ; 4x1-x2 -> a
sub c ; 4x1-2x2 -> a
add d ; 4x1-2x2+x3 ->a
add d ; 4x1-2x2+2x3 -> a
add d ; 4x1-2x2+3x3 -> a
add e ; 4x1-2x2+3x3+x4 -> a
mvi h,a
mvi a,0
adc 0
число получится в a:h.
как работает адресация в этом ассемблере - не знаю, поэтому как переслать число в память не скажу.
имхо в первый раз нужно разбираться не с этим
Так мне выбирать не приходится. Что задали в универе, с тем и разбираюсь :)