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

Posted

技术标签:

【中文标题】如何使用库 emu8086.inc 打印除法的其余部分【英文标题】:How to print remainder of a division using the library emu8086.inc 【发布时间】:2019-04-19 19:39:33 【问题描述】:

我正在尝试使用 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 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

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

【讨论】:

以上是关于如何使用库 emu8086.inc 打印除法的其余部分的主要内容,如果未能解决你的问题,请参考以下文章

两个数组的和,每个数组 n 个字节

如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086

emu8086的软件简介

Qt。如何在 QPrinterDialog 中选择默认打印机并禁用其余打印机?

如何发布超过 280 个字符的推文?因此,如果字符串 > 280,则打印前 280 个字符,然后在该线程中再次使用其余字符发送推文

打印 awk 中的其余字段