2016-09-02 4 views
0

을 수용하는 방법다음 많은 수의 입력을 허용 예를 들어 비교하는 방법 큰 (여러 자리)를 입력 수

mov ah,01h 
int 21h 

내가 하나 이상의 문자를 사용할 수과 알에 해당 번호를 이동하려면 사용자가 32를 입력하고자하는 사용자 예제의 입력에 의해 주도하지만, 하나의 문자는 2 자리 숫자는 단순히 한 문자를 2 번 입력을 반복하고 결합 입력

mov bl,al 
delay: 
mov ctr,'0' 
mov al,bl 
mov cx,100 
skip: 
x: 
mov al,00000000b 
mov dx,378h 
out dx,al 
loop x 

Z: mov al,bl 
mov dx,378h 
out dx,al 
loop z 
inc ctr 

Cmp ctr,'8' 
Je exit 
jmp skip 
Exit : 
Mov ah,4ch 
int 21h 
End start 
+0

예, 나는 그래서 병렬 포트 인터페이스에 처리하기 위해 무슨 일이 있었는지 볼 수에 지연을 갖고 싶어 :

다음 마지막에 변화와 절차 "string2number"와 코드 cx를 10 –

+0

으로 사용했습니다. 제 대답은 당신이 원하는대로 번호를 입력하도록했습니다. 내 코드를 컴파일러에 복사하여 붙여넣고 테스트하십시오. –

답변

0

이었다 점멸에서 포트에 액세스 할 수 검색 결과 :

mov ah, 01h 
int 21h 
sub al, '0' 
mov bl, al  ;1st digits "tens" 
mov ah, 01h 
int 21h 
sub al, '0' ;2nd digit "units" 
xchg al, bl 
mov ah, 10 
mul ah 
add al,bl 

첫 번째 입력이 문자 "3"이고 두 번째 입력이 문자 "2"인 경우 AL은 숫자 32를 보유합니다. CX는 레지스터를 다시 초기화하지 않고


때문에 X-루프의 끝에서 65536 번 반복됩니다 Z-루프는 CX 레지스터는 0이됩니다! 이것은 의도적입니까? 하나 개 이상의 숫자로 번호를 허용해야하는 경우

+0

나는 사용자의 입력을 갖고 싶다. 숫자처럼 그것을 얻고 싶다. 그러면 레지스터의 값으로 사용한다. 그래서 프로그램은 그것을 얻을 것이고, 병렬 포트 라이트의 주소를 출력한다. –

1

두 단계를 실행해야합니다

  1. 는, 문자열로 개별없는 문자를 숫자에 동의합니다.
  2. 문자열을 프로 시저로 숫자로 변환하십시오.

이것은 당신이 문자열을 수용하는 방법입니다

mov ah, 0ah 
mov dx, the_string 
int 21h 

변수 the_string이 특정 형식이 필요합니다

the_string db 26   ;MAX NUMBER OF CHARACTERS ALLOWED (25). 
      db ?   ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER). 
      db 26 dup (?) ;CHARACTERS ENTERED BY USER (END WITH 0AH). 

공지 사항 세 가지 섹션 : 첫 번째 바이트는 문자의 최대 수를 나타냅니다 두 번째 바이트는 입력 된 문자열의 길이를 저장하고, 세 번째 섹션은 문자 배열 (ENTER 키 = '0ah'로 끝남)입니다.

문자열을 수락하면 알려진 알고리즘을 사용하여 숫자로 변환해야합니다. 오른쪽에서 왼쪽으로 문자를 처리하고 각 문자에 10의 거듭 제곱을 곱합니다.이 절차는 "string2number"라고합니다.

"string2number"프로 시저에는 하나의 매개 변수가 사용됩니다 : 변수(세 섹션이있는 문자열)을 가리 킵니다. 번호는 BX 레지스터에 반환됩니다. 숫자가 작 으면 BL에 맞을 수 있습니다. 이 절차는 귀하의 미래 프로그램에서 매우 유용 할 것입니다.

.model small 
.stack 100h 
.data           

str db 4   ;MAX NUMBER OF CHARACTERS ALLOWED (3). 
     db ?   ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER). 
     db 4 dup (?) ;CHARACTERS ENTERED BY USER (END WITH 0AH). 
ctr db 0  

.code 
    mov ax, @data 
    mov ds, ax 

; mov ah,01h 
; int 21h 
    mov ah, 0ah  ;◄■ CAPTURE STRING FROM KEYBOARD. 
    mov dx, offset str ;◄■ VARIABLE TO STORE THE STRING. 
    int 21h 

    mov si, offset str ;◄■ STRING TO CONVERT INTO NUMBER. 
    call string2number ;◄■ NUMBER WILL RETURN IN BX. 
    mov al, bl   ;◄■ COPY NUMBER INTO AL.  

    delay: 
    mov ctr,'0' 
    mov al,bl 
    mov cx,100 
    skip: 
    x: 
    mov al,00000000b 
    mov dx,378h 
    out dx,al 
    loop x 

    Z: mov al,bl 
    mov dx,378h 
    out dx,al 
    loop z 
    inc ctr 

    Cmp ctr,'8' 
    Je exit 
    jmp skip 
    Exit : 
    Mov ah,4ch 
    int 21h 
; End start  
;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 
;CONVERT STRING TO NUMBER IN BX. 
;SI MUST ENTER POINTING TO THE STRING. 
proc string2number 
;MAKE SI TO POINT TO THE LEAST SIGNIFICANT DIGIT. 
    inc si ;POINTS TO THE NUMBER OF CHARACTERS ENTERED. 
    mov cl, [ si ] ;NUMBER OF CHARACTERS ENTERED.           
    mov ch, 0 ;CLEAR CH, NOW CX==CL. 
    add si, cx ;NOW SI POINTS TO LEAST SIGNIFICANT DIGIT. 
;CONVERT STRING. 
    mov bx, 0 
    mov bp, 1 ;MULTIPLE OF 10 TO MULTIPLY EVERY DIGIT. 
repeat: 
;CONVERT CHARACTER.      
    mov al, [ si ] ;CHARACTER TO PROCESS. 
    sub al, 48 ;CONVERT ASCII CHARACTER TO DIGIT. 
    mov ah, 0 ;CLEAR AH, NOW AX==AL. 
    mul bp ;AX*BP = DX:AX. 
    add bx,ax ;ADD RESULT TO BX. 
;INCREASE MULTIPLE OF 10 (1, 10, 100...). 
    mov ax, bp 
    mov bp, 10 
    mul bp ;AX*10 = DX:AX. 
    mov bp, ax ;NEW MULTIPLE OF 10. 
;CHECK IF WE HAVE FINISHED. 
    dec si ;NEXT DIGIT TO PROCESS. 
    loop repeat ;COUNTER CX-1, IF NOT ZERO, REPEAT. 

    ret 
endp