没个正样 发表于 2012-2-5 22:25:44

终于把《课程设计1》做出来了!接下来我向前进,向前进!

assume cs:code,ds:data,es:data1,ss:stack

data segment
   db 2000 dup (' ')         ;临时存储字符串。
data ends

data1 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个字符串。
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型数据
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型数据
data1 ends

stack segment
   dw 32 dup(0)
stack ends

code segment
start:mov ax,data
          mov ds,ax
          mov ax,data1
          mov es,ax
          mov ax,stack
          mov ss,ax
          mov sp,40h
          mov bx,0
          mov si,0
          mov di,0
      
          mov cx,21
s5:   push cx
   
         mov ax,es:
         mov ,ax
         mov ax,es:
         mov ,ax   ;以上4句的作用是存放年份.
   
      mov ax,es:54h;第一个'年收入'的段基址为54H   ;是存放公司总收
      mov dx,es:56h
      mov bp,10
      call dtoc         ;dtoc子程序实现将word型整数转化为ASCIIma字符串并存储
   
       mov ax,es:0A8h    ;第一个'人数'的段基址为0A8H
       mov dx,0            ;以上2句是存放公司的人数
       mov bp,20
       call dtoc
   
      mov ax,es:54h
      mov dx,es:56h
      div word ptr es:0A8h
      mov dx,0               ;以上3句是存放人均收入
      mov bp,30
      call dtoc
   
      pop cx
      add bx,4   
      add si,2
      add di,80    ;以上3句是为下一次循环时存放数据做准备
   
      loop s5      ;跳到标号s5处

      mov dh,4         ;初始化打印的位置
      mov dl,21
      mov cl,07h
      call show_str   ;开始打印字符串
      mov ax,4c00h
      int 21h


dtoc:;数值显示的子程序定义
      push ax
      push bx
      ;push cx
      push dx
      push si
      push di
      push bp
      
      mov bx,0
      mov si,0
s1:   mov cx,10d   ;d表示十进制,cx准备被除
      call divdw
      
       mov bx,cx
       mov cx,ax
       jcxz s2
       add bx,30h      ;余数+30h
       push bx
       inc si
       jmp s1
s2:add bx,30h   ;再进行一次dx操作(补充当"商为零而余数不为零"时的情况)
       push bx
       inc si

       mov cx,si
s3:pop ax
       mov ds:,al
       inc bp
       loop s3
      
      pop bp
      pop di
      pop si
      pop dx
      ;pop cx
      pop bx
      pop ax
      ret   ;数值显示的子程序定义结束   


divdw:;不会产生溢出的除法运子程序定义开始
      push ax          ;低16位先保存
      mov ax,dx      ;ax这时候的值是高16位了
      mov dx,0         ;dx置0是为了不影响下边余数位,使得高16位为0
      div cx         ;H/N
      mov bx,ax      ;ax,bx的值为(int)H/N,dx的值为(rem)H/N

      pop ax         ;ax的值现在是L
      div cx         ;L/N,注意,16位除法的时候默认被除数DX为高16位,AX为低16位
      mov cx,dx   
      mov dx,bx
      ret   ;子程序定义结束


show_str:          ;显示字符串的子程序(定义开始)。
         push ax
         push bx
         ;push cx
         push dx
         push si
         push di
         ;push bp
      
      mov al,0a0h   ;每行有160个字节,转换成16进制为A0。
      dec dh   ;行号在显存中下标从0开始,所以自减1.
      mul dh ;相当于从第(n-1)*0A0H个Byte单元开始......
      mov bx,ax    ;定位好的位置偏移地址存放在bx里(行)
      mov al,2    ;每个字符占两个字节
      mul dl   ;定位列,结果ax存放的是定位好的列的位置
      sub ax,2    ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
      add bx,ax    ;此时bx中存放的是行与列号的偏移地址
      mov ax,0B800h;显存开始的地址
      mov es,ax   ;es中存放的是显存的第0页(共0--7页)的起始的段地址
      mov si,0
      mov di,0;di指向显存的偏移地址,确定指向下一个要处理的字符的位置
      
      mov al,cl;cl是存放颜色的参数,这时候al存放颜色了,因为cl下边要用来临时存放要处理的字符
      
      mov ch,0         ;下边cx存放的是每次准备处理的字符
   s: mov cl,ds:      ;ds:指向“ ”,0
      jcxz ok             ;当cl的值为0时候,cx == 0, 则发生跳转,到OK处结束处理!
      mov es:,cl      ;偶地址存放字符
      mov es:,al   ;奇地址存放字符的颜色属性
      inc si
      add di,2         ;指向了下个字符
      jmp short s      ;无条件跳转,jcxz是离开的关键跳!
   
   ok:;pop bp
         pop di
         pop si
         pop dx
         ;pop cx
         pop bx
         pop ax
      
      ret      ;显示字符串的子程序[定义结束]
   
   
code ends
end start


Seely 发表于 2012-2-6 17:28:56

恭喜LZ,继续努力。一直不愿意写,并拿自己数学不好的借口来安慰自己,惭愧啊:L

没个正样 发表于 2012-2-6 23:03:19

Seely 发表于 2012-2-6 17:28 static/image/common/back.gif
恭喜LZ,继续努力。一直不愿意写,并拿自己数学不好的借口来安慰自己,惭愧啊

朋友谢谢你的回复!
你也无需惭愧,真正头脑灵活的人,也不见得需要硬钻做这题;我是那种钻牛角尖的,硬跟自己较劲的人!

rainymay 发表于 2012-2-7 18:56:01

恭喜LZ又向大牛迈进了一大步
页: [1]
查看完整版本: 终于把《课程设计1》做出来了!接下来我向前进,向前进!