实验七 寻址方式在结构化数据访问中的应用
生活随笔
收集整理的這篇文章主要介紹了
实验七 寻址方式在结构化数据访问中的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面的程序中,已經定義好了這些數據
先用debug查看這些數據在內存中的分布
代碼改進:增加了代碼可讀性,已經減少寄存器的使用
;實驗七 尋址方式在結構化數據訪問中的應用;編程 將data段中的數據 按照如下格式寫到table段中,并計算21年中的人均收入(取整) ;結果也按照下面的格式保存在table段中 assume cs:code,ds:data,ss:stack data segmentdb '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個字符串 yeardd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;以上是表示21年公司總收入的21個數據dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11452,14430,15257,17800;以上是表示21年公司的員工數量 data endstable segment; '0123456789ABCDEF'db 21 dup('year sumn ne ?? ') table endsstack segment stackdb 128 dup (0) stack endscode segmentstart:mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axmov ax,tablemov es,axmov si,0 ;年份在data中'1975'中的1偏移地址為0 ;ds:[si]mov di,21*4 ;公司總收入的第一個數據16,它的偏移地址在data段中是84(54H) ;ds:[di]mov bx,21*4+21*4;公司的員工數量,第一個數據3,在data段中的偏移地址是168(A8H) ;ds:[bx]mov bp,0 ;'year sumn ne ?? '的第一個字母y,在table段中的偏移地址是0 ;es:[bp];bp寄存器默認的段寄存器是ss,bp為偏移地址->ss:[bp]mov cx,21;處理21行;處理年份 inputtable: push ds:[si+0]pop es:[bp+0]push ds:[si+2]pop es:[bp+2];處理總收入——低16位放在AX,高16位放在DXmov ax,ds:[si+21*4]mov dx,ds:[si+21*4+2]mov es:[bp+5],axmov es:[bp+7],dx; '0123456789ABCDEF';db 21 dup('year sumn ne ?? ') ;低位放到5,高位放到7;處理員工數量push ds:[bx]pop es:[bp+0AH];這里用div 內存 ;因為寄存器不夠用了div word ptr ds:[bx]mov es:[bp+0DH],axadd si,4; add di,4add bx,2loop inputtablemov ax,4c00hint 21hcode ends end start具體代碼:
assume cs:codesg,ds:data,ss:table 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';定義字節數據,存放年dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 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,8226dw 11452,14430,15257,17800;定義字形數據,存雇員人數(除數)。 data ends table segmentdb 21 dup ('year summ ne ?? ') table ends ;定義字形數據,21個年平均值 codesg segment start: mov ax,data mov ds,ax ;初始數據段mov ax,table mov ss,ax ;將表格定位給棧段(用棧段存放平均值)mov bx,0 mov si,0 ;數據段中年份中的數據mov bp,0 ;表格第一行mov cx,21 ;21行所以21次循環 s0:mov ax,[bx+si] ;讀取數據段中的年份數據的前2個字節,交給AXmov [bp+0],ax ;年份數據的前2個字節放入到表格(因為表格前面定義給了SS棧段)add si,2 ;指向年份后2個字節mov ax,[bx+si] ;讀取數據段中年份數據的后2個字節,交給AXmov [bp+2],ax ;年份數據的后2個字節放入到表格add si,2 ;指向數據段中下一個年份add bp,10h ;轉到下一行loop s0 ;S0循環是將數據段中(0-53H)的年份讀取出來,放到表格的年份(0-3)列中mov cx,21 ;21次循環處理收入mov bp,0 ;收入的行mov si,0 ;數據段中收入數據指針 s1:mov ax,[bx+si+84] ;因為數據段中年份數據是21行4個字節,共占了數據段84個字節。;所以收入第一個數據是從數據段第84個字節處開始的,讀取后給AX。mov [bp+5],ax ;收入數據放入到表格,因為年份占了前4列,加上空格,所以放到第5列add si,2 ;處理數據的后2個字節mov ax,[bx+si+84] ;讀取數據的后2個字節,放入AXmov [bp+7],ax ;收入數據的后2個字節放入到表格add si,2 ;指向下一個數據add bp,10h ;指向下一行loop s1 ;S1循環是將數據段中(54H-0A7H)的收入讀取出來,放到表格的收入(5-8)列中mov cx,21 ;21次循環mov bp,0 ;定位表格的行mov si,0 ;數據段中雇員數據指針 s2:mov ax,[bx+si+168] ;因為數據段中年份與收入數據共占了168個字節。;所以雇員第一個數據是從數據段第168個字節處開始的,讀出給AXmov [bp+10],ax ;將雇員數據放入到表格add si,2 ;指向數據段下一個雇員數據add bp,10h ;指向下一行loop s2 ;S2循環是將數據段中(0A8H-0D1H)的雇員讀取出來,放到表格的收入(A-B)列中mov cx,21 ;21次循環,計算平均收入值mov bp,0 s3:mov ax,[bp+5] mov dx,[bp+7] ;放入被除數(收入),高位給DX,低位給AXdiv word ptr [bp+10] ;放入除數(雇員)mov [bp+13],ax ;商(平均值)放入表格add bp,10h ;指向下一行loop s3 ;S2循環是計算平均值,放到表格的人均收入(D-E)列中mov ax,4c00hint 21h codesg ends end start總結
以上是生活随笔為你收集整理的实验七 寻址方式在结构化数据访问中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不通过寄存器确定数据的长度 + 案例
- 下一篇: 加装的硬盘进入后点不了文件夹_【装机帮扶