如何使用库 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 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
此代码在您的程序中没有任何用处。
【讨论】:
以上是关于如何使用库 emu8086.inc 打印除法的其余部分的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086
Qt。如何在 QPrinterDialog 中选择默认打印机并禁用其余打印机?
如何发布超过 280 个字符的推文?因此,如果字符串 > 280,则打印前 280 个字符,然后在该线程中再次使用其余字符发送推文