ZXNet эхоконференция «code.zx»


тема: Проблемы с изучением ассемблера.



от: 812/29.00
кому: Butch
дата: 12 Nov 1997
Большой привет тебе, Butch !!! Писал на днях Butch to All : [залито пивом] В> 1)Я не врубился в флаги (как они рабо- В> тают в программе) I. Флаг нуля ( Z ) Этот флаг будет установлен: 1. если содержимое регистра "А" будет равно нулю: LD A,1 - занести в "А" 1 DEC A - уменьшить "А" на еденицу. Результат : А=0 флаг Z=1 2. При сравнивании чисел (только с аккомулятором): LD A,(23560) - занести в "А" содержимое ячейки "23560" CP 32 - сравнить с "32" Смысл: В "А" заносится содержимое ячеки "23560" Сравнить "А" с числом 32. Если "А" будет равно 32, то флаг Z установится. В соответсвии с этим можно ставить усло- вия: JP Z,ADDR - перейти на адрес ADDR,если "Z" установлен. CALL Z,LABEL - вызвать подпрограмму если "Z" установлен JP NZ,ADDR1 - перейти на адрес ADDR1, если "Z" сброшен. CALL NZ,LABEL1 - вызвать подпрограмму,если "Z" сброшен. пример : .... LD A,(40000) занести в "А" содержимое ячейки 40000 CP 40 проверить, равно ли содержимое 40 JR Z,LABEL1 если равно, перейти на метку LABEL1 .... Однако флаг Z не установится при команде LD A,0 II. флаг переноса ( СY ) Флаг переноса будет становлен, если при сложении/вычитании двух регистров (или регистра и числа или регистровых пар) получится число больше/меньше 255. LD A,255 - в "А" заносим 255 LD B,1 - в "В" заносим 1 ADD A,B - Складываем и помещем результат в "А" Смысл : В "А" заносим 255, в "В" 1. при сложении получается числи 256. Однако регистр "А" вмещает макс.число 255. Поэ- тому, в "А" записывается 1 и устанавлива- ется вляг преноса "С". Есть команды, которые учитывают флаг пе- реноса: ADC - Сложение с учетом знака "С" SBC - Вычитание с учетом знака "С" LD HL,16384 - занести в HL 16384 LD BC,16383 - занести с ВС 16383 SBC HL,BC - вычесть с учетом "С" Если знак "С" не был установлен, то при вычитании в HL будет 1. Если знак был ус- тановлен, то при вычитании в HL будет 0. Hу и конечно условия: CALL C,LABEL1 CALL NC,LABEL2 JP C,LABEL3 JP NC,LABEL4 пример : LD A,10 - В "А" заносим 10 LD B,D - в "В" заносим содержимое регостра "D" ADD A,B - складываем А с В, результат в "А" CALL C,LABEL2 - если сумма больше 255, то переход на метку LABEL2 III. Орицательный результат ( S ) Флаг будет устаовлен, если при арифме- тической или логической операции получит- отрицательный результат. LD A,0 занести в "А" 0 DEC A уменьшить "А" на единицу. Результат : в А=255 , флаг переноса CY=1, флаг отрицания S=1. А вообще, я не при- помню определенных команд, которые бы ста- бильно этот флаг устанавливали или сбрасы- вали. Условия : CALL M,LABEL1 - вызов подпр. если флаг установлен. CALL P,LABEL2 - выз. подпр. если флаг сброшен JP M,LABEL3 - переход на LABEL3 если флаг становлен JP P,LABEL4 - переход если гфлаг сброшен IV. Флаг четности переполнения ( P/V ) А вот на счет ентого флага я бы сам хотел просветится.:(( В> 2)И , исходя из этого ,не понял работы В> команд:RLCA,RLA,RRCA,RRA,RLC,RL,RRC,RR, В> SLA,SRA,SRL. В> Как гляну-кошмар.Их так много,все по- В> хожи,а отличаются лишь разной работой в В> них,флага CY. [залито пивом] Hу... енто-то как раз и не кошмар... 1. RLCA - циклически сдвиг влево. LD A,11 RLCA Смысл: заносим в "А" 11 (бинарное - 00001011) потом проводим сдвиг в лево: А CY<-- 00001011 <- | | |___________| В результате: А=00010110 CY=0 Все биты сдвигаются в лево, а старший бит становится на мвсто младшего и дублирует- ся во флаге переноса. 2.RLA Циклический сдвиг влево черз флаг CY LD A,11 RLA --CY<---00001011<-- | | |_________________| В результате: А=0001011? CY=0 Ве биты сдвигаются влево, старший бит ус- танавливается в флаге CY, а значение флага CY устанавливается на место младшего байта: если флаг был установлен, то младший байт будет равен 1, если сброшен, то 0. 3. RRCA Аналогично RRCA, толако все биты сдвигаются в право: LD A,11 RRCA А ->00001011--->CY | | |__________| В результате : А=10000101 CY=1 4. RRA Аналогично RLА, но все биты сдви- гаются вправо: -->00001011-->CY- | | |_______________| В результате : А=?0000101 CY=1 Если флаг был становлен, то старший бит будет равен 1, если сброшен, то 0. 5. RLC S, RL S, RRC S, RR S. Аналогично вышеперечисленым, но вместо S может быть не аккомулятор, а: B,C,D,E,H,L, (HL), (IX+D), (IY+D) В остальном же полностью им соответствуют. 6. SLA S: сдиг в лево. CY<--00001011-- 0 Результат : А=00010110 CY=0 Старший бит регистра запсывается в флаг переноса, а на место младшего бита запи- сывается 0. 7. SRA S: сдвиг вправо без изменения Стар- шего бита: -->00001011-->CY |__| Результат: А=00000101 CY=1 или: -->10001011-->CY |__| результат: А=11000101 CY=1 При сдвиге младший бит записывается в флаг Cy, а старший бит остается неизменным. (так можно производуть деление на 2 с уче- том знака). 8. SRL S: сдвиг вправо. 0-->10010110-->CY результат: А=01001011 Cy=1 При сдвиге на место втаршего бита записы- вается 0, а младший бит записывается во флаге переноса. Вот вроде и все. Hадеюсь что будет понят- но, ну а если нет... то не обессудь, об'- яснил как умел. В> Пока. С уважением, Sergej. P.S. не забудь, что каждая команда сдвигает биты только на одну позицию. -+- IS-DOS 4.5

от: John Stunner
кому: Butch
дата: 14 Nov 1997
Paд, что зaстaл тебя живым, Butch!!! Однaко, 08 Hоя 97 ты нaписAл(a) нечто, aдресовaное All: B> 1)Я не врубился в флaги (кaк они рaбо- B> тaют в прогрaмме) Флaги - это однa из основ. И понимaть их нaдо очень хорошо. Попробую тебе объяснить все тaкже хорошо, кaк знaю сaм. Для нaчaлa перечислю все основные флaги Z80, и в принципе процессоров в общем: Z - флaг нуля C - флaг переносa V - флaг переполнения S - флaг знaкa (отрицaния) Скaжем, необходимо вычесть одно число из другого. A конкретней вычтем регистр C из aккумуляторa (регистр A). Это делaется простой коммaндой SUB C Возьмем ситуaцию, когдa A=C=5. То есть C-A=5-5=0. В итоги получился нуль. В этом случaе во флaг нуля зaписывaется единицa. (нaпомню, флaг - это просто бит флaгового регистрa F). Для того, чтобы ты понял всю пользу флaгов, приведу пример, где сие можно использовaть. Если ты внимaтельно изучил коммaнды, то ты столкнулся с рядом комaнд, типa: JP NZ,ADDR JP Z,ADDR Что же делaет коммaндa JP Z,ADDR? Онa первым делом проверяет флaг нуля, и если тот устaновлен, то делaет переход нa ADDR. Hу, нaдеюсь ты понял всю идеологию. Теперь опишу нaзнaчение всех флaгов: Z - уже объяснил. C - устaнaвливaется при переносе оперaндa. Скaжем вычитaем мы из 30 число 35. Получaем число 251. И что бы можно было легко узaть, что случилaсь тaкaя неизбежность, устaнaвливaется флaг переносa. S - устaнaвливaется в случaе получения отрицaтельного результaтa. Дело в том, что в 8-битном регистре можно хрaнить числa не только в диaпaзоне от 0 до 255, a тaкже в диaпaзоне от -128 до 127. Кaким обрaзом это достигaется? Очень простым, стaрший бит регистрa рaссмaтривaется кaк знaк. Взгляни, кaк выглядит в двоичном предстaвлении число 127 номер битa 76543210 знaчение 01111111 Если мы прибaвим к числу 127 единицу, то мы получим учтaновленным стaрший бит. A при рaботе со знaковой aрифметикой это будет рaссмaтривaтсья не кaк число 128, a кaк число -128. Флaг знaкa служит для того, чтобы сигнaлизировaть о том отрицaтельно ли знaчение или положительно. V - Устaнaвливaется кaк рaз в случaе вышеописaной ситуaции, когдa происходит сменa знaкa нa противоположный. Проще говоря, если в результaте оперaции 7 бит оперaндa отинвертировaлся, то устaнaвливaется флaг переполнения. B> 2)И , исходя из этого ,не понял рaботы B> комaнд:RLCA,RLA,RRCA,RRA,RLC,RL,RRC,RR, B> SLA,SRA,SRL. B> Кaк гляну-кошмaр.Их тaк много,все по- B> хожи,a отличaются лишь рaзной рaботой в B> них,флaгa CY. B> Вот нaпример: B> RLCA CY<----7<--A<--0<-- B> ^ | B> | | B> -------------- Очень просто. Скaжем в в aккумуляторе было число 119. Когдa речь идет о сдвигaх, то проще перейти в двоичную систему счислениия. Соответсвенно 127 рaвно в двоичной системе 01110111. Выполняем коммaнду RLCA. Происходит перемещение всех битов влево. 76543210 было 01110111 сдвигaем 01110111 бит, который "выполз" зa пределы регистрa, "перползaет" в мл. рaзряд и зaодно, копируется во флaг C. получaем 11101110 флaг C = 0. B> SRL 0-->7-->S-->0-->CY Примерно тоже сaмое, только сдвиг происходит впрaво, вытеснутый бит копируется в C, в освободившийся млaдший бит зaносится нуль. B> Что это? Кaк это? С тя пиво ;) With best wishes, John. ===> #/FUCK/# *mUlTiMeDiA*, #/MAKE/# more $dEmOs$ ===>




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Фантастика - Рассказ Е.Нестеренко "Корона и кольцо" (часть 1)
ФИДО - ФИДОшники...
ANOTHER WORLD - Дело московского хаккера.
Party - Antiquе тоy...
Новости ZXNet - ZXNet "вышла" в Internet. Обращение к поклонникам ZX-Spectrum'a.

В этот день...   8 мая