鱼C论坛

 找回密码
 立即注册
查看: 2523|回复: 3

[技术交流] 终于把《课程设计1》做出来了!接下来我向前进,向前进!

[复制链接]
发表于 2012-2-5 22:25:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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:[bx]
         mov [di],ax
         mov ax,es:[bx+2]
         mov [di+2],ax   ;以上4句的作用是存放年份.
   
        mov ax,es:54h[bx]  ;第一个'年收入'的段基址为54H   ;是存放公司总收
        mov dx,es:56h[bx]
        mov bp,10
        call dtoc         ;dtoc子程序实现将word型整数转化为ASCIIma字符串并存储
   
       mov ax,es:0A8h[si]    ;第一个'人数'的段基址为0A8H
       mov dx,0              ;以上2句是存放公司的人数
       mov bp,20
       call dtoc
   
      mov ax,es:54h[bx]  
      mov dx,es:56h[bx]
      div word ptr es:0A8h[si]
      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:[di+bp],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:[si]      ;ds:[si]指向“ ”,0
      jcxz ok             ;当cl的值为0时候,cx == 0, 则发生跳转,到OK处结束处理!
      mov es:[bx+di],cl      ;偶地址存放字符
      mov es:[bx+di+1],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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-6 17:28:56 | 显示全部楼层
恭喜LZ,继续努力。一直不愿意写,并拿自己数学不好的借口来安慰自己,惭愧啊:L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-6 23:03:19 | 显示全部楼层

朋友谢谢你的回复!
你也无需惭愧,真正头脑灵活的人,也不见得需要硬钻做这题;我是那种钻牛角尖的,硬跟自己较劲的人!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-7 18:56:01 | 显示全部楼层
恭喜LZ又向大牛迈进了一大步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-19 18:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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