. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验7代码的可维护性  [待解决] 回复[ 1次 ]   点击[ 363次 ]  
brandon
[帖 主]   [ 发表时间:2015-03-30 23:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-03-28 22:18
完成实验7的代码、测试通过后。在论坛里看到很多同学的代码,拓宽了思路。
不过我发现一个问题,很多同学为了追求代码量的“少”,而忽视了程序的可读性和维护性。

比如,很多同学对data段的数据进行了分割,定位出了偏移地址,然后在代码中就直接写上了偏移地址。这样固然可以少引入寄存器和循环,不过可读性和维护性都差了一些。别人突然看到一个偏移量数字会觉得莫名其妙,而且,查错也不方便;更重要的是,如果后面data段的数据发生了变化,比如增加了几年的数据、或者减少了几年的数据,你岂不是又要把dat段里的数据数一遍?

下面贴上我的代码,代码量很长,主要是用了4个循环,其中前3个还是二重循环。看起来复杂,实际上很简单,3个二重循环是一样的,只是更改了一个循环参数cx和一个idata偏移量。后面维护也很简单,不管data段数据怎么变,只需要更改几个参数即可。

个人觉得,代码中越少引入idata越好,数据都交给变量去完成。

assume cs: code

data segment
db '1975', '1976', '1977', '1978', '1979', '1980', 

'1981', '1982', '1983', '1984', '1985', '1986', 

'1987', '1988', '1989', '1990', '1991', '1992', 

'1993', '1994', '1995'
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 

50065, 97479, 140417, 197514, 345980, 590827, 

803530, 1183000, 1843000, 2759000, 3753000, 

4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 

1442, 2258, 2793, 4037, 5635, 8226, 11542, 

14430, 15257, 17800
data ends

table segment
db 21 dup ('year summ ne ?? ')
table ends

stack segment
dw 0
stack ends

code segment
start:
mov ax, data
mov ds, ax
mov ax, table
mov es, ax

mov bx, 0
mov cx, 21
mov si, 0
s0: push cx
mov di, 0
mov cx, 4
s1: mov al, [si]
mov es:[bx+di], al
inc di
inc si
loop s1
add bx, 16
pop cx
loop s0

mov bx, 0
mov cx, 21
s2: push cx
mov di, 0
mov cx, 4
s3: mov al, [si]
mov es:[bx+di].5, al
inc di
inc si
loop s3
add bx, 16
pop cx
loop s2

mov bx, 0
mov cx, 21
s4: push cx
mov di, 0
mov cx, 2
s5: mov al, [si]
mov es:[bx+di].10, al
inc di
inc si
loop s5
add bx, 16
pop cx
loop s4

mov bx, 0
mov cx, 21
s6: mov dx, es:[bx].7
mov ax, es:[bx].5
div word ptr es:[bx].10
mov es:[bx].13, ax
add bx, 16
loop s6

mov ax, 4c00h
int 21h
code ends
end start
asm0101
[第1楼]   [ 回复时间:2015-04-05 18:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-02-17 23:21
我这样有没有什么问题?
由于data段中的数据在程序中只用一次,所以,直接将data段视作压满数据(sp=0)的栈段,
以简化程序。
assume cs:codesg 
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个dword型数据,表示公司21年里各年总收入 
     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 
     dw 11542,14430,15257,17800 
     ;以上21个dword型数据,表示公司21年里各年雇员人数 
data ends 
table segment 
     db 21 dup ('year summ ne ?? ') 
table ends 
codesg segment 

start:mov ax,data 
      mov ss,ax 
      mov sp,0 
      mov ax,table 
      mov es,ax 
      mov bp,84                ;收入首地址21*4 
      mov si,168               ;雇员首地址(21*4)*2
      mov di,0 
      mov cx,21 
   s: pop es:[di].0
      pop es:[di].2            ;年份数据入table 
      mov ax,[bp].0
      mov dx,[bp].2
      mov es:[di].5,ax 
      mov es:[di].7,dx         ;收入数据入table 
      mov bx,ss:[si] 
      mov es:[di].10,bx        ;雇员数据入table 
      div bx
      mov es:[di].13,ax        ;人均收入数据入table 
      add bp,4
      add si,2
      add di,10h
      loop s

      mov ax,4c00h 
      int 21h 
codesg ends 
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved