汇编语言程序出现divide error,求改正

作者&投稿:广货 (若有异议请与网页底部的电邮联系)
汇编程序出现divide overflow错误~

可能是余数没有清零的问题,在进行除法操作之前默认的余数寄存器要先清零的。
如果是做16位的除法,在div指令前加一句sub ah,ah试试。。。。。

DATAS SEGMENT
DAT1 DB 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22
AA DB ?, ?, '$'
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES, DS:DATAS
START:
MOV AX, DATAS
MOV DS, AX

LEA SI, DAT1
MOV CX, 19
MOV DX, 0
MOV DL, [SI]
ADC DH, 0
N1: INC SI
ADD DL, [SI]
ADC DH, 0
LOOP N1

MOV AX, DX
MOV BL, 20
DIV BL

MOV AH, 0
MOV BL, 10
DIV BL
ADD AL, 30H
ADD AH, 30H

LEA BX, AA
MOV [BX], AL
MOV [BX + 1], AH

LEA DX, AA
MOV AH, 09H
INT 21H

MOV AH, 4CH
INT 21H
CODES ENDS
END START

;从键盘输入一个十进制数num(70~99),

;从键盘输入一位数i,

;以十进制形式输出小于num且能被i+1整除的所有数。


DATAS   SEGMENT
       S    DB  3, ?, 3  DUP(?)
    INPUT   DB  0AH, 0DH, 'INPUT  NUM: $'
    INPUT2  DB  0AH, 0DH, 'INPUT  SNO: $'
    OUTPUT  DB  0AH, 0DH, 'NUMBER  IS: $'
    ER      DB  0AH, 0DH, 'INPUT  ERROR. $'
DATAS   ENDS
CODES   SEGMENT
    ASSUME   CS:CODES, DS:DATAS
START:
    MOV   AX, DATAS
    MOV   DS, AX
    
SHURU:   
    LEA   DX, INPUT
    MOV   AH, 9
    INT   21H
    LEA   DX, S
    MOV   AH, 10
    INT   21H
;-----------------------------    
    MOV   AX, 0
    LEA   BX, S + 2
CWPC:
    CMP   BYTE  PTR [BX], 0DH
    JE    CWPC2
    CMP   BYTE  PTR [BX], '0'
    JB    ERROR
    CMP   BYTE  PTR [BX], '9'
    JA    ERROR
    
    MOV   CX, 10
    MUL   CX
    MOV   CX, 0
    MOV   CL, [BX]
    SUB   CL, '0'
    ADD   AX, CX
    INC   BX
    JMP   CWPC
;-----------------------------
CWPC2:
    MOV   CX, AX  ;number
    DEC   CX      ;小于
    
    LEA   DX, INPUT2
    MOV   AH, 9
    INT   21H    
    MOV   AH, 1
    INT   21H
    CMP   AL, '0'
    JB    ERROR
    CMP   AL, '9'
    JA    ERROR
    SUB   AL, '0'
    INC   AL
    MOV   BL, AL  ;i+1
;-----------------------------
    LEA   DX, OUTPUT
    MOV   AH, 9
    INT   21H        
QUYU:
    MOV   AX, CX
    DIV   BL
    CMP   AH, 0
    JNE   NEXT
SHUCHU:
    MOV   AX, CX
    AAM
    MOV   DL, AH
    MOV   DH, AL
    OR    DX, 3030H
    MOV   AH, 02H
    INT   21H
    MOV   DL, DH
    INT   21H    
    MOV   DL, 20H
    INT   21H
NEXT:
    LOOP  QUYU
    JMP   EXIT
;-----------------------------
ERROR:
    LEA   DX, ER
    MOV   AH, 9
    INT   21H
EXIT:    
    MOV   AH, 4CH
    INT   21H
CODES   ENDS
    END   START



