鱼C论坛

 找回密码
 立即注册
查看: 2515|回复: 4

课程设计1,哪错了?求高手指点

[复制链接]
发表于 2012-3-9 19:32:43 | 显示全部楼层 |阅读模式
1鱼币
捕获.PNG assume cs:codesg,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'
        ;以上是表示21年的21个字符串,4字节0~53h

        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上是表示21年公司总收的21个dword型数据,4字节54~0a7h

        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,45257,17800
        ;以上是表示21年公司雇员人数的21个word型数据,2字节0a8~0d2h
data ends

table segment
        db 21 dup('year summ ne ?? ')
table ends

codesg segment
start:mov ax,data
      mov ds,ax
   
   mov ax,0b800h
   mov es,ax
   
   mov bx,0
   mov si,0
   mov di,0
   mov dx,0
   
s:      mov al,[bx]
         mov es:[di],al
                mov al,[bx+1]
                mov es:[di+1],al
                mov al,[bx+2]
                mov es:[di+2],al
                mov al,[bx+3]
                mov es:[di+3],al
        ;输入地一个年份
   
   mov ax,ds:54h[si]
   mov es:5[bx],ax           ;输入第一个收入
   
   mov ax,ds:0a8h[di]
   mov es:0ah[bx],ax
   
   mov ax,ds:54h[si]
   mov dx,ds:54h[si+2]
   
   mov ax,ds:0a8h[si]
   mov es:0dh[di],ax
   
   div word ptr es:0a8h[di]
   mov es:0ch[si],ax
   
   add bx,0a0h
   add si,4
   add di,2
   loop s
   
   mov ax,4c00h
   int 21h
codesg ends
end start   

最佳答案

查看完整内容

一点点说 mov al, mov es:[di],al 这个好理解 mov al, mov es:[di+1],al 但是这里按说应该是存放颜色的位置 别忘记了内存中应该是 数据 颜色 数据 颜色.......这样排列的 al放数据 ah放颜色 如果你要放数据需要加2才是下一个数据的位置 mov al, 这下面的都一样 mov es:[di+2],al mov al, mov es: ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-9 19:32:44 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-9 19:49 编辑

一点点说
mov al,[bx]
         mov es:[di],al       这个好理解
          mov al,[bx+1]
                mov es:[di+1],al       但是这里按说应该是存放颜色的位置  
  别忘记了内存中应该是 数据 颜色 数据 颜色.......这样排列的 al放数据 ah放颜色 如果你要放数据需要加2才是下一个数据的位置
          mov al,[bx+2]        这下面的都一样
                mov es:[di+2],al
                mov al,[bx+3]
                mov es:[di+3],al

评分

参与人数 1鱼币 +1 收起 理由
格式天下 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-10 15:49:02 | 显示全部楼层
本帖最后由 顺qi吇繎 于 2012-3-10 16:14 编辑

assume cs:codesg

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'
        ;以上是表示21年的21个字符串 0-53H
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 234980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上是表示21年公司总收入的21个dword型数据 054H-0A7H
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
        ;以上是表示21年公司雇员人数的21个word型数据 0A8H-0D1H
data ends

stack segment
        dw 20 dup(0)
stack ends

codesg segment

start:        
        mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,40

        mov dh,2                        ;显示 行

        mov cx,21
        mov di,0
        mov bx,0
        
s:        push cx
        mov cx,4
        mov dl,24                        ;列
    s1: mov al,[di]                        ;读取年份 存入ax
            mov ah,0
            inc dl
            call show_str
        inc di
        loop s1
        
        mov dl,35                        ;列               
        push dx
        mov si,0
        
        mov ax,ds:[50h+di]                ;读取公司总收入的低16位 存入ax
        mov dx,ds:[52h+di]                ;读取公司总收入的高16位        存入dx
        call dtoc                        ;将数字转换成10进制形式的字符串格式,并显示
        add sp,2
        
        mov dl,45                        ;列
        push dx
        mov si,0
        
        mov dx,0
        mov ax,ds:[0a8h+bx]                ;读取雇用人数存入ax
        call dtoc                        ;显示人数
        add sp,2
        
        mov dl,55                        ;列
        push dx
        mov si,0
        
        mov ax,ds:[50h+di]                ;读取公司总收入的低16位 存入ax
        mov dx,ds:[52h+di]                ;读取公司总收入的高16位        存入dx
        div word ptr ds:[0a8h+bx]        ;算出人均收入,结果存入ax
        mov dx,0
        call dtoc                        ;显示平均收入
        add sp,2
        
        inc dh                                ;行数+1
        add bx,2
        pop cx
        loop s
        
        mov ax,4c00h
        int 21h

dtoc:        
        mov cx,0ah
        call divdw
        add cx,30h                        ;将cx(余数)+30h 转换为该数字的ASCII码的对应字符 0对30H 1对31H...9对39H
        push cx                                ;利用压栈出栈的逆序原理,将最多10个字符串逆序排列
        inc si
        mov cx,ax                        ;将商放入CX并判断是否为0,为0则该数已经被分解完成,否则继续分解.
        jcxz okax
        jmp short dtoc
        
   okax:mov cx,dx                        ;低16位 ax的值为0时,转到这里判断DX的值是否为0
            jcxz okdx                        ;如果dx也为0,则跳到结束.
            jmp dtoc                        ;如果dx不为0,返回去继续取余数

   okdx:mov cx,si                        ;将压入的字符个数送入CX,来调整POP次数                        
        mov dx, word ptr ss:[36]        ;行dh 列dl
     s2:pop ax
        call show_str
        inc dl
        loop s2
        ret

divdw:        push di                                ;此处为不溢出除法
        mov di,ax
        mov ax,dx
        mov dx,0
        div cx
        xchg di,ax

        div cx
        mov cx,dx
        mov dx,di
        pop di
        ret
        
show_str:
        push bx
        push ax
        mov al,dh                         ;以下将 ((行数-1)*160 + b8000H)/16 = 段地址ES
        dec al
        mov bl,0ah
        mul bl
        add ax,0b800h
        mov es,ax
                                        ;以下将(列数-1)*2 转换为本行的偏移字节数 存放在bx中
        mov al,dl
        dec al
        mov bl,2
        mul bl
        mov bx,ax

        pop ax
        mov byte ptr es:[bx],al                ;偶数位存放字符  闪烁 背景 高亮 前景
        mov byte ptr es:[bx+1],7        ;奇数位存放颜色.  0   000   0   111        为黑底白字               
        pop bx
        ret


codesg ends
end start

评分

参与人数 1鱼币 +1 收起 理由
格式天下 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-10 16:08:28 | 显示全部楼层
本帖最后由 顺qi吇繎 于 2012-3-10 16:08 编辑

s:      mov al,[bx]
         mov es:[di],al
                mov al,[bx+1]
                mov es:[di+1],al
                mov al,[bx+2]
                mov es:[di+2],al
                mov al,[bx+3]
                mov es:[di+3],al
这个地方的读写存在问题,建议仔细研究一下屏幕缓存区的数据结构,偶字节存字符,奇字节存颜色,存入是:
mov byte ptr es:[di],al,并且你的把年份的第二个数写入了奇字节,第三个又在偶字节,第四个又在奇字节,这样肯定会出现彩虹

评分

参与人数 1鱼币 +1 收起 理由
格式天下 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-10 19:27:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表