реклама на сайте
подробности

 
 
> Помогите с циклом для С8051F005
Scorpline
сообщение Oct 25 2007, 23:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 25-10-07
Пользователь №: 31 737



Я начинающий в ассемблере... Может кто поможет написать код цикла для сравнения двух однобайтных значений... то есть есть два числа(допустим #10h и #3Fh). Они сравниваются с другими значениями которые прокручиваются в цикле(и постоянно изменяются)... и если эти значение меньше 10h то выполняется вызов какойто подпрограммы и соответственно значение больше 3Fh то вызов другой подпрограммы.... (вообщем как в ассемблере зделать знаки <>) help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
msn
сообщение Oct 26 2007, 10:38
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Цитата(Scorpline @ Oct 26 2007, 02:55) *
Я начинающий в ассемблере... Может кто поможет написать код цикла для сравнения двух однобайтных значений... то есть есть два числа(допустим #10h и #3Fh). Они сравниваются с другими значениями которые прокручиваются в цикле(и постоянно изменяются)... и если эти значение меньше 10h то выполняется вызов какойто подпрограммы и соответственно значение больше 3Fh то вызов другой подпрограммы.... (вообщем как в ассемблере зделать знаки <>) help.gif

Код
MOV      A,Rx               ; Определили значение переменной цикла, A = VAR
CLR      C                  
SUBB     A,#0x10            ; A  = VAR – 0x10
JNC      LabelNext          ; Если VAR – 0x10 >= 0 :: VAR >= 0x10 то переходим на LabelNext
CALL     FunLoss            ; Если VAR – 0x10  < 0 :: VAR  < 0x10 то вызываем FunLoss            
JMP      LabelEnd

LabelNext:
MOV      A,Rx               ; Определили значение переменной цикла, A = VAR
SETB     C                  
SUBB     A,#0x3F            ; A  = VAR – 0x3f
JC       LabelMore          ; Если VAR – 0x3f <= 0 :: VAR <= 0x3f то переходим на LabelEnd
CALL     FunMore            ; Если VAR – 0x3f  > 0 :: VAR  > 0x3f то вызываем FunMore            

LabelEnd:
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 26 2007, 13:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



По-моему, всётаки лучше так

Код
;--- Если в Rx лежит проверяемый байт (VAR)
;--- Проверка VAR < 0x10
    CJNE  Rn, #10h, Lab1
Lab1:
    JNC   LabNext          
    CALL  FunLoss; Если  VAR  < 0x10 то вызываем FunLoss
    JMP    LabelEnd
LabelNext:
;--- Проверка VAR > 0x3F
    CJNE  Rn, #3Fh, Lab2
    JMP    LabelEnd
Lab2:
    JC    LabelEnd
    CALL  FunMore; Если VAR  > 0x3f то вызываем FunMore
LabelEnd:


Применение CJNE мне нравится тем, что при проверке не разрушается содержимое аккумулятора и регистров

Сообщение отредактировал Палыч - Oct 26 2007, 14:00
Go to the top of the page
 
+Quote Post
msn
сообщение Oct 26 2007, 16:46
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



CJNE - команда условного перехода производит сравнение содержимого аккумулятора с операндом (команда "cjne A, #const, label") или регистра с операндом (команда "cjne reg, operand, label") и реализует переход, если они не равны.
Т.е. у Вас получается:

;--- Если в Rx лежит проверяемый байт (VAR)
;--- Проверка VAR != 0x10
CJNE Rn, #10h, Lab1
JNC LabNext
Lab1:
CALL FunLoss; Если VAR != 0x10 то вызываем FunLoss
JMP LabelEnd
LabelNext:
;--- Проверка VAR != 0x3F
CJNE Rn, #3Fh, Lab2
JMP LabelEnd
Lab2:
JC LabelEnd
CALL FunMore; Если VAR != 0x3f то вызываем FunMore
LabelEnd:

Происходит сравнения не равно 0x10 и не равно 0x3f, а не меньше 0x10 и не больше 0x3f.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 29 2007, 06:13
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(msn @ Oct 26 2007, 20:46) *
CJNE - команда условного перехода производит сравнение содержимого аккумулятора с операндом (команда "cjne A, #const, label") или регистра с операндом (команда "cjne reg, operand, label") и реализует переход, если они не равны.
Происходит сравнения не равно 0x10 и не равно 0x3f, а не меньше 0x10 и не больше 0x3f.

Я выше писал
Цитата
для сравнения байта с заранее известной константой лучше всего использовать команды... получаем переход если не равны, при этом флаг С=1, если первый операнд меньше и С=0 в противном случае
т.е. команда CJNE действительно производит сравнение двух операндов и при этом выставляет флаг С, который можно использовать в последующих командах, а переход, который осуществляет CJNE в некоторых случаех сравнения не нужен вовсе (ставим переход на следующую команду). Код господин msn поправил (перенес метку, убрал условный переход) зря: они - часть той фишки, что позволяет использовать CJNE при любом сравнении (не только равно-неравно).
Go to the top of the page
 
+Quote Post
msn
сообщение Oct 31 2007, 22:57
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Цитата(Палыч @ Oct 29 2007, 08:13) *
Я выше писал
т.е. команда CJNE действительно производит сравнение двух операндов и при этом выставляет флаг С, который можно использовать в последующих командах, а переход, который осуществляет CJNE в некоторых случаех сравнения не нужен вовсе (ставим переход на следующую команду). Код господин msn поправил (перенес метку, убрал условный переход) зря: они - часть той фишки, что позволяет использовать CJNE при любом сравнении (не только равно-неравно).

Спасибо.
Уже лет 10 на 51 пишу, а про то что CJNE меняет С не знал 07.gif
Ваш вариант действительно оптимальнее smile.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 23:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.06227 секунд с 7
ELECTRONIX ©2004-2016