┈━═☆佳佑 发表于 2013-6-10 21:34:29

零基础学汇编 第八章 实验7 (作业)求优化方案

本帖最后由 ┈━═☆佳佑 于 2013-6-10 21:38 编辑

这道作业题花了 两天时间做完绞尽脑汁 都还没想到优化方案希望高手给出优化意见
assume cs:codesg
data segment
   db '1975','1976','1977','1978','1979','1980','1981','1982','1983';'4',0-35   
   db '1984','1985','1986','1987','1988','1989','1990','1991','1992';36-71
   db '1993','1994','1995'                                                                   ;72-83
   ;以上表示21年的21个字byte型字符串

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514                   ;'4'84-131
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000   ;132-167
;以上表示21年公司的总收入的21个dword型数据

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226;'2'168-209
dw 11542,14430,15257,17800
;以上表示21年公司雇员人数的21个word型数据
data ends
table segment
      db 21 dup('year summ ne ?? ')
table ends
codesg segment
start:mov ax,data
      mov ds,ax
      mov ax,table
      mov es,ax
      mov si,0
      mov di,0
      mov bp,0
      mov cx,21
      s:mov bx,0
      mov ax,0
      mov al,    ;年份
      mov es:,al
      inc si
      mov al,    ;年份
      mov es:,al
      inc si      
      mov al,    ;年份
      mov es:,al
      inc si
      mov al,    ;年份
      mov es:,al
      inc si

      mov bx,80            ;年收入    si=4
      mov ax,
      mov dx,
      mov es:,ax
      mov es:,dx

      mov bx,168         ;雇员
      mov bx,
      mov es:,bx
      inc di
      inc di

       div bx            ;平均人收入
       mov es:,ax

       add bp,16
       loop s

      mov ax,4c00h
      int 21h
codesg ends
end start

qiliang159357 发表于 2013-6-10 21:44:47

抢个沙发等待 高手跟进 中......

┈━═☆佳佑 发表于 2013-6-10 21:52:05

这道题本来就有些问题误导了我 胡乱想了一天多是时间
总收入
公司雇员人数
平均人收入
这三项本来 定义的都是 十进制放入寄存器后 就都是 十六进制了再放入表格 也还是十六进制 怎么可能跟以下格式一样 都显示的是 十进制数

lsh華 发表于 2013-6-10 23:35:45

无回帖,不论坛,这才是人道。

ilove 发表于 2013-6-11 08:16:11

好,{:1_1:}

金色暢想犬舍 发表于 2013-6-12 04:05:28

本帖最后由 金色暢想犬舍 于 2013-6-12 04:09 编辑

我写的,很烂,凑合看看吧 ,顺便说一下,有没有学到第八章了的?共同交流下? QQ81881894{:1_1:}assume CS:code,DS:data,SS:stack

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个字符串 ;字节类型 BX+0~83(0~53H)
      ;这一组数据用SI表示,这组偏移过后,SI指向下一组数据时,SI归零,重来 CX=15H

      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型数据 BX+84~168(就是54H~0A8),这一组21个数据,用SI表示
      ;CX=15H

      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型数据 ;字类型
      ;这一组21个数据,也用SI表示; CX=15H
      dw 0,0
data ends

table SEGMENT
      db 21 DUP ('year summ ne ?? ')
table ends

STACK segment
      db 7 DUP ('year summ ne ?? ')
STACK ends

;编程,将data段中的数据按图上格式写入到table段中,并计算21年终的人均收入(取整),结果也按照图上的
;格式保存在table段中;
code SEGMENT
start:                MOV AX,DATA
                MOV DS,AX
                MOV AX,TABLE
                MOV ES,AX
                MOV AX,STACK
                MOV SS,AX
                MOV SP,112

;>>>>>>>>>>>>>>>>>>>>>>>>>>>年份&总收入收入开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                MOV CX,15H
YEARMONEY:      MOV DS:,CX
                MOV CX,2
YEARMONEY1:      MOV AX,.0      ;将年份读入一个字
                MOV ES:.0,AX      ;将一个字的年份写入
                MOV AX,.54H      ;将总收入读入一个字
                MOV ES:.5,AX      ;将总收入写入一个字
                PUSH AX                        ;将总收入,入栈;
                ADD SI,2
                ADD DI,2
                LOOP YEARMONEY1
                MOV BYTE PTR ES:,' '
                MOV BYTE PTR ES:,' '
                ADD BP,10H
                MOV DI,BX
                MOV CX,DS:
                LOOP YEARMONEY
;>>>>>>>>>>>>>>>>>>>>>>>>>>>年份&总收入结束>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>雇员人数&人均收入结束>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                MOV SI,2AH                ;退着走
                MOV BP,140H                ;BP也退着走,
                MOV DI,BX                ;DI清零
                MOV BX,0A6H                ;BX偏移了,就用不到IDATA了.
                MOV CX,15H                ;循环次数依然是21次
S:                MOV AX,                ;定位到最后一个雇员人数读入
                MOV ES:,AX      ;将雇员人数写入对应字单元中;
                POP DX
                POP AX
                DIV WORD PTR ES:      ;除雇员人数-----
                MOV ES:,AX      ;将人均收入写入指定字单元
                MOV BYTE PTR ES:,' '      ;在写完雇员人数后写入一个空格
                MOV BYTE PTR ES:,' '      ;在最后面写入一个空格
                SUB SI,2
                SUB BP,10H                ;BP每次-10,就是退一行
                LOOP S


      MOV      AX,4c00h
      INT      21h      
code ENDS
END start

金色暢想犬舍 发表于 2013-6-12 04:10:37

┈━═☆佳佑 发表于 2013-6-10 21:52 static/image/common/back.gif
这道题本来就有些问题误导了我 胡乱想了一天多是时间
总收入
公司雇员人数


显示十六进制就足够了,谁跟你说要显示10进制的,十六进制的10H和十进制的16,其实表示出来不都是一个数?

古来圣贤皆寂寞 发表于 2013-7-24 20:31:54

持楼主ing……
页: [1]
查看完整版本: 零基础学汇编 第八章 实验7 (作业)求优化方案