首页
社区
课程
招聘
[求助]求助,看正文,错误中隐含着正确
发表于: 2009-2-10 21:57 3722

[求助]求助,看正文,错误中隐含着正确

2009-2-10 21:57
3722
小弟实在郁闷了.
<汇编语言>王爽,课程设计1
我把年份与金额在早上完成了.之后我就上学去了,晚上放学回来打算做完,可是在写人数的时候又遇到了问题。
因为显示金额与人数要完成的功能与方法基本相同所以我就直接拷贝先前写金额时的代码,然后稍微改动了几个地方.
请先看图的运行效果:
紫色方框中的内容是应该显示的东西,但是之外的却不是,而且方框里的正确数据实际上也是不正确的,请各位加载看看,我实在无法描述里面的情况.
代码在2楼

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 100
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,45257,17800
data ends
stack segment
        dw 16 dup (0)
stack ends
table segment
db 21 dup ('year summ ne ?? ')
table ends

code segment
        start:
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov cx,21
        mov bx,0
        mov di,0
        mov si,0
      s:mov ax,ds:0h[bx]
        mov dx,ds:2h[bx]
        mov es:[si].0h,ax
        mov es:[si].2h,dx
        mov ax,ds:54h[bx]
        mov dx,ds:56h[bx]
        mov es:[si].5h,ax
        mov es:[si].7h,dx
        mov ax,ds:0a8h[di]
        mov es:[si].0ah,ax
        mov ax,ds:54h[bx]
        div word ptr es:[si].0ah
        mov es:[si].0dh,ax
        add bx,4
        add si,16
        add di,2
        loop s
;*********************
;*
;*进行转换字符并且送入显存区域中
;*
;*********************
        mov ax,stack
        mov ss,ax
        mov sp,32
        mov ax,table
        mov es,ax; 存在数据的段地址
        mov ax,0b800h
        mov ds,ax; 显示区域的段地址处
        mov cx,21
        mov si,0;每次增加16,控制数据table
        mov di,0;每次增加160,控制显存区域中的行
        mov bp,30
        mov bx,2;
        push bx;栈中单元30与31为2,作为颜色
    zxh:mov sp,bp
        push cx;将循环次数入栈28与29存储循环次数
        mov bx,0
        push bx;栈中单元26与27个单元保持为0作为取数据时的结束条件
        ;******数据每一行的前4个单元为字符,无需转换,直接传入就可以
        mov bl,2
        mov ax,es:[si]
        mov [di],al
        mov [di+1],bl
        mov [di+2],ah
        mov [di+3],bl

        mov ax,es:[si+2]
        mov [di+4],al
        mov [di+5],bl
        mov [di+6],ah
        mov [di+7],bl
       
;**********************
;*di+偶数写字符值,,+奇数写颜色值2
;*进行32位数的字符转换(收入栏)
;*
;**********************
        mov ax,0
        mov dx,0
        mov bx,0
        mov cx,10;作为除数使用
        mov ax,es:[si+5]
        mov dx,es:[si+7]
       
     s0:push ax;先将低为入栈
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax;暂存高16位数除10的商
        pop ax
        div cx;使用先前dx/10的余数作为高16位,与出栈的ax除10
        mov cx,dx;保存余数
        mov dx,bx;此处还原高16位,此时商为dx(h)ax(l),余数存放在bx中
        mov bx,cx;将余数附给bx,因为之后需要使用到cx
        mov cx,dx
        jcxz pds1;判断商,先判断高位,如果为0就跳到pds1处
ruzhan:add bx,30h;如果高16为不为0,说明商不会为0,则将cx加30h转为字符,如果为0,以下不执行,到pds1标号出执行
        mov bh,2;bl为字符,bh保存颜色,然后入栈
        push bx
        mov cx,11;重新设置cx为除数10,这里设置为11是因为loop会减1.
        loop s0;
    pds1:mov cx,ax;如果高位为0,继续判断低16位的值是否为0,以确保商最后为0
        jcxz z;如果ax也为0,则说明商的确为0,跳转到 取数据 处,然后进行出栈到显存中
        ;如果商不为0,进行余数加30入栈
        inc cx;如果商为一,下面的指令会减去1,则成为0就无法计算最后一个商为1的数.
        loop ruzhan;进行入栈
       
      z:add bx,30h
        mov bh,2
        push bx

        mov bx,12
    qsj:pop cx
        jcxz ren;如果取到先前入栈的0,则不再
        mov word ptr [di+bx],cx;从栈中取数据放入显存中
        add bx,2
        loop qsj
        
;******************************
;*
;*以下进行转换人数
;*
;******************************
       
    ren:mov ax,0;取出栈中数据后,在进行下一组的转换与入栈出栈操作
        push ax;作为新一组取栈中数据时的结束条件
        ;*************-------------********************
        mov cx,10;作为除数使用
        mov ax,es:[si+10]
        mov dx,0
       
     r0:push ax;先将低为入栈
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax;暂存高16位数除10的商
        pop ax
        div cx;使用先前dx/10的余数作为高16位,与出栈的ax除10
        mov cx,dx;保存余数     0ba9:0102
        mov dx,bx;此处还原高16位,此时商为dx(h)ax(l),余数存放在bx中
        mov bx,cx;将余数附给bx,因为之后需要使用到cx
        mov cx,dx
        jcxz pds2;判断商,先判断高位,如果为0就跳到pds1处
ruzhan1:add bx,30h;如果高16为不为0,说明商不会为0,则将cx加30h转为字符,如果为0,以下不执行,到pds1标号出执行
        mov bh,2;bl为字符,bh保存颜色,然后入栈
        push bx
        mov cx,11;重新设置cx为除数10,这里设置为11是因为loop会减1.
        loop r0;
    pds2:mov cx,ax;如果高位为0,继续判断低16位的值是否为0,以确保商最后为0
        jcxz z1;如果ax也为0,则说明商的确为0,跳转到 取数据 处,然后进行出栈到显存中
        ;如果商不为0,进行余数加30入栈
        inc cx;如果商为一,下面的指令会减去1,则成为0就无法计算最后一个商为1的数.
        loop ruzhan1;进行入栈
       
     z1:add bx,30h
        mov bh,2
        push bx

        mov bx,28
    qsj2:pop cx
        jcxz null;如果取到先前入栈的0,则不再
        mov word ptr [di+bx],cx;从栈中取数据放入显存中
        add bx,2
        loop qsj2
        ;*************-------------********************
   
        ;以下代码是做最后循环时用的

   null:add si,16
        add di,160
        pop cx
        sub cx,1
        call zxh

        mov ax,4c00h
        int 21h
code ends
end start
2009-2-10 21:58
0
雪    币: 100
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
知道错哪里,忘了一个终止循环的条件.
2009-2-11 07:25
0
游客
登录 | 注册 方可回帖
返回
//