编写一个汇编语言程序,它先接受一个字符串然后显示其中数字字符的个数...
INSTR0 BB1: MOV AH,1 INT 21H CMP AL,13 JE NEXT1 MOV [DI],AL INC WORD PTR[INNUM] INC DI JMP BB1 NEXT1: LEA SI,INSTR0 MOV

汇编语言程序设计:作业
1.20H占一个内存单元,[bx]占两个内存单元,即两字节,不能相加,内存单元大小不同 2.[cx]不能用来表示内存单元,只有bx,si,bp可以用来表示内存单元,且内存单元大小不同 3.al是八位寄存器,bx是16位寄存器,不能相加,内存单元不同不能相加 4.di不能表示内存单元,只有bx,si,bp三个寄存器可以...

DI是什么意思?
女生的di意思是“目的地想象”,是一项国际性的培养青少年创造力的活动。DI协会成立于1983年,总部设在美国的新泽西州,并于每年5月份在美国举办DI全球总决赛。所谓DI,就是头脑奥林匹克(Drillinstructor)的意思,是由美国引进的,主要是开发青少年的智力。DI要求所有参与竞赛的团队需用创意完成两种不同...

《汇编语言程序设计》复习题答案求救,分析题!高分,谢谢!
41答案如下:SI是源地址寄存器,DI是目的地址寄存器,就是以源地址寄存器[SI]开始的64H个字节里面的内容,复制到以[DI]为始址的空间中去。CX是计数器嘛,就是复制64H个字节的内容,MOVSB就是MOV 以 B为单位!42答案如下:DATA SEGMENT A DW 0 B DW 0 C DW 15H,5H,50H DATA ENDS CODE ...

为什么在python中是ioc \/ di不常见
1. 其实我不认为直接投资\/ IoC是在Python。什么是却是直接投资\/ IoC。想想看:什么是一个DI容器呢?它可以让你 连线连成应用程序...在 我们有“接线合”及“脚本 动态 所以,一个DI容器不过是一个解释的动态脚本语言。实际上,另一种方式是:一个典型的Java \/ .NET的DI容器不过是一个蹩脚的解释...

