一、实验目的
掌握汇编编程规范,熟悉编程环境。
二、实验内容
1 .编程:依次向存储器0:200-0:23F传输数据0-63(3FH )。
2 .编程:生成代码段代码,通过推送指令将a段的word数据按相反顺序存储在b段中。三、实验步骤算法及关键代码
第一题:
1 .实验思路和算法
思路:
实验要求是将0:200-0:23F的内容依次传输到0-63,但经过分析,主题不需要数据倒置或进行其他操作,可以通过直接循环赋值的方法实现。
相关设置和算法:
将DS设定为段地址0,在BX中保存偏移地址。 由于起始地址为200,因此初始化BX为200。
CX被设置为循环计数器,并且每个周期中BX和DX被加1,从而从存储单元的数目可以看出,需要分配64次,使得CX=64;
每次设置DX存储时,都必须分配给存储单元的特定数字。
初始化代码:
MOV AX,0MOV DS,AXMOV BX,200HMOV CX,64MOV DX,0环路代码: S:MOV [BX],dxincdxincbxloops 3358 www.Sina.com /
assume cs 3360 codescodessegmentstart : movax,0 MOV DS,AX MOV BX,200H MOV CX,64 MOV DX,0 S:MOV [BX],dxincdxincbxloops
起始寄存器的内容和指令地址:
循环前
后面的第二个问题:
1 .实验思路和算法
思路:
正题上需要用堆栈。 必须先入后出完成倒排,同时访问已经设置的两个数据区域。 最初的构想其实是设置新的堆栈,把a段的内容放入堆栈,然后把所有的内容堆栈到b段。 但是,实际上从一开始就认为将b段设定在堆栈上,可以减少堆栈和值的操作。
相关设置和算法:
将b地址设定为堆栈的段地址,保存在SS寄存器中; 因为数据是字体数据,所以将堆栈底部的下一个存储单元地址、即偏移地址设为0010H,存储到SP寄存器中;
将DS设置为段a地址,BX记录偏移地址并初始化为0;
因为CX需要被设置为循环计数器并传输8个数据,所以CX被初始化为8;
设置DX用于临时保存数据区检索的数据
对于循环,检索数据并直接堆栈,然后添加一两次BX (因为数据是字体)。
2.实验代码
assume cs : codecodesegmentasegmentdw 1、2、3、4、5、6、7、8 aendsbsegmentdw 0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0 0 MOV CX,8 MOV DX,0 S:MOV DX,[BX] PUSH DX INC BX INC BX LOOP S MOV AH,4chint21hcodeendsendstart333
起始寄存器的内容和指令地址:
循环前:
a部分:
第b段:
寄存器:
循环后:
3.实验结果
在这次实验中,在这段时间的学习过程中重点练习了重要的循环和堆栈知识,但总体主题比较容易实现。 在这次实验中,实际上获得了很多对实验环境IDE的熟悉和Debug语法的学习,是之后的学习和实验中不可缺少的技能点。
实验过程中,由于编程和构思问题暂时难以居住,虽然主题难度其实并不高,但自己最近的学习得到了一定的肯定; 但是,在Debug上操作命令确实花了时间。 特别是在需要发出决定存储器地址的指令的情况下还不熟练。 我希望你今后更加努力。