. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验7  [待解决] 回复[ 6次 ]   点击[ 310次 ]  
one_cai
[帖 主]   [ 发表时间:2010-12-14 10:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22
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,46

49000,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,45257,17800  
        ;以上是表示21年公司雇员人数的21个word型数据  
data ends 
  
table segment  
        db 21 dup('year summ ne ?? ')  
table ends  

code segment
start:        mov ax,data
        mov ds,ax
        mov si,0
        mov ax,table
        mov es,ax
        mov bx,0
        mov bp,0
        
        mov cx,21
s:        push cx
        push si

        mov cx,4
        mov si,0
 s1:        mov al,ds:[bp+si]
        mov es:[bx+si],al
        inc si
        loop s1
        pop si        

        mov ax,ds:[84+bp]
        mov dx,ds:[84+bp+2]
        mov es:[bx+5],ax
        mov es:[bx+7],dx

        mov ax,ds:[168+si]
        mov es:[bx+0ah],ax

        
        add si,2
        add bx,10h
        add bp,4
        pop cx
        loop s

        mov ax,4c00h
        int 21h

code ends
end start

这是第一次写的。
记录下来,方便以后对比学习。
这里没有用到栈。
one_cai
[第1楼]   [ 回复时间:2010-12-14 12:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22
实验七。精华版。别人写的。
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年公司总收的21个dword型数据  
   
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226  
        dw 11542,14430,45257,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 cx,21 
    mov bx,0 
    mov si,0 
    mov di,0                 
                                 
  s:mov ax,ds:0[si]   ;copy year 
    mov es:[bx].0,ax 
    mov ax,ds:0[si+2]   
    mov es:[bx].0[2],ax  
                                         
    mov ax,ds:84[si]  ;copy sum input 
    mov es:[bx].5,ax 
    mov dx,ds:84[si+2]   
    mov es:[bx].5[2],dx 
                                          
    mov ax,ds:168[di]  ;copy employee sum 
    mov es:[bx].10,ax 
                         
    div word ptr es:10[bx] ; copy average 
    mov es:[bx].0dh,ax
                         
    add si,4 
    add di,2 
    add bx,16 
    loop s 
                         
    mov ax,4c00h 
    int 21h 
                         
codesg ends
end start
one_cai
[第2楼]   [ 回复时间:2010-12-14 12:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22
实验七。堆栈版。别人写的。
DATAS  SEGMENT 
              DB        '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982' 
              DB        '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990' 
              DB        '1991', '1992', '1993', '1994', '1995' 
     
              DD        16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514 
              DD        345980, 590827, 803530, 118300, 184300, 2759000, 3753000, 4649000, 5937000 
     
              DW        3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226 
              DW        11542, 14430, 15257, 17800 
       DATAS  ENDS 

       TABLE  SEGMENT 
              DB        21 DUP ('year summ ne ?? ') 
       TABLE  ENDS 

      STACKS  SEGMENT 
              DB 16 DUP (0) 
      STACKS  ENDS 

ASSUME    CS:CODES,DS:DATAS,SS:STACKS 

       CODES  SEGMENT 
      START: 
              ;相关寄存器初始化 
              MOV       AX,DATAS 
              MOV       DS,AX 
              MOV       AX,TABLE 
              MOV       ES,AX 
              MOV       AX,STACKS 
              MOV       SS,AX 
              MOV       SP,16 
     
              MOV       BX,0 
              MOV       BP,0 
              MOV       DI,0 
              MOV       SI,0 

              MOV       CX,21 

      cycle:  ;使用栈复制年份 
              PUSH      [DI].0 
              PUSH      [DI].2 
              POP       ES:[BP].2 
              POP       ES:[BP].0 
               
              ;使用栈复制收入 
              PUSH      54H.[DI].0 
              PUSH      54H.[DI].2 
              POP       ES:[BP].7 
              POP       ES:[BP].5 

              ;使用栈复制雇员数 
              PUSH      0A8H.[SI] 
              POP       ES:[BP].0AH 

              ;计算人均收入 
              MOV       AX,ES:[BP].5 
              MOV       DX,ES:[BP].7 
              DIV WORD PTR ES:[BP].0AH 
              MOV       ES:[BP].0DH,AX 

              ADD       SI,2H 
              ADD       DI,4H 
              ADD       BP,10H 

              loop cycle 
                    

              MOV       AH,4CH 
              INT       21H 
       CODES  ENDS 
END       START 

------------------------------------------------------------------- 
栈的使用、结构化程序设计的思想...
one_cai
[第3楼]   [ 回复时间:2010-12-14 12:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22
精华版原来地址:http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1009&qkSg=2&qID=38108&readSg=1
解说:
1.慢慢体会数组: 
0[si],0[si+2]; 
84[si],84[si+2]; 
168[di]; 
这是数据源的三个数组。这样写才有数组a[N]的味道。 
2.慢慢体会结构体: 
es:[bx].0[0],es:[bx].0[2]; 
es:[bx].5[0],es:[bx].5[2]; 
es:[bx].10,   
es:[bx].0dH
one_cai
[第4楼]   [ 回复时间:2010-12-14 12:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22
堆栈版原来地址:http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1009&qkSg=2&qID=24558&readSg=1
one_cai
[第5楼]   [ 回复时间:2010-12-14 12:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22
堆栈版原来地址:http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1009&qkSg=2&qID=24558&readSg=1
------------------
堆栈版用了push,pop传送指令;
精华版用了mov传送指令。
都差不多,不过mov的效率比push,pop的效率高。
mov只需要移动,而push,pop还需要操作sp,加减sp。
我的个人循环版,思路和精华版差不多。在处理传送的方法,精华版更高明。。。
这是我对三个版本的分析和比较。
one_cai
[第6楼]   [ 回复时间:2010-12-14 12:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22
最后总结一下试验7的思路。
无非是把三个数组传送到结构体中的各个字段。
这三个数组是(当然了,(ds)=data):
年份数组 ds:0[si] ;
收入数组 ds:84[si];
人数数组 ds:168[di];

结构体的字段是(当然了,(es)=table):
年份字段 es:[bx].0[0]; 
收入字段 es:[bx].5[0];
人数字段 es:[bx].10;   
人均字段 es:[bx].0dH;

这个明确了,就好办了。
下面就是对应传送了
年份数组 ->年份字段 ;
ds:0[si]->es:[bx].0[0];
怎么传送。
可以循环四次,一个字节一个字节传送。
有更好的办法吗?有。
就是不循环,分两段传送。
ds:0[si+0]->es:[bx].0[0];
ds:0[si+2]->es:[bx].0[2];
这样有什么好处呢。看下面收入的传送就知道了。

收入数组->收入字段;
ds:84[si]->es:[bx].5[0];
一次传不完。怎么传送?分两段。
ds:84[si+0]->es:[bx].0[0];
ds:0[si+2]->es:[bx].0[2];
再回头看上面。发现什么了吗?
上面两个传送都是分两段传送,这样就不用内嵌循环了。
一个大循环什么都ok了。简单吧。
这里要注意的是,循环中si要不断的加4,就是add si,4。

人数数组 ds:168[di]->人均字段 es:[bx].0dH;
后面的就更简单了。
传送一个字节,一次就可以搞掂了。
为什么这里用di呢。
因为在这里循环的时候,di每次递增的是2,所以不得不用一个寄存器。
就是add di,2

剩下的就不用说了吧。这里都搞掂了,剩下的再不会,就重新看书复习吧。。。
哇哈哈。花了很多时间做和理解这道题。
这里把心得写写,算是一个总结。
也算是下一章的开始。哇哈哈。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved