春卷の爱 发表于 2014-2-16 13:45:32

自己写的实验7

assume cs:code, ds:data, es:table

data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'       
        ;以上表示21年的21个byte型字符串
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,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,11542,14430,15257,17800       
        ;以上是21年公司雇员人数的21个word型数据
data ends

table segment
        db 21 dup ('year revn em av ')
table ends

code segment
start:
        mov ax,data
        mov ds,ax                ;将数据源指向DS
        mov ax,table
        mov es,ax                ;将目标数据指向ES
       
        mov si,0
        mov di,0
        mov cx,21
       
year:
        mov ax,ds:
        mov es:,ax
        mov ax,ds:
        mov es:,ax
        add si,4
        add di,16
        loop year                ;导入年份
       
        mov cx,21
        mov si,54h
        mov di,0
       
revenue:
        mov ax,ds:
        mov dx,ds:
        mov es:,ax
        mov es:,dx
        add si,4
        add di,16
        loop revenue        ;导入总收入
       
        mov cx,21
        mov si,0a8h
        mov di,0

employee:
        mov ax,ds:
        mov es:,ax
        add si,2
        add di,16
        loop employee        ;导入员工数
       
        mov cx,21
        mov bx,0
               
avginc:
        mov ax,es:
        mov dx,es:
        div word ptr es:
        mov es:,ax
        add bx,16
        loop avginc
       
        mov ax,4c00h
        int 21h
               
code ends
end start

春卷の爱 发表于 2014-2-16 13:50:10

好像没有用到栈,设置了4次CX循环不知道能否合并,另外做除法的时候发现DS的寻址好困难,转而用TABLE里已经搬运过来的数据,效果还可以。汇编还蛮有意思的。。
现在看视频学习一下小甲鱼的解题方法

春卷の爱 发表于 2014-2-16 14:58:35

看了视频后,修改如下:利用数据类型BX+4,SI+2,优化成一个循环:

assume cs:code, ds:data, es:table

data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'       
        ;以上表示21年的21个byte型字符串
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,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,11542,14430,15257,17800       
        ;以上是21年公司雇员人数的21个word型数据
data ends

table segment
        db 21 dup ('year revn em av ')
table ends

code segment
start:
        mov ax,data
        mov ds,ax                ;将数据源指向DS
        mov ax,table
        mov es,ax                ;将目标数据指向ES
       
        mov bx,0
        mov si,0
        mov di,0
        mov cx,21
       
copy:
        mov ax,ds:
        mov es:,ax
        mov ax,ds:
        mov es:,ax        ;复制年份
       
        mov ax,ds:
        mov es:,ax
        mov ax,ds:
        mov es:,ax        ;复制收入
       
        mov ax,ds:
        mov es:,ax        ;复制人数
       
        mov ax,ds:
        mov dx,ds:
        div word ptr ds:
        mov es:,ax        ;计算平均工资
       
        add bx,4
        add si,2
        add di,16
       
        loop copy
       
        mov ax,4c00h
        int 21h
               
code ends
end start
页: [1]
查看完整版本: 自己写的实验7