Я получил символ над UART и должен проверить, является ли это символом числа.Проверьте, находится ли номер в диапазоне от 8051
Обычно я хотел бы сделать
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'. Это достаточно намек? – Jester
Да, я вижу идею использования переноски, а затем JC и JNC, я просто не уверен, как это сделать. – MightyPork
Вы выполняете операцию сложения или вычитания, чтобы потенциально установить флаг, а затем условный переход на него. –