Сборочное умножение и сложение

Кажется, я не могу вывести целое число в сборке больше 128. Он работает нормально, пока я не добавляю/умножаю числа, получая целое число> 128. Он возвращает символ мусора. Помощь! Как я могу вывести эти целые числа. Вот полный код.

TITLE

.MODEL SMALL

.STACK 64

.DATA
MSGA DB 13,10,"Input Equation: ","$"
MSGB DB 13,10,"The sum is ","$"
MSGC DB 13,10,"The difference is ","$"
MSGD DB 13,10,"The product is ","$"
MSGE DB 13,10,"The quotient is ","$"
MSGF DB 13,10,"The difference is -","$"
MSGG DB 13,10,"The remainder is ","$"

OP1A db ?
OP1B db ?
OPRND db ?
OP2A db ?
OP2B db ?

RESULT db ?
NUM1 db ?
NUM2 db ?

;FOR THREE DIGIT OUTPUTS
FIRST db ?
SECOND db ?
THIRD db ?

.CODE
MAIN PROC NEAR
MOV AX, @DATA
MOV DS, AX

@STRT:
LEA DX, MSGA
MOV AH, 09H
INT 21H

;Get tens digit of first number
MOV AH, 01H
INT 21H
SUB AL, '0'
MOV OP1A, AL

;Get ones digit of first number
MOV AH, 01H
INT 21H
SUB AL, '0'
MOV OP1B, AL

;get OPERAND
MOV AH, 01H
INT 21H
MOV OPRND, AL

;Get tens digit of second number
MOV AH, 01H
INT 21H
SUB AL, '0'
MOV OP2A, AL

;Get ones digit of second number
MOV AH, 01H
INT 21H
SUB AL, '0'
MOV OP2B, AL

XOR AX, AX
XOR BX, BX

;Form the NUM2
MOV AL, OP2A
MOV BL, 10
MUL BL
ADD AL, OP2B
MOV NUM2, AL

;Form the NUM1
MOV AL, OP1A
MUL BL
ADD AL, OP1B
MOV NUM1, AL

XOR AX, AX
XOR BX, BX

;CHECK WHAT OPERAND IT IS
CMP OPRND, '+'
JE @ADD
CMP OPRND, '*'
JE @MULTI
CMP OPRND, '-'
JE @SUB
CMP OPRND, '/'
JE @DIV
CMP OPRND, '%'
JE @DIV

JMP @EXIT

;DIVIDE 
@DIV:
    CMP NUM2, 0
    JE @EXIT

    XOR AX, AX
    MOV AL, NUM1
    MOV BL, NUM2
    DIV BL

    CMP OPRND, '%'
    JE @MOD

    MOV RESULT, AL

    LEA DX, MSGE
    MOV AH, 09H
    INT 21H
JMP @PRINT

;MODULO
@MOD:
    MOV RESULT, AH

    LEA DX, MSGG
    MOV AH, 09H
    INT 21H
JMP @PRINT

;SUBTRACT
@SUB:
    MOV AL, NUM2
    CMP NUM1, AL
    JGE @PSTV

    ;Add the negative sign
    LEA DX, MSGF
    MOV AH, 09H
    INT 21H

    SUB AL, NUM1
    MOV RESULT, AL
JMP @PRINT

    @PSTV:
        MOV AL, NUM1
        SUB AL, NUM2
        MOV RESULT, AL  

        LEA DX, MSGC
        MOV AH, 09H
        INT 21H
JMP @PRINT

;MULTIPLY
@MULTI:     
    MOV AL, NUM2
    MOV BL, NUM1
    MUL BL
    MOV RESULT, AL

    LEA DX, MSGD
    MOV AH, 09H
    INT 21H
JMP @PRINT

;ADD
@ADD:
    MOV AL, NUM2
    ADD AL, NUM1
    MOV RESULT, AL

    LEA DX, MSGB
    MOV AH, 09H
    INT 21H
JMP @PRINT

;Print RESULT
@PRINT:

    CMP RESULT, 9
    JLE @ONEDIGIT

    CMP RESULT, 99
    JLE @TWODIGITS

        ;Separate the FIRST digit
        XOR AX, AX
        XOR BX, BX

        MOV AL, RESULT
        MOV BL, 100
        DIV BL
        MOV RESULT, AL
        MOV RESULT, AH

        ;Output the HUNDREDTHS frigging digit
        ADD FIRST, '0'
        MOV DL, FIRST
        MOV AH, 02H
        INT 21H

    @TWODIGITS:

        XOR AX, AX
        XOR BX, BX
        ;Separate the two remaining frigging digits
        MOV AL, RESULT
        MOV BL, 10
        DIV BL
        MOV SECOND, AL
        MOV THIRD, AH

        ;Output the TENS frigging digit
        ADD SECOND, '0'
        MOV DL, SECOND
        MOV AH, 02H
        INT 21H

        ;Output the ONES frigging digit
        ADD THIRD, '0'
        MOV DL, THIRD
        MOV AH, 02H
        INT 21H
    JMP @EXIT

    @ONEDIGIT:
        ADD RESULT, '0'
        ;Print one digit
        MOV DL, RESULT
        MOV AH, 02H
        INT 21H

@EXIT:
    MOV AH, 4CH
    INT 21H

MAIN ENDP
;--------
END MAIN

person Gionelle Tribiana    schedule 07.07.2013    source источник


Ответы (1)


Вы используете 8-битные регистры BL, AL и т. д. Диапазон 8-битных значений составляет +-128. Чтобы использовать большие значения, вам нужно использовать 16- или 32-битные регистры. Имена 16-битных регистров — BX, AX и т. д. Вам также необходимо определить свой результат как dw (для 16-битных) вместо db.

Смотрите больше информации здесь:

http://en.wikipedia.org/wiki/X86#x86_registers

person Ville Krumlinde    schedule 07.07.2013