【发布时间】:2015-04-08 16:06:35
【问题描述】:
我通过 UART 接收到一个字符,需要验证它是否为数字字符。
通常我会这样做
if (char >= '0' && char <= '9') { /* VALID */ }
但是,我必须在汇编中。
我没有找到任何比较指令(所以我假设没有)。
我该怎么做?
mov A, SBUF ; load the number
; -- pseudocode --
cmp A, #'0' ; In AVR, I'd do it this way
brlt fail ; but I'm new to 8051
cmp A, #'9'
brge fail
; -- pseudocode --
; number is good
fail:
编辑:好的,这就是我现在拥有的,但它不起作用
;======================================================
; check if r1 is number char -> r0 = 1 or 0
;------------------------------------------------------
fn_isnum:
PUSH acc
PUSH 1
MOV r1,A
SUBB A,#'0'
JC isnum_bad
MOV A,r1
SUBB A,#'9'+1
JC isnum_bad
POP 1
POP acc
MOV r0,#1
RET
isnum_bad:
POP 1
POP acc
MOV r0,#0
RET
;======================================================
【问题讨论】:
-
您可以将
SUBB或ADD与JC/JNC结合使用。提示足够了吗? -
是的,我看到了使用进位,然后是 JC 和 JNC 的想法,我只是不太确定该怎么做。
-
例如,您可以减去
'0',如果您有进位,则表示该值较小,因此您应该跳转到无效大小写。同样,减去'9'+1,如果不产生进位,则表示该值大于9,因此再次无效。 -
你的加减操作可能会设置标志,然后有条件的跳转对其进行操作。
-
是的,我明白了,谢谢