sdnyzjzx 发表于 2010-12-29 14:52:37

汇编语言 课程设计1

本帖最后由 sdnyzjzx 于 2010-12-29 14:56 编辑

第一个比较大点的代码,贴出来请大家指正。
    由于一开始写每个模块时,并不知道这个课程设计要求,也不懂编程的原则,所以开始设计的每个小模块都只照顾到了自己的功能,没有考虑到其他模块间的调用,加上不知道编程的原则(我认为至少要做好寄存器数据保护与还原),因此整个代码还不是很条理,甚至有点乱,也给后来合并到一起时的调试带来了很多麻烦,尽管如此,从中学到不处东西:1、了解了栈平衡的重要性;2、了解了编制一段大点代码要统筹安排,合理分配寄存器的使用,到底想要怎么传递参数,心里一定要清楚;3、练习了数据的寻址方式。
    尽管不算好,但功能实现了,还是贴出来记录一下,今后再进一步改进。assume cs:code

data segment

        dw 100 dup (0)
   idw 1423,12666,1,8,3,38
   jdd 1024,1234567,238763,887766,345543,99990088

   d_1   db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
         db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
         db '1993','1994','1995'

   d_2dd 16,22,382,1356,2390,8000,160000,24486,50065,97479,140417,197514
          dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

      d_3dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
         dw 11542,14430,15257,17800

data ends

table segment

      db 21 dup ('year summ ne ?? ')

table ends

stack segment
        dw 100 dup (0)
stack ends

code segment

start:mov ax,data
      mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,200
      mov ax,table
      mov es,ax
      mov bx,offset d_1                ;年份入栈
      mov cx,21

s1:                                  
        mov ax,
      push ax
      mov ax,
      push ax
      add bx,4
      loop s1
      mov bx,140h
      mov cx,15h
       
s2:           pop ax                                ;年份出栈到 table 表
      mov es:,ax
      pop dx
      mov es:,dx
      sub bx,10h
      loop s2
      mov bx,offset d_2
      mov cx,21

s3:   mov ax,                        ;收入入栈
      push ax
      mov ax,
      push ax
      add bx,4
      loop s3

      mov bx,140h
      mov cx,15h

s4:   pop ax                                ;收入出栈到 table 表
      mov es:,ax
      pop dx
      mov es:,dx
      sub bx,10h
      loop s4
      
        mov bx,offset d_3                ;雇员人数
      mov cx,21
      mov si,0

s5:   mov ax,
      push si
      shl si,1
      shl si,1
      shl si,1
      shl si,1
      mov es:,ax
      add bx,2
      pop si
      inc si
      loop s5

        mov cx,21                        ;计算人均收入
        mov bx,0

s6:   mov dx,es:
      mov ax,es:
      div word ptr es:
        mov es:,ax
        add bx,10h
      loop s6
; 以上获得 table 表数据
; 以下是显示部分

      mov bx,0                        ;要显示数据的偏移位置        
        mov si,0                           ;保存数据转化为字符后偏移位置
        mov di,0       
        mov cx,21                        ;要转化数据的个数 21行
        push cx

_main:       
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示年份
        call _printable
        add sp,2
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示收入
        mov ax,es:                        ;转化收入为字符
        mov dx,es:
        push cx
        mov cx,0ah
        call dtoc
        pop cx
        push bx
        mov bx,386                        ;3行33列
        call show_str
        pop bx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示雇员数
        mov ax,es:                        ;转化收入为字符
        mov dx,0
        push cx
        mov cx,0ah
        call dtoc
        pop cx
        push bx
        mov bx,410                        ;3行45列
        call show_str
        pop bx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示人均收入
        mov ax,es:                        ;转化收入为字符
        mov dx,0
        push cx
        mov cx,0ah
        call dtoc
        pop cx
        push bx
        mov bx,434                        ;3行57列
        call show_str

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;循环显示21行
        add di,160       
        pop bx                ;行加1
        add bx,10h
        loop _main
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;退出程序
      mov ax,4c00h
      int 21h

_printable:
        push bp
        mov bp,sp
        push cx

        push bx
        push si
        push es
        push ax

        xor ax,ax
        mov al,02h                ;显示首行
        mov cx,80*2
        mul cx
      xor dx,dx
        mov dl,18h                ;显示首列
        add dl,dl
      add ax,dx
        add ax,di
        mov si,ax
        mov cx,5

_s_show:
        mov al,es:                ;显示 1-5 位字符
        push bx
        push es
        mov bx,0b800h
        mov es,bx
        mov es:,al
        mov es:,byte ptr 4                ;字符颜色
        pop es
        pop bx
        inc bx
        inc si
        inc si
        loop _s_show

_s_over:
        pop ax
        pop es
        pop si
        pop bx
        pop cx
        mov sp,bp
        pop bp
        ret                       

dtoc:        push bx       
_s0:    call divdw
        cmp dx,0                        ;商的高位是否为0
        jnz _s1
        cmp ax,0                        ;商的低位是否为0
        jnz _s1
        add cx,30h
      mov ,cx
        pop bx
        ret                                ;数据转化完成,返回
_s1:                                       ; 写入转化完成的数据为字符
        add cx,30h
      mov ,cx
      inc si
        mov cx,0ah
      jmp _s0

show_str:
        push es
        mov ax,0b800h
      mov es,ax
xianshi:                                 ;dtoc 显示
       
        mov al,
      mov byte ptr es:,al        ;要显示的字符
      mov byte ptr es:,4        ;要显示字符的颜色
        cmp si,0
      jz ok
      dec si
        add bx,2
      jmp xianshi
      
ok:        pop es
        ret
   
divdw:        push si                                ;dword型数值除法运算
      push di
        mov si,ax                           ;save ax(L)t
      mov ax,dx
      mov dx,0
      div cx                          ;(H/N)
        mov di,dx                              ;save rem(H/N)
        push di
        mov dx,0                      ;int(H/N)
        mov di,2
        mul di
      mov bx,32768                           ;int(H/N)*65536
      mul bx
        pop di
      push ax                         ;save int(H/N)*65536
        push dx
      mov ax,di                      ;Load rem(H/N)
      mov di,2
      mul di
      mul bx
      add ax,si                      ;rem(H/N)*65536+L
      div cx
        mov si,ax
        mov cx,dx
        pop dx
      pop ax
        pop di
        add ax,si
        pop si
        ret

code ends
end start

Nisy 发表于 2010-12-30 13:57:03

很给力 good job ~

cjteam 发表于 2010-12-31 11:52:03

不错,有前途啊,写的很好

echo 发表于 2011-1-1 11:51:07

太强大了……
在看第八章……

tianfire 发表于 2011-1-3 21:09:57

学好汇编不容易,大学时学过,不过早忘了./:011

winmvp 发表于 2011-1-10 16:39:28

好厉害,俺考核终于结束了有时间了争取追上大家

shenaset 发表于 2011-6-9 19:03:05

收藏,慢慢研究

zuxin521 发表于 2011-6-28 19:45:14

汇编看不懂哦~~~
页: [1]
查看完整版本: 汇编语言 课程设计1