• 王爽 汇编 实验7寻址方式在结构化数据访问中的应用


    一、需求

    编程将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调试自己写的程序,这样

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

  • 相关阅读:
    Oracle 12C ORA-65096: 公用用户名或角色名无效
    一张图记住PMP十大只是领域
    MAC系统升级后APACHE/MYSQL相关问题解决
    Mac配置Apache
    Android源码下载方法
    GIT 远程操作详解
    GIT 配置及常用命令
    安装Oracle-Redhat 5.4 64位
    近期工作计划
    新的起点
  • 原文地址:https://www.cnblogs.com/TonyJia/p/12566659.html
Copyright © 2020-2023  润新知