在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链接在一起,但我不知道最好的方法。我还希望不要浪费变量,并且在可能的情况下不要使用额外的执行时间。