. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验7做完了,但是在前几次错误的程序中,发现了一个很有趣的问题,请老师和哥哥姐姐们进来看看!  [已解决] 回复[ 2次 ]   点击[ 454次 ]  
891204dh
[帖 主]   [ 发表时间:2009-08-05 03:42 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
其中:54H为总收入数据在data段中的起始地址
     0A8H为公司人数数据在data段中的起始地址
assume cs:code,ds:data 

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年的 年份字符串,每个年份字符串都占了两个字的空间 
        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 

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

stack segment 
        dd 4 dup (0) 
stack ends 

code segment 
        start: mov ax,stack 
               mov ss,ax 
               mov sp,16 
               mov ax,data 
               mov ds,ax;ds->data段 
               mov ax,table 
               mov es,ax;es->table段 
               mov si,0;下一行的指针 
               mov bp,0; 
               mov bx,0;年份和总数的指针 
               mov cx,21;年数21,一次循环处理一年的数据项 
             s:mov ax,[bx];年份的低位送入AX 
               mov dx,[bx+2];年份的高位送入DX 
               mov es:[si+0],ax;低位的年份送入表year列的低位中 
               mov es:[si+2],dx;高位的年份送入表year列的高位中 
               mov byte ptr es:[si+4],20H;year后加空格 
               mov ax,[54H+bx];总数的低位送入AX 
               mov dx,[54H+bx+2];总数的高位送入DX,54H为总收入数据在data段中的起始地址
               mov es:[si+5],ax;把AX放入列summ的低位 
               mov es:[si+7],bx;把BX放入列summ的高位 
               div word ptr [0A8H+bp];求平均每人收入,0A8H为公司人数数据在data段中的起始地址
               mov es:[si+13],ax;把平均收入放入表??列中 
               mov byte ptr es:[si+15],20H;空格 
               mov ax,[0A8H+bp];人数 
               mov es:[si+10],ax 
               mov byte ptr es:[si+12],20H 
               mov byte ptr es:[si+9],20H 
               add bx,4;指向下个双字 
               add si,10H;指向下一行 
               add bp,2 
               loop s 
                
               mov ax,4c00H 
               int 21H                
code ends 
end start 
用debug执行到这一步 
AX=0010  BX=0000  CX=0015  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000 
DS=142D  ES=143B  SS=1450  CS=1451  IP=0039   NV UP EI PL NZ NA PO NC 
1451:0039 26            ES: 
1451:003A 895C07        MOV     [SI+07],BX                         ES:0007=6D6D 
-t 

AX=0010  BX=0000  CX=0015  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000 
DS=142D  ES=143B  SS=1450  CS=1451  IP=003D   NV UP EI PL NZ NA PO NC 
1451:003D F7B6A800      DIV     WORD PTR [BP+00A8]                 SS:00A8=7E80 
默认的段地址不是DS吗?为什么这里给我的是SS?为什么呀?为什么? 
下面我不得不改变程序了 
我把原来的代码 
                div word ptr [0A8H+bp];求平均每人收入 
               mov es:[si+13],ax;把平均收入放入表??列中 
               mov byte ptr es:[si+15],20H;空格 
               mov ax,[0A8H+bp];人数 
               mov es:[si+10],ax 
改成了 
                div word ptr ds:[0A8H+bp];求平均每人收入 
               mov es:[si+13],ax;把平均收入放入表??列中 
               mov byte ptr es:[si+15],20H;空格 
               mov ax,ds:[0A8H+bp];人数 
               mov es:[si+10],ax 
在地址前面加了个DS来显示的指出段地址,不得不这样做了,不这样做的话那个段地址又是SS

了!我倒,这是为什么呢? 
我觉得这个程序还有更好的做法,请大家指教,谢谢大家了!
891204dh
[第1楼]   [ 回复时间:2009-08-05 14:57 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
没必要自己加空格的,是我锈豆了
891204dh
[第2楼]   [ 回复时间:2009-08-05 20:53 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
此贴由 贴主 于 [ 2009-08-05 20:53 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved