2017-02-25 1 views
-1

나는 1-9 사이의 한자리 수를 묻고 다음에 그것을 저장하는 8086 어셈블리 언어로 프로그램을 작성하고있다. 1-9 사이가 아닌 경우 루프백해야합니다.입력 숯이 1-9 사이에 있는지 어떻게 테스트 할 수 있습니까?

요구 사항을 충족 할 때까지 테스트하고 루프 백 (또 다른 숫자를 입력 할 수있는) 좋은 방법은 무엇입니까? 지금까지

내 코드 :

section .data 
    prompt1 db "Enter a single digit digit between 1-9 --> $" 
section .text 
    ;Display prompt 
    mov ah,9  ; print prompt 
    mov dx,prompt1 ; load register with prompt1 
    int 21h   ; display it 
    ; Input character and store. 
    mov ah,1  ; reach char fcn 
    int 21h   ; read character into al 
    mov bl,al  ; store character into bl 
+0

을 당신에게 문제를 일으키는 어떤 부분? 비교, 조건부 분기 및 ASCII 코드에 대해 알고 있습니까? – Jester

+0

조건 분기에 대해서는 알고 있지만 비교에는 익숙하지 않습니다. – user3394363

+2

그런 다음'cmp'에 대한 참조 페이지를 읽으십시오. TL : DR :'cmp bl, 1''과 같은 것을 할 수 있고, 여러분이 이미 알고있는 조건부 브랜치를 사용할 수 있습니다. – Jester

답변

2

나는 그것을 테스트하지 않은,하지만 BL이 39H보다 31H보다 작거나 큰 경우 일반적으로 코드가 확인해야합니다. ASCII 값은 19입니다.

그래서 몇 가지 예제 코드는 다음과 같이 수 :

; Input character and store. 
loop1:    ; added label 
    mov ah,1  ; read char fcn 
    int 21h   ; read character into AL 
    mov bl, al  ; store character into BL 
    ; now comes the additional code 
    cmp bl, 31h  ; compare BL to the ASCII value of '1' 
    jb loop1  ; jump back if ASCII value is less than '1' = 31h 
    cmp bl, 39h  ; compare BL to the ASCII value of '9' 
    ja loop1  ; jump back if ASCII value is greater than '9' = 39h 
    ; BL contains an ASCII value between '1' and '9' which integer value can be acquired by subtracting the value 30h 
+1

'jl'은 서명되어 있고, 'ja'는 서명되지 않았습니다. 입력에서 작동하려면 127 이상의 값을 입력 할 필요가 없기 때문에이 방법이 유용 할 수 있습니다. 그러나 소스를 읽는 즉시 버그가 발생하므로 매번 어떻게 작동하는지 생각해야하므로 많은 신경을 씁니다. 'jb'는 unsigned "below"입니다. – Ped7g

+1

'AL'을'BL'로 이동시키는 것은'AL'을 사용하여 ** 둘을 비교 한 후에 만 ​​** 자유롭게 코드 크기를 최적화 할 수 있습니다. –

+0

@ Ped7g : 감사합니다. 물론 네 말이 옳다. 나는 내 실수를 고쳤다. – zx485

관련 문제