用C++语言编写程序(不是C):输入一个正整数a,以及另外5个正整数,输出后...
include <iostream> using namespace std;int main (){ int a;cout<<"请输入正整数a"<<endl;cin>>a;int x,s=0;cout<<"请输入另外5个正整数"<<endl;for (int i=1;i<=5;i++){ cin>>x;if (x< a)s += x;} cout<<"5个整数中那些小于a的整数的和是"<<s<<endl;return 0;...

【微机原理】1.汇编语言程序设计(1)
代码示例: 在DATA SEGMENT中,我们假设A=3, B=4,程序开始执行:首先,设置数据段地址到DS(MOV DS, AX)通过LEA SI, A,SI指向A的地址读取A的值(MOV AX, [SI]; INC SI)接着读取B的值(MOV BX, [SI]; INC SI)执行加法并存储结果到内存(ADD BX, AX; MOV [DI=memory location of ...

用汇编语言编写程序,将一串凌乱的字母按从小到大的顺序排列,并将排好...
DATAS SEGMENT DATA DB 'bcda$';此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATAS MOV DS,AX MOV SI,1 LOP1:MOV DI,SI INC DI MOV AL,DATA[SI-1]LOP2:CMP AL,DATA[DI-1...

用汇编语言编写字符串查找的程序,怎样编?急用!谢谢啦!
MOV DI,OFFSET输入输出DI指向输出字符串 MOV AH,01 INT 21H 输入的字符你要删除,存放在AL LOOP1:MOV AH,[BX]CMP AH,AL比较字符串的字符是否要删除字符相同 JE NO_COPY相同,执行删除 MOV [DI],AH不同的复制到输出字符串的字符 INC DI指针DI加 NO_COPY的:INC BX的字符发送到输出字符串...

汇编语言程序设计提问
3. inc的操作数应是一个寄存器或内存单元,执行结果是将其内容加1 4.不能直接把立即数传送到段寄存器中,可以改为 mov ax,2000H mov dx,ax 5.add的源操作数不能是段寄存器,只能是通用寄存器、立即数或存储器 6.寄存器间接寻址的寄存器只能使用BX、BP(基址) 和SI、 DI(变址),即不能不...

宁乡县13286593342: 汇编语言问题,执行起来黑框里边不知道为啥出来DIVIDE ERROR,没有除0啊. -
班泻可尼: 32位程序的话可以调用msvcrt.dll里的C函数,16位的话可以用mov ah, 1int 21h来接受一个键盘响应或者直接用控制台启动程序就可以了...

宁乡县13286593342: 汇编语言写的程序运行时出现“divide overflow" -
班泻可尼: CWD的功能是将AX中的字扩展成双字存入DX和AX中 你再将mov dl,2然后div dx,表示用DX和AX中的双字除以DX,这样就存在被除数的DX被除数的DX改变了,所以结果就会出错; div dl表示用AX的值除以DL,不存在矛盾. 但你显示的结果...

宁乡县13286593342: 汇编语言中运行程序时出现divide overflow是怎么回事? -
班泻可尼: 除法溢出错误,一般是由于0做了除数.

宁乡县13286593342: C语言程序编辑好后,电脑没有检查出错误,但是运行时结果输出显示为“Divide error”.
班泻可尼: 类似这种错误语法上是没问题的,总是在运行中.你应该记住出错误的条件(比如输入某个数进行计算时),然后在IDE中,在程序源代码的适当位置设置断点,再一步一步进行调试.通常可能是出现了除数为零的情况. 查出问题后就可以着手解决了.以我的经验,解决有两种方法(其他高手如有更好的方法,欢迎赐教),一是在每一次浮点运算时都进行检查(分母是否为0,对数的真数是否小于或等于0,根号下的数字是否小于0等等),出现后就给出一个错误提示,不要再执行了.过去我在DOS下就是这么办的.现在好一些,可以用异常机制进行处理(如果你的编译器支持异常的话).

宁乡县13286593342: 汇编程序出错 divide overflow -
班泻可尼: 如果没记错的话,你这错误提示是除法溢出 除法只能是16位除8位,或32位除16位 而你这是16位除16位 MOV AX,[BX] MOV BX,100 DIV BX ;AX除数 当然会溢出报错

宁乡县13286593342: 汇编出现Divide overflow -
班泻可尼: 那是除法溢出的意思,我不想看你的程序,但是,原因多半是: 由于DX,AX作为被除数的高位低位,除法之后,DX作为余数,AX作为商,考虑这样的情况: DX = 1111H AX = 1111H 除以 CX = 1H 当然商是1111 1111H,余数是0 但是DX显然无法装下1111 1111H 所以是除法溢出. 还有一种可能是除数是0.

宁乡县13286593342: c语言divide error的意思.
班泻可尼: 头文件包含写漏了,w请定义为float或者使用强制类型转换.按你的思路s应该初始话为0.

宁乡县13286593342: 在C语言中Divide error是什么意思? -
班泻可尼: 在C语言中的除法运算中,如果除数为0,就会出现Divide error.取模(%)运算中的除数和被除数不全为整型时也会出现错误.你可以仔细检查一下源程序,看是否是以上的问题.

宁乡县13286593342: 运行C语言程序时显示“divide error”???
班泻可尼: 原来求最大公约数的地方错了,gcd=n改成gcd=m; 另外输出的时候使用x y代替m n,因为这个m n已经不是原来输入得了.而x y保存了原来的m n. #include <stdio.h> int main(void) { int gcd,/*?*/ lcm, m, n,t,x,y; int repeat, ri; scanf("%d", &...

宁乡县13286593342: 汇编程序出现divideoverflow错误
班泻可尼: 应该对你有帮助的!除法溢出的错误提示.自己看看你的除法运算语句div相关的,以及商和余数的存储器里存的是什么

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网