实验一 多位十六进制加法运算实验
程序员文章站
2022-03-15 14:04:55
...
一. 实验要求
利用Proteus平台,建立8086的多位十六进制加法运算的例子。
二. 实验目的
- 熟悉实验系统的编程和使用。
- 掌握使用加法类运算指令编程及调试方法。
- 掌握加法类指令对状态标志位的影响。
三. 实验说明
由于本实验是三个十六位二进制数相加运算,N4为存放结果,其中N1为1111H,N2为2222H,N3为3333H,所以结果应该为6666H。
四. 实验程序流程图
五. 实验步骤
a.仿真代码
;N4=N1+N2+N3 =1111H+2222H+3333H=6666H
CODE SEGMENT;表示代码段开始
ASSUME CS:CODE,DS:DATA;CODE对应代码段寄存器,DATA对应数据段寄存器
BEG: ;必要的,作为程序入口
MOV AX,DATA;
MOV DS,AX;借助AX间接将DATA段地址赋值给DS,因为段寄存器只接受通用寄存器数据作为源操作数
MOV SI,OFFSET NUM1;将NUM1的偏移地址赋值给SI,以便之后间接寻址
MOV AX,0;将AX清零用来存储加法结果
ADD AX,[SI+0];将1111H移入AX
ADD AX,[SI+2];1111H+2222H=3333H
ADD AX,[SI+4];3333H+3333H=6666H
MOV [SI+6],AX;将结果存到空余位置
JMP $;暂停程序
CODE ENDS;表示代码段结束
DATA SEGMENT;数据段,存储各数据
NUM1 DW 1111H ;N1
NUM2 DW 2222H ;N2
NUM3 DW 3333H ;N3
NUM4 DW 0000H ;N4
DATA ENDS
END BEG
b.调试、验证
在刚运行程序时的内存可以分辨出前面是代码段,隔着四个字的空白内存后是数据段。数据段中可以直接看到1111H、2222H、3333H这三个数据。注意到数据段地址由0020H开始
然后把数据段地址赋给了DS。可以看到DS的值为0002H.乘以十即为真实的段地址。这是因为
将1111H移入AX寄存器
对AX加上2222H
对AX加上3333H,计算环节结束。
六. 实验结果和体会
实验结果展示:最后在内存中便存储了计算结果,为6666H。
从这个流程中可以意识到一些汇编编程的思想。待数据往往事先存入数据段中,需要计算时才使用MOV语句移入通用寄存器,结果再写入内存。由于通用寄存器数量有限(4个),且部分寄存器在某些语句上有专门用途(如MUL语句必须用AX)。不可一次将太多数据存入寄存器,因此往往需要进行内存的读取与写入。该点是与使用高级语言进行编程时,对编程者来说不一样的地方。
此外数据段与代码段在代码中的先后顺序无关紧要。且在内存中,数据段和代码段之间还有4个字的空白空间。
七. 扩展题目程序和实验结果
;N4=N1+N2+N3 =11H+22H+33H=66H
CODE SEGMENT;代码段
ASSUME CS:CODE,DS:DATA;CODE对应代码段寄存器,DATA对应数据段寄存器
BEG: MOV AX,DATA
MOV DS,AX;借助AX间接将DATA段地址赋值给DS,因为段寄存器只接受通用寄存器数据作为源操作数
MOV SI,OFFSET NUM1;将NUM1的偏移地址移入SI以便访问
MOV AL,0;初始化AL,该句及下一句可化简成MOV AL,[SI+0]
ADD AL,[SI+0];加上第一个数
ADD AL,[SI+1];加上第二个数
ADD AL,[SI+2];加上第三个数
MOV [SI+3],AL;将AL中的结果存入内存
JMP $;程序暂停
CODE ENDS
DATA SEGMENT
NUM1 DB 11H ;N1。由于是8位数据,使用字节保存
NUM2 DB 22H ;N2
NUM3 DB 33H ;N3
NUM4 DB 00H ;N4
DATA ENDS
END BEG
结果图片展示:
可以看到AX及内存中存储了计算结果66H
上一篇: 8254定时/计数器实验
下一篇: centos7查看ip地址 启动网卡