Мне нужно определить макрос, который поможет мне читать целое число без знака с клавиатуры, и процедуру, включенную в библиотеку, для вывода числа на консоль. Это мой код:
; READ UNSIGNED NUMBER
READNUM MACRO NUM
LOCAL MAINLOOP, FINISH
MOV DX, 10
MAINLOOP:
MOV AH, 01H
INT 21H ; echo read a single key
CMP AL, 0DH ; when ENTER, finish reading
JE FINISH
SUB AL, '0' ; subtract 48, ASCII code of 0, to get numeric value
MOV CL, AL ; place what we read in CL
XOR CH, CH ; CH = 0
MOV AX, BX ; get the existing number (stored in BX)
MUL DL ; multiply it by 10
ADD AL, CL ; add the newly read digit
MOV BX, AX ; place the completed number in BX
JMP MAINLOOP
FINISH:
MOV NUM, BL ; place the current number
ENDM
; PRINT UNSIGNED NUMBER
DATAP SEGMENT PARA PUBLIC 'DATA'
COUNT DB 0
DATAP ENDS
CODEP SEGMENT PARA PUBLIC 'CODE'
PUBLIC PRINTNUM ; public declaration for PRINTNUM
ASSUME DS: DATAP, CS: CODEP
PRINTNUM PROC FAR
HEXTODEC: ; convert nr from HEX to decimal
XOR DX, DX
MOV BX, 10
; NUMBER TO BE DIVIDED IS IN AX
DIV BX ; divide the number by 10, quotient is in AL, remainder is in AH if BYTE, else DX
MOV BH, 0
MOV BL, AH
PUSH BX ; push remainder onto stack
INC COUNT ; count nr of digits of number
CMP AL, 0 ; check if quotient is 0
JNE HEXTODEC ; if != 0, keep dividing
MOV AH, 02H ; prepare for printing
PRINT:
POP DX ; take remainders from stack (in rev order they were obtained)
ADD DL, '0' ; obtain ASCII value from numeric value
INT 21H ; print
DEC COUNT ; decrement number of digits left
CMP COUNT, 0 ; check if there are no more digits left
JNE PRINT ; if != 0, keep printing
RET
PRINTNUM ENDP
CODEP ENDS
END
В моем основном файле у меня есть следующее:
IF 1
INCLUDE C:\TASM\MRNUM.ASM
ENDIF
EXTRN PRINTNUM: FAR
DATA SEGMENT PARA PUBLIC 'DATA'
NUM DB 0
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
START PROC FAR
ASSUME CS:CODE, DS:DATA
PUSH DS
XOR AX, AX
PUSH AX
MOV AX, DATA
MOV DS, AX
READNUM NUM
MOV AH, 0
MOV AL, NUM
CALL PRINTNUM
RET
START ENDP
CODE ENDS
END START
При запуске кода в TASM я получаю символ, отображаемый после каждого di git i input, а на выходе - просто полный мусор sh. Мне просто нужно понять, что не так, и, возможно, найти работающее решение.