如何使用库emu8086.inc打印除法的剩余部分

问题描述 投票:2回答:1

我正在尝试使用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
assembly x86 integer-division emu8086
1个回答
1
投票
;SECOND INPUT
CALL SCAN_NUM
             ;AX/CX = AX
IDIV CX

评论错了! IDIV CX将由DX:AXCX进行签名划分。 你仍然需要设置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

此代码在您的程序中没有任何用处。

© www.soinside.com 2019 - 2024. All rights reserved.