Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Машинные коды

63K
21 марта 2011 года
albertik
21 / / 21.03.2011
Очень нужно решить такие задачки.
1. Имеется процессор К580ВМ80А. Нужно составить программу в машинных кодах для уравнения у=4X1-2X2+3X3+X4
X1=41, X2=1В, X3=08, X4=1D
2. Составить в машинных кодах программу для умножения методом суммирования множимого. Требуется решить 6х4.

Буду благодарен любой помощи. Сам даже не знаю, с чего начать.

P.S.: Если уравнение написано непонятно, то вот ссылка на картинку. Там скриншот уравнения и Word'a.
63K
27 марта 2011 года
albertik
21 / / 21.03.2011
Поскольку никто не помог, начал разбираться сам и кое-что написал. Очень прошу знающих людей подсказать, есть ли ошибки в программе. Листинг программы на скриншоте по этой ссылке
1.8K
27 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
найди в нете симулятор указанного процессора или intel8080 или Z80 или эмулятор какого нибудь старого компа на базе данных процов вроде ZX Spectrum в котором есть встроенный отладчик и погоняй там свою прожку -- увидишь сам есть ли ошибки
63K
27 марта 2011 года
albertik
21 / / 21.03.2011
Я пробовал искать, но не нашел. Может кто поможет?
316
28 марта 2011 года
Alm3n
889 / / 29.05.2009
http://atpp.at.ua/load/12-1-0-86
третья ссыль в гугле
63K
29 марта 2011 года
albertik
21 / / 21.03.2011
Цитата: Alm3n
http://atpp.at.ua/load/12-1-0-86
третья ссыль в гугле


Спасибо. То, что надо. Только не пойму, как посмотреть результат вычислений. Я понимаю, что вопрос глуповатый, но я только начал разбираться во всем этом. Подскажите, пожалуйста. Я знаю, что результат должен быть равным 103 (4*41-2*1B+3*08+1D*=*103). Но как посмотреть, что насчитала программа? У меня только вот что получилось

316
29 марта 2011 года
Alm3n
889 / / 29.05.2009
просмотр->регистры и флаги->регистры POH
63K
30 марта 2011 года
albertik
21 / / 21.03.2011
Спасибо. У меня вот что получилось Результат у меня должен быть в регистре В и должен он быть равен 103 (в шестнадцатиричной системе). 4*41-+2*1B+3*08+1D*=*103. В чем же моя ошибка? Переполнение?
1.8K
30 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
у тебя фактически вычисляется 4*41 - (3*08 + 1d + 2*1b) == 99. ошибка начинается со строки add l. надо наверн sub l, а потом add h, если такие операции допустимы... а вообще главная ошибка в самом способе вычислений, как-то слишком сложно - сначала вычисляются все слагаемые и распихиваются по каким-то регистрам после чего все это как-то суммируется... надо делать просто: вычислил слагаемое -- прибавил к сумме и так далее

т.е.:
Код:
mvi b, 41
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

-- сравни со своей прогой )
63K
31 марта 2011 года
albertik
21 / / 21.03.2011
Спасибо. Вот что накидал по Вашему совету
Цитата:
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-значного числа. Как быть-то?

277
31 марта 2011 года
arrjj
1.7K / / 26.01.2011
После сложения в флажковом (F) регистре проверять carry флажок, свидетельствующий о переполнении. И посмотри про комманду adc
316
31 марта 2011 года
Alm3n
889 / / 29.05.2009
насоветовали тебе слагаемые не распихивать и видишь к чему это привело :)
шутка, конечно же
63K
01 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: arrjj
После сложения в флажковом (F) регистре проверять carry флажок, свидетельствующий о переполнении. И посмотри про комманду adc

ADC - это сложение с учетом переполнения. Мне нужно все ADD заменить на ADC?

63K
01 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: Alm3n
насоветовали тебе слагаемые не распихивать и видишь к чему это привело :)
шутка, конечно же


Я теперь окончательно запутался :(

316
01 апреля 2011 года
Alm3n
889 / / 29.05.2009
Цитата: albertik
ADC - это сложение с учетом переполнения. Мне нужно все ADD заменить на ADC?


1) http://www.codenet.ru/progr/asm/tasm/35.php
2)нет, не все, только добавить еще один adc после возникновения переполнения(флаг cf). не получится тебе запихнуть все число целиком в один регистр. получится два числа - 03 в младшей части и 01 в старшей.

63K
03 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: Alm3n
добавить еще один adc после возникновения переполнения(флаг cf)

Спасибо за ответ. Возможно вопрос глупый, но как определить, когда возникает переполнение?

