Как распечатать остаток от деления с помощью библиотеки emu8086.inc - PullRequest
2 голосов
/ 19 апреля 2019

Я пытаюсь напечатать остаток от деления, используя библиотеку emu8086.inc, но остаток показывает значение ascii, когда я запускаю программу.Что я должен написать, чтобы точно напечатать остаток?

.MODEL SMALL
.STACK 100h
.DATA

.CODE
MAIN PROC

INCLUDE 'emu8086.inc'

 DEFINE_SCAN_NUM   ;DEFINE NUMBER FOR SCAN

 DEFINE_PRINT_NUM  ;DFINE NUMBER TO PRINT  



 DEFINE_PRINT_NUM_UNS ;DEFINE UNSIGNED NUMBER TO PRINT

 CALL SCAN_NUM   ;FIRST INPUT
 MOV AX,CX       ;SHIFT THE DATA TO AX

 PUTC 0AH        ;NEW LINE
 PUTC 0DH

                 ;SECOND INPUT
CALL SCAN_NUM
                 ;AX/CX = AX
 IDIV CX
                 ;NEW LINE
 PRINTN ''

 CALL PRINT_NUM  ;PRINT QUOTIENT 
 MOV AH,2
 MOV DL,AL
 INT 21H

1 Ответ

1 голос
/ 20 апреля 2019
;SECOND INPUT
CALL SCAN_NUM
             ;AX/CX = AX
IDIV CX

Комментарий неправильный! IDIV CX сделает деление со знаком DX:AX на CX.
Вам все еще нужно настроить DX.

CWD - это инструкция, которая расширит регистр AX до DX:AX. Если AX положительно, то DX получит 0, а если AX отрицательно, то DX получит -1. Этот шаг необходим для правильной работы инструкции IDIV CX! Он вернет частное в AX, а остаток в DX.

;SECOND INPUT
CALL SCAN_NUM      ;CX has the second input
CWD                ;AX has the first input, sign extending it to DX:AX
IDIV CX            ;DX:AX / CX

CALL PRINT_NUM  ;PRINT QUOTIENT

Это печатает частное от AX. Остаток от подразделения находится в DX. Просто переместите его на AX и вызовите ту же процедуру макроса печати для печати чисел со знаком.

CALL PRINT_NUM  ;PRINT QUOTIENT
mov  ax, dx
CALL PRINT_NUM  ;PRINT REMAINDER

MOV AH,2
MOV DL,AL
INT 21H

Этот код не делает ничего полезного в вашей программе.

...