Сравнение двух чисел LONG на ассемблере для 8-битных PIC16

asm_compareДля проекта TVCAS необходимо сравнивать время активной подписки со временем из ECM-пакета. UNIX-время представлено в виде числа LONG размером 4 байта. Т.к. контроллер 8-битный, работа ведётся с одним байтом. Тривиальная задача, но долго ломал голову как сравнить 4 байта через один. Сначала пошёл, как мне показалось по лёгкому пути — была идея сравнивать биты этих чисел, начиная со старших разрядов. Но такой путь в итоге оказался велосипедистым. В итоге решил действовать стандартным способом, как и для CHAR-овских переменных — использовать разность чисел с последующей проверкой битов признаков (Z, C в регистре STATUS).

let	    macro   xaddr, xdata
	    movlw   xdata
	    movwf   xaddr
	    endm
        
        org 0 ;
        call    compare ;
        end ;

		; ???????? A больше либо равно B ???????
compare		clrf	    h'0050'	  ; регистр ответа. 01 -> да       10 -> нет
		
		let	    h'0040', 0x12 ; A
		let	    h'0041', 0x2C ; A
		let	    h'0042', 0xF4 ; A
		let	    h'0043', 0x35 ; A

		let	    h'0044', 0x12 ; B
		let	    h'0045', 0x4C ; B
		let	    h'0046', 0xB5 ; B
		let	    h'0047', 0x2A ; B

		movf	    h'0044', W
		subwf	    h'0040', W	  ; A-B
		btfsc	    STATUS, C	  ; C=0 при отрицательном
		goto	    compare_2
compare_no	let	    h'0050', 0x10 ; нет
		return
		
compare_2	btfss	    STATUS, Z
		goto	    compare_yes
		movf	    h'0045', W
		subwf	    h'0041', W	  ; A-B
		btfsc	    STATUS, C	  ; C=0 при отрицательном
		goto	    compare_3
		goto	    compare_no
		
compare_3	btfss	    STATUS, Z
		goto	    compare_yes
		movf	    h'0046', W
		subwf	    h'0042', W	  ; A-B
		btfsc	    STATUS, C	  ; C=0 при отрицательном
		goto	    compare_4
		goto	    compare_no
		
compare_4	btfss	    STATUS, Z
		goto	    compare_yes
		movf	    h'0047', W
		subwf	    h'0043', W	  ; A-B
		btfsc	    STATUS, C	  ; C=0 при отрицательном
		goto	    compare_yes
		goto	    compare_no
		
compare_yes	let	    h'0050', 0x01 ; да
		return

 

Запись опубликована в рубрике C++, Программирование, Радиолюбитель с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий