Как распечатать остаток от деления с помощью библиотеки emu8086.inc

#assembly #x86 #integer-division #emu8086

# #сборка #x86 #целочисленное деление #emu8086

Вопрос:

Я пытаюсь распечатать остаток от деления, используя библиотеку 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:

 ;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
 

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