不使用额外寄存器的16位数字比较-8051

时间:2018-12-01 01:31:48

标签: pointers numbers compare unsigned-integer 8051

在8051中,我可以通过两种方式比较8位数字的值,以查看其值是大于还是小于另一个数字。我将执行以下操作。

第一种方法示例:

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.

第二种方式示例:

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

在这里,我更喜欢第二种方式,因为在进行比较时不会修改任何寄存器。

所以现在我想以某种方式将此首选方法应用于扩展内存中位于MEMORY1和MEMORY2位置的两个16位无符号整数。假设位置不与其他任何位置重叠。为简单起见,我们可以说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链接在一起,但我不知道最好的方法。我还希望不要浪费变量,并且在可能的情况下不要使用额外的执行时间。

0 个答案:

没有答案