2015-04-08 7 views
3

Я получил символ над 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 
;====================================================== 
+2

Вы можете использовать 'SUBB' или' ADD' вместо этого в сочетании с 'JC' /' JNC'. Это достаточно намек? – Jester

+0

Да, я вижу идею использования переноски, а затем JC и JNC, я просто не уверен, как это сделать. – MightyPork

+1

Вы выполняете операцию сложения или вычитания, чтобы потенциально установить флаг, а затем условный переход на него. –

ответ

0

Самое простое, что нужно сделать, это собрать его в C и проверьте файл листинга. Вот что производит мой компилятор.

MOV  A, SBUF 
CLR  C 
SUBB A, #030H 
JC  ?C0026 
MOV  A, SBUF 
SETB C 
SUBB A, #039H 
JNC  ?C0026 

; Put instructions here to execute when the code is valid 

?C0026: 
+0

, но это не самый оптимизированный способ, и ему нужны 2 проверки + 2 прыжка –

1

Использование this technique, if (a >= '0' && a <= '9') могут быть преобразованы в

if ((unsigned)(a - '0') <= ('9'-'0')) 

что позволяет экономить вы сравниваете и прыгаете. Теперь только одно сравнение достаточно

В результате может быть, как это

SUBB A, #'0' ; A = a - '0' 
CLR C 
MOV R1, A ; R1 = a - '0' 
MOV A, #9 ; A = '9' - '0'; 
SUBB A, R1 ; C = 1 if ('9' - '0') < (a - '0') 
JC bad:  ; jump when C != 0 or !((a - '0') <= ('9' - '0')) 
; valid 

bad: 
Смежные вопросы