7
03 апреля 2011 года
@pixo $oft
3.4K / / 20.09.2006
При установке флага CF.Можно использовать JC/JNC(пишу как на архитектуре Intel,думаю,в вашей аналогичные команды должны быть)
Или вообще не проверять никакие флаги,а сразу ADC,ибо при отсутствии переполнения там будет 0 и ничего лишнего не добавится
63K
03 апреля 2011 года
albertik
21 / / 21.03.2011
Подозреваю, что переполнение возникает после третьего ADD D.
Так правильно?
Код:
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
adc e
mov l, a
63K
03 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: @pixo $oft
При установке флага CF.Можно использовать JC/JNC(пишу как на архитектуре Intel,думаю,в вашей аналогичные команды должны быть)
Или вообще не проверять никакие флаги,а сразу ADC,ибо при отсутствии переполнения там будет 0 и ничего лишнего не добавится

Прошу прощения, но ничего не понял :(

316
03 апреля 2011 года
Alm3n
889 / / 29.05.2009
Цитата: albertik
Прошу прощения, но ничего не понял :(


после каждого сложения вызывать инструкцию jc, например, которая проверит, было ли переполнение и сделает скачек на участок кода с adc, если флаг CF установлен в 1

Цитата:
Так правильно?


если не ошибаюсь, не хватает одного x1. к тому же, если adc тоже с одним аргументом, то складывать он будет со значением в регистре а, где уже лежит какое-то значение. его лучше бы сначало перенести в другой регистр, регистр а обнулить и потом вызвать adc с x4.ответ будет либо в двух регистрах, либо переноси в память

63K
03 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: Alm3n
после каждого сложения вызывать инструкцию jc


Как это делается?

Цитата: Alm3n
флаг CF установлен в 1

Хоть убейте, не пойму, где этот флаг. Бьюсь головой об стену :(

316
03 апреля 2011 года
Alm3n
889 / / 29.05.2009
Цитата: albertik
Как это делается?
Хоть убейте, не пойму, где этот флаг. Бьюсь головой об стену :(


пологаю, что в регистре признаков, флаг CF - это циферка, под буковкой С.
прочти прошлое сообщение. ту часть, где говорил о другом регистре

63K
03 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: Alm3n

если не ошибаюсь, не хватает одного x1.


 
Код:
mov  a, b ;  b -> a
add  a ;      2x1 -> a
add  a ;      4x1 -> a

Я думал, что вот так. Это неправильно?
Цитата: Alm3n

к тому же, если adc тоже с одним аргументом, то складывать он будет со значением в регистре а, где уже лежит какое-то значение.


Если я все правильно понимаю, то в регистре А будет лежать значение 4X1-2X2+3X3, к которому и надо прибавить X4. Вот только не знаю, прав ли я...

Код:
mvi  b, 41  ;  x1 -> b
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

Цитата: Alm3n

его лучше бы сначало перенести в другой регистр


Так?

Код:
mvi  b, 41  ;  x1 -> b
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

Цитата: Alm3n

регистр а обнулить


Как это сделать?

Цитата: Alm3n

либо переноси в память


А это как?

63K
03 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: Alm3n
пологаю, что в регистре признаков, флаг CF - это циферка, под буковкой С.

Это то, что обведено красным?

7
03 апреля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Да,оно самое.У вас так много вопросов,что кажется,что вы в 1й раз за это берётесь
63K
03 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата: @pixo $oft
Да,оно самое.


Спасибо.

Цитата: @pixo $oft

У вас так много вопросов,что кажется,что вы в 1й раз за это берётесь

Именно так. В первый раз. И мне очень важно во всем разобраться.

316
04 апреля 2011 года
Alm3n
889 / / 29.05.2009
Цитата: albertik

Я думал, что вот так. Это неправильно?


првильно. это я что-то не подумал, что там уже 2x1 :)

Код:
mvi  b, 41  ;  x1 -> b
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.
как работает адресация в этом ассемблере - не знаю, поэтому как переслать число в память не скажу.
Цитата:
Именно так. В первый раз. И мне очень важно во всем разобраться


имхо в первый раз нужно разбираться не с этим

63K
04 апреля 2011 года
albertik
21 / / 21.03.2011
Цитата:
имхо в первый раз нужно разбираться не с этим

Так мне выбирать не приходится. Что задали в универе, с тем и разбираюсь :)

63K
04 апреля 2011 года
albertik
21 / / 21.03.2011
Не могу понять одну вещь. Что ADD E в 13 строке стоит, что ADC E, результат один. Почему так?
316
04 апреля 2011 года
Alm3n
889 / / 29.05.2009
adc - это тот же add, только после сложения с аргументом, он еще и число во флаге CF добавляет. перед прибавлением e у тебя CF=0. вот он и складывает а+е+CF(0). в а помещается остаток(03), а в CF помещается 1 после сложения.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог