두 단계를 실행해야합니다
- 는, 문자열로 개별없는 문자를 숫자에 동의합니다.
- 문자열을 프로 시저로 숫자로 변환하십시오.
이것은 당신이 문자열을 수용하는 방법입니다
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
예, 나는 그래서 병렬 포트 인터페이스에 처리하기 위해 무슨 일이 있었는지 볼 수에 지연을 갖고 싶어 :
다음 마지막에 변화와 절차 "string2number"와 코드 cx를 10 –
으로 사용했습니다. 제 대답은 당신이 원하는대로 번호를 입력하도록했습니다. 내 코드를 컴파일러에 복사하여 붙여넣고 테스트하십시오. –