В 8051 есть два способа, которыми я могу сравнить значение 8-битного числа, чтобы увидеть, больше ли оно или меньше, чем другое число.Я бы сделал следующее.
Пример 1-го пути:
mov NUMBER,#1h ;set memory variable named "NUMBER" to 1.
mov A,#2h ;set accumulator to 2
clr C ;Don't include carry in subtraction
subb A,NUMBER ;take 1 away from 2. Modifies accumulator
;value of carry = desired result.
Пример 2-го пути:
mov NUMBER,#1h ;set memory variable named "NUMBER" to 1.
mov A,#2h ;set accumulator to 2
cjne A,NUMBER,abranch ;see if A = NUMBER. Accumulator NOT modified
abranch:
;value of carry = desired result
Здесь я предпочитаю 2-й способ, потому что нет регистровизменено, когда происходит сравнение.
Так что теперь я хочу каким-то образом применить этот предпочтительный метод к двум 16-разрядным целым числам без знака в расширенной памяти в местоположениях MEMORY1 и MEMORY2.Давайте предположим, что местоположения не перекрываются с чем-либо еще.Для простоты мы можем сказать MEMORY1 = адрес 1000h и MEMORY2 = адрес 2000h.
Вот мой код для реализации первого метода при работе с 16-битными числами.Обратите внимание, что значения каждого числа могут быть от 0 до 65535.
;value comparison between
;16-bit data in MEMORY1 and 16-bit data in MEMORY2
;here we subtract number in MEMORY1 from MEMORY2.
;Carry is our result.
mov DPTR,#MEMORY1 ;Setup our pointer to 1st number
movx A,@DPTR ;Get lower half of 16-bit value
mov R2,A ;and store it
inc DPL ;advance pointer
movx A,@DPTR ;and get higher half of 16-bit value
mov R3,A ;and store it
clr C ;Prepare for subtraction by setting carry to 0
mov DPTR,#MEMORY2 ;Setup our pointer to 2nd number
movx A,@DPTR ;Get lower half of 16-bit value
subb A,R2 ;subtract lower half of 1st # 16-bit value from it
inc DPL ;advance pointer
movx A,@DPTR ;Get higher half of 16-bit value
subb A,R3 ;subtract the sum of carry and higher half of 1st # 16-bit value
;Value of Carry here returns our desired result
Есть ли более простой способ сделать это в 8051, где я могу сравнить два 16-разрядных целых числа без знака и иметь флагуказать, является ли один больше или меньше другого числа?Я думал, как-то связать вместе CJNE, но я не знаю лучшего способа.Я также хотел бы не тратить переменные и не использовать дополнительное время выполнения, если это возможно.