. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计一,感觉代码很臃肿,大家帮忙看看  [待解决] 回复[ 3次 ]   点击[ 354次 ]  
zy3287
[帖 主]   [ 发表时间:2008-11-24 16:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-17 17:25
assume cs:code

  data segment

    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1997','1992'
    db '1993','1994','1995'
    ;以上数据为年份记录(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年)

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258
    dw 2793,4037,5635,8226,11542,14430,15257,17800
    ;以上数据为雇员人数(对应上面21年)

    db 8 dup (0)
    ;定义8字节的内存空间用来存放除法所得余数

  data ends

  code segment

    start:
      mov ax,0b800h
      mov ds,ax
      mov ax,data
      mov es,ax

      mov bx,01E8H                       ;设定显示的起始位置为4行4列
      mov si,0
      mov di,0
      mov cx,21
    
    lop:
      ;将年份写入显示缓冲区指定位置
      mov ah,71h                         ;设定年份显示为白底蓝字
      mov al,es:[di]
      mov byte ptr [bx],al
      mov byte ptr [bx+1],ah
      mov al,es:[di+1]
      mov byte ptr [bx+2],al
      mov byte ptr [bx+3],ah
      mov al,es:[di+2]
      mov byte ptr [bx+4],al
      mov byte ptr [bx+5],ah
      mov al,es:[di+3]
      mov byte ptr [bx+6],al
      mov byte ptr [bx+7],ah

      mov dx,es:[di+86]                  ;取得年收入,存入DX和AX中
      mov ax,es:[di+84]
      call dtoc
      push si
      mov si,40
      call show
      pop si

      mov dx,0      
      mov ax,es:[si+168]                 ;取得雇员人数,存入AX中
      call dtoc
      push si
      mov si,80
      call show
      pop si

      mov dx,es:[di+86]                  ;取得年收入,存入DX和AX中
      mov ax,es:[di+84]
      div word ptr es:[si+168]
      mov dx,0
      call dtoc
      push si
      mov si,120
      call show
      pop si

      add bx,00a0h
      add si,0002h
      add di,0004h
      loop lop

      mov ax,4c00h
      int 21h

    dtoc:
      push cx
      push bx
      push si
      push di
      mov si,0
      mov di,0
      mov cl,0
      mov byte ptr es:[di+217],cl        ;将最后一个内存字节空间用来存储被除数的长度
    dwi:
      push ax
      mov ax,dx
      mov dx,0
      mov cx,10
      div cx
      mov bx,ax
      pop ax
      div cx
      add dx,30h
      push dx
      inc si
      mov dx,bx
      mov cx,ax
      inc cx                              ;解决当商为一,jcxz跳转
      jcxz ow
      loop dwi
    ow:
      mov cx,si
      mov byte ptr es:[di+217],cl
    wri:
      pop dx
      mov byte ptr es:[di+210],dl
      inc di
      loop wri
      pop di
      pop si
      pop bx
      pop cx
      ret      

    show:
      push cx
      push bx
      push di
      mov di,0
      mov ch,0
      mov cl,es:[di+217]
    s1:
      mov al,es:[di+210]
      mov [bx+si],al
      mov al,04h                         ;将年收入设置为红字
      mov [bx+si+1],al
      add bx,2
      inc di
      loop s1
      pop di
      pop bx
      pop cx
      ret   
      

  code ends

end start
martian
[第1楼]   [ 回复时间:2008-11-24 20:27 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:0
注册日期:2007-07-26 10:58
首先功能实现没有问题,至于优化问题,建议楼主在实现几次,就逐渐优化了
zy3287
[第2楼]   [ 回复时间:2008-11-25 08:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-17 17:25
谁有代码更优化的,贴出来学习一下啊?我昨天回去又写了一遍,不知道哪里还可以精简

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;++                                                                                      ++
;++                       课程设计一(完成于08/11/23,修改于08/11/25)                     ++
;++                                                                                      ++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


assume cs:code

  data segment

    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1997','1992'
    db '1993','1994','1995'
    ;以上数据为年份记录(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年)

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258
    dw 2793,4037,5635,8226,11542,14430,15257,17800
    ;以上数据为雇员人数(对应上面21年)

    db 10 dup (0)
    ;定义10字节的内存空间用来存放除法所得余数

  data ends

  code segment

    start:
      mov ax,0b800h
      mov ds,ax
      mov ax,data
      mov es,ax

      mov bx,01E8H                       ;设定显示的起始位置为4行4列
      mov si,0
      mov di,0
      mov cx,21
    
    lop:
      ;将年份写入显示缓冲区指定位置
      push si
      push di
      push cx
      mov cx,4
      mov si,0
      mov ah,71h                         ;设定年份显示为白底蓝字
    wry:
      mov al,es:[di]
      mov byte ptr [bx+si],al
      mov byte ptr [bx+si+1],ah
      inc di
      add si,2
      loop wry
      pop cx
      pop di
      pop si

      ;将年收入写入显示缓冲区指定位置
      mov dx,es:[di+86]                  ;取得年收入,存入DX和AX中
      mov ax,es:[di+84]
      call dtoc
      push si                 
      mov si,40                          ;取si存储显示间隔
      call show
      pop si

      ;将雇员人数写入显示缓冲区指定位置
      mov dx,0      
      mov ax,es:[si+168]                 ;取得雇员人数,存入AX中
      call dtoc
      push si
      mov si,80
      call show
      pop si

      ;将人均收入写入显示缓冲区指定位置
      mov dx,es:[di+86]                  ;取得年收入,存入DX和AX中
      mov ax,es:[di+84]
      div word ptr es:[si+168]
      mov dx,0
      call dtoc
      push si
      mov si,120
      call show
      pop si

      add bx,00a0h
      add si,0002h
      add di,0004h
      loop lop

      mov ax,4c00h
      int 21h

    dtoc:
      push cx
      push bx
      push si
      push di
      mov si,0
      mov di,0
      mov word ptr es:[di+218],0        ;将最后一个内存字空间用来存储被除数的长度
    dwi:
      push ax
      mov ax,dx
      mov dx,0
      mov cx,10
      div cx
      mov bx,ax
      pop ax
      div cx
      add dx,30h
      push dx
      inc si
      mov dx,bx
      mov cx,ax
      jcxz ow
      jmp short dwi
    ow:
      mov cx,si
      mov word ptr es:[di+218],cx
    wri:
      pop dx
      mov byte ptr es:[di+210],dl
      inc di
      loop wri
      pop di
      pop si
      pop bx
      pop cx
      ret      

    show:
      push cx
      push bx
      push di
      mov di,0
      mov ah,04h                         ;将年收入设置为红字
      mov cx,es:[di+218]
    s1:
      mov al,es:[di+210]
      mov [bx+si],al
      mov [bx+si+1],ah
      add bx,2
      inc di
      loop s1
      pop di
      pop bx
      pop cx
      ret   
      

  code ends

end start
mouselove
[第3楼]   [ 回复时间:2008-11-25 09:27 ]   [引用]   [回复]   [ top ] 
荣誉值:13
信誉值:0
注册日期:2008-03-09 16:31
mov ax,0b800h 
      mov ds,ax 
      mov ax,data 
      mov es,ax 
------------------
一般来说我们还是习惯ds存放data ;)

可以给子程序和一些功能块加备注。

子程序也就相当于c语言中的函数,程序的逻辑清晰很大程度上在于函数的设计。尽量主程序少尽量由子程序实现功能就清晰了~

先实现了,精简的事情可以等学过两章再说 :-)

刚看了下楼主的博客,还蛮干净的,根据学习活动的内容,是要多发发作业和做检测题的~
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved