Сравнение 16-битных чисел без использования дополнительных регистров - 8051 - PullRequest
0 голосов
/ 01 декабря 2018

В 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, но я не знаю лучшего способа.Я также хотел бы не тратить переменные и не использовать дополнительное время выполнения, если это возможно.

...