王爽《汇编语言》P211页课程设计

来源:互联网 发布:知名外汇交易商 知乎 编辑:程序博客网 时间:2024/06/02 09:50

本人由于想对语言有个深层次了解,所以就从汇编语言开始学起,以前也学过C语言,但一直学的不深入,在看了王爽老师的《汇编前言》的前言后,深受启发,学习要循序渐进,故决心先对汇编有一定了解后再去深入学习C语言和C++。以下是自己写的程序代码,比较拙劣,呵呵,第一次用汇编写这么长的程序:



assume cs:code
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个字符串


        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,15257,17800

;以上是表示21年公司雇员人数的21个word型数据


data ends


table1 segment
        db 21  dup ('                                ')    ;总共21X32个,用来存放转变后的字符数据
table1 ends


table2 segment
        db 21 dup ('year sumn ne ?? ')     ;用来存放data数据段调整后的数据
table2 ends


stack segment
        dw 16 dup (0)     ;创建堆栈,用于保存一些寄存器,避免寄存器冲突
stack ends



code segment

start: mov ax,data
        mov ds,ax ;ds:[bx+si]指向data段
        mov ax,table2
        mov es,ax ;es:[bp]指向table2段

        mov bx,0
        mov si,0
        mov bp,0

        mov cx,21

  s00: mov ax,ds:[bx+si]     ;循环21次,把data段中的数据,按照如:‘1975’   16    3  人均收入  这样的格式存放
        mov es:[bp],ax
        mov ax,ds:[bx+si+2]
        mov es:[bp+2],ax
        add bx,84
        mov ax,ds:[bx+si]
        mov es:[bp+5],ax
        mov ax,ds:[bx+si+2]
        mov es:[bp+7],ax

        mov bx,0
        add si,4
        add bp,16

        loop s00

        mov bp,0
        mov si,0
        mov bx,168

        mov cx,21
  s11:mov ax,ds:[bx+si]
        mov es:[bp+10],ax
        mov ax,es:[bp+5]
        mov dx,es:[bp+7]
        div word ptr es:[bp+10]
        mov es:[bp+13],ax

        add si,2
        add bp,16

        loop s11



        mov ax,stack   ;设置为堆栈
        mov ss,ax
        mov sp,32




        mov ax,table2
        mov ds,ax ;ds:[si]指向table2段
        mov si,0


        mov ax,table1
        mov es,ax ;ds:[bp+di]指向table1段
        mov di,0
        mov bp,0


        mov cx,21


   re: push cx ;压入cx
        mov bx,[si]
        mov es:[bp+di],bx
        mov bx,[si+2]
        mov es:[bp+di+2],bx


        add si,5
        mov di,14
        mov ax,[si]
        mov dx,[si+2]
        call dtoc ;调用dtoc,把数据转换为字符,以便于显示


        add si,5
        mov di,23
        mov ax,[si]
        mov dx,0
        call dtoc


        mov di,30
        add si,3
        mov ax,[si]
        mov dx,0
        call dtoc
        mov di,31
        mov byte ptr es:[bp+di],0 ;每组数据最后一个字节设置为0,以便于显示时作为结束的判定
        add bp,32
        mov di,0
        add si,3


        pop cx ;弹出cx,以便于loop指令的正常运行
        loop re


        mov ax,table1
        mov ds,ax


        mov dh,1 ;屏幕显示的行数
        mov dl,1 ;屏幕显示的列数
        mov bp,0
        mov si,0


        mov cx,21 ;循环21次
        
   re1: push cx
        mov cl,2
        call show_str ;调用显示子函数
        inc dh
        add bp,32
        mov si,0
        pop cx
        loop re1


        mov ax,4c00h
        int 21h


 dtoc:  mov cx,10 ;数据转变为字符
        call divdw
        add cx,30h
        mov es:[bp+di],cl
        mov cx,ax
        add cx,dx
        jcxz ok
        dec di
        jmp short dtoc
   ok:  ret
        
divdw:  push si ;防止除法溢出的子函数,这个也是王爽老师书里的


        mov bx,ax
        mov ax,dx
        mov dx,0
        div cx


        mov si,ax
        mov ax,bx
        div cx


        mov cx,dx
        mov dx,si


        pop si
        ret


show_str:mov ax,0B800h ;显示子函数
         mov es,ax
         mov bx,0
         mov ax,0


         dec dh
         mov al,160
         mul dh
         mov bx,ax


         dec dl
         mov al,2
         mul dl
         add bx,ax


         mov ax,0
         mov al,cl
     s1: mov cl,ds:[bp+si]
         mov ch,0
         jcxz ok1
         mov es:[bx],cl
         mov es:[bx+1],al
         add bx,2
         inc si
         jmp short s1


     ok1:inc dl
         inc dh
         ret


code ends
end start


一下是debug时显示的图片,由于是用debug里调试的,显示时有一部分数据显示不出来,由于本人目前学的还是不好,不知如何完全显示,网上百度了一下,也不行。呵呵



以上就是我的目前成果,当然缺点还是一大堆,如程序不够精炼,显示结果和王爽老师书上的截图还有点差异,就是除了年代,剩下的数据都是左对齐的,我写的是右对齐,希望高手指正。