Чтение и запись процедур и макросов на ассемблере - PullRequest
1 голос
/ 26 мая 2020

Мне нужно определить макрос, который поможет мне читать целое число без знака с клавиатуры, и процедуру, включенную в библиотеку, для вывода числа на консоль. Это мой код:

; 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. Мне просто нужно понять, что не так, и, возможно, найти работающее решение.

...