如何使用库emu8086.inc打印除法的余数

时间:2019-04-19 19:39:34

标签: assembly x86 integer-division 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 个答案:

答案 0 :(得分:1)

;SECOND INPUT
CALL SCAN_NUM
             ;AX/CX = AX
IDIV CX

评论有误! IDIV CXDX: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

此代码对您的程序没有任何帮助。