格式天下 发表于 2012-3-9 19:32:43

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

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,
         mov es:,al
                mov al,
                mov es:,al
                mov al,
                mov es:,al
                mov al,
                mov es:,al
      ;输入地一个年份
   
   mov ax,ds:54h
   mov es:5,ax         ;输入第一个收入
   
   mov ax,ds:0a8h
   mov es:0ah,ax
   
   mov ax,ds:54h
   mov dx,ds:54h
   
   mov ax,ds:0a8h
   mov es:0dh,ax
   
   div word ptr es:0a8h
   mov es:0ch,ax
   
   add bx,0a0h
   add si,4
   add di,2
   loop s
   
   mov ax,4c00h
   int 21h
codesg ends
end start   

莫名其妙 发表于 2012-3-9 19:32:44

本帖最后由 莫名其妙 于 2012-3-9 19:49 编辑

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

顺qi吇繎 发表于 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,                        ;读取年份 存入ax
            mov ah,0
            inc dl
            call show_str
      inc di
      loop s1
      
      mov dl,35                        ;列               
      push dx
      mov si,0
      
      mov ax,ds:                ;读取公司总收入的低16位 存入ax
      mov dx,ds:                ;读取公司总收入的高16位      存入dx
      call dtoc                        ;将数字转换成10进制形式的字符串格式,并显示
      add sp,2
      
      mov dl,45                        ;列
      push dx
      mov si,0
      
      mov dx,0
      mov ax,ds:                ;读取雇用人数存入ax
      call dtoc                        ;显示人数
      add sp,2
      
      mov dl,55                        ;列
      push dx
      mov si,0
      
      mov ax,ds:                ;读取公司总收入的低16位 存入ax
      mov dx,ds:                ;读取公司总收入的高16位      存入dx
      div word ptr ds:      ;算出人均收入,结果存入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:      ;行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:,al                ;偶数位存放字符闪烁 背景 高亮 前景
      mov byte ptr es:,7      ;奇数位存放颜色.0   000   0   111      为黑底白字               
      pop bx
      ret


codesg ends
end start

顺qi吇繎 发表于 2012-3-10 16:08:28

本帖最后由 顺qi吇繎 于 2012-3-10 16:08 编辑

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

格式天下 发表于 2012-3-10 19:27:29

顺qi吇繎 发表于 2012-3-10 15:49 static/image/common/back.gif
assume cs:codesg

data segment


辛苦了,谢谢啊
页: [1]
查看完整版本: 课程设计1,哪错了?求高手指点