#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
Этот код не делает ничего полезного в вашей программе.