寻址方式在结构化数据访问中的应用


一、需求

编程将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中

 二、代码实现 

 1 ;目的:寻址方式在结构化数据访问中的应用
 2 ;编写:Tony
 3 ;语言:asm
 4 ;时间:2020.3.26
 5 
 6 assume cs:code,ds:data,es:table
 7 
 8 ;数据段(原始数据)
 9 data segment
10     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
11     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
12     db '1993','1994','1995'
13     ;以上是表示21年的21个字符串
14     
15     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
16     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
17     ;以上是表示21年公司总收入的21个doword型数据
18     
19     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
20     dw 11542,14430,15257,17800
21     ;以上是表示21年雇员人数的21个word型数据
22 data ends
23 
24 ;数据段(需要填充数据的表)
25 table segment
26     db 21 dup('year summ ne ?? ')    ;字符串共占用16个字节
27 table ends
28 
29 ;代码段
30 code segment
31         ;初始化数据段
32 start:  mov ax,data
33         mov ds,ax
34         mov ax,table
35         mov es,ax
36 
37         ;初始化临时变量        
38         mov bx,0
39         mov dx,0
40         mov si,0
41         mov di,0
42         mov cx,21
43                     
44         ;向table表中添加年份
45 s:      mov ax,word ptr ds:[si]    
46         mov dx,word ptr ds:[si+2]            
47         mov word ptr es:[bx],ax
48         mov word ptr es:[bx+2],dx
49         
50         ;向table表中添加收入    
51         mov ax,word ptr ds:54h[si]    
52         mov dx,word ptr ds:54h[si+2]            
53         mov word ptr es:[bx+5],ax
54         mov word ptr es:[bx+7],dx    
55         
56         ;向table表中添加雇员人数
57         mov ax,word ptr ds:0a8h[di]            
58         mov word ptr es:[bx+0ah],ax
59         
60         ;向table表中添加人均收入(需要计算)
61         mov ax,word ptr es:[bx+5]
62         mov dx,word ptr es:[bx+7]
63         div word ptr es:[bx+0ah]
64         mov word ptr es:[bx+0dh],ax
65         
66         add si,4
67         add di,2
68         add bx,10h
69         
70         loop s        
71         mov ax,4c00h
72         int 21h    
73 code ends
74 end start

 三、上机调试

详细教你一步一步调试程序实现数据表中数据的填充

编译工具:masm611(包含ml.exe、masm.exe、link.exe三个文件),在网上随便下载一个就行,搜索masm611

编译环境:vmware中的xp sp3

1.首先对源程序进行编译链接生成可执行文件(我这里源程序名称为p185.asm,编译链接生成p185.exe文件),然后就开始

debug p185.exe并查看各个寄存器的数据情况

2.用t指令开始单步调试程序,执行第一条指令mov ax,0b34,执行完成后,数据段地址0b34赋值给寄存器ax

 3.继续单步,执行完mov ds,ax后,寄存器ax中的值传递给数据段寄存器ds

 此时,我们需要查看一下,数据段data中初始化的数据,一共初始化了210个字节

4.继续单步,执行指令mov ax,0b42后,附加段地址0b42赋值给寄存器ax

 5.继续单步,执行完mov es,ax后,寄存器ax中的值传递给数据段寄存器es 

 此时,我们需要查看一下,数据段table中初始化的数据,一共初始化了336个字节

6.连续执行5条指令,初始化临时变量

 

7.连续执行4条指令,将数据段中的年份数据填充到es段的table表中

8.连续执行4条指令,将数据段中的收入数据填充到es段的table表中

9.连续执行2条指令,将数据段中的雇员人数数据填充到es段的table表中

10.连续执行3条指令,将数据段中的人均收入数据填充到es段的table表中

11.连续执行3条指令,为table表中的下一行做准备

12.在上图的状态下,执行-p指令,让计算机自动执行完循环体,在执行-t -p指令程序正常退出

13.忘记了点事情,没有查看table中的数据,程序在重新走一遍吧~_~……,把结果补上

从图中可以看出,原始数据已经正确的填充到了table表中

总结:相信你一步一步的这样调试,对汇编中寻址方式在结构化数据访问中的应用会很大帮助与提高,

感谢仔细观看这篇文章的朋友!学习汇编语言,最重要的就是多上机debug调试自己写的程序,这样

如此下去,你会有意想不到的收获和惊喜,^_^,祝君天天有好心情!

 


作者:Tony.Jia,发布于:2020/03/26
原文:https://www.cnblogs.com/TonyJia/p/12566659.html