Assemble实验报告
Posted jdl-tecshadower
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Assemble实验报告相关的知识,希望对你有一定的参考价值。
这是第一二章的汇编语言上机实验,这次实验的主要内容是掌握使用debug工具编写和调试汇编命令的方法,掌握一些基本的汇编指令用法及其作用。
一、DOS语言开发环境的搭建:
这是显示了本机下的DOS配置文件,在文件末尾写入mount d d:masm
d:两条指令,这便可以在本机D:masm目录下为部署开发环境。
挂载好的DOS为以下状态:
二、实验任务
① 用E和A命令分别将指令写入内存:
1)e命令修改寄存器的内容,然后用d命令查看0:200-0:220范围内修改的指令
(有一点小错误,计算地址长度时忘记一个字符,但已修正)
反汇编之后的结果为:
注:使用A命令是无法直接将机器指令写入内存中的
2)用A命令写入汇编指令,然后用U命令反汇编得到该指令的机器码
结论:同所有语言一样,高级语言是为了更方便人们对计算机的操作,而归根到底,所有的语言最终都会转变成机器语言,机器语言最终转化为电信号:0,1.
② 利用三条指令计算2的8次方
利用jmp指令的跳转功能可以实现,对数的循环操作,用a命令向2000:0处写入
Mov ax,1
Add ax,ax
Jmp 2000:0003
以上三条指令,T指令指定开始执行的地址,
在jmp七次以后便可以得到AX=0100(16)=32(10)
这里红圈标注的值便是32的16进制值,因为计算的乘法操作是常用补码一位乘法器,其实质便是对阶的操作,通过加法如2+2=4;4+4=8...128+128=256进行升阶操作,那么数值部分便可以进行一位操作得到2^8=256的结果
结论:jmp指令可以实现跳转操作,这对于计算整数幂的值有很大的帮助,在调试时,T命令需要单步执行,如果使用g命令,会导致G命令找不到地址而停止工作,因为jmp每次跳转回原来地址后,g跟踪T跳转之前的地址内容,并不执行这些指令,所以得不出结果。
③ 查看内存中的内容:
在PC机主内存FFF00H-FFFFFH的某几个单元中有该主板上ROM的生产日期,找到该日期:
首先要了解ROM:ROMS是 Rom image(只读内存镜像),只读的含义便是OS只能从里面读取一些必要的信息供于机器运行使用,不可以对其内容进行修改,既然是不能修改那么使用E命令的使用,找到不能修改的单元便可:
汇编中,内存单元后面的-表示不可显示的字符,可显示字符可以很明显辨认
这里猜测红色矩形框标注的便是生产日期的ASSIC码和十进制数值,
下面利用E命令对该内存范围内的内容进行修改,便再次用D命令查看
进行以下操作后发现FFF0:F0 FF范围内的内容是无法改变的,而可显示的为01/01/92,所以这便是ROM的生产日期1992年1月1日。
结论:ROM中的内容为只读,不能对其修改。汇编语言中数字字符以ASSIC码形式存储于内存里,显示时很容易发觉。
④ 向内存从B8100h开始的单元填写数据,如:
-e b810:0000 01 01 02 02 03 03 04 04
结果如下:
控制变量的方法修改一个值以后显示为:
继续试验得到:
故此,可以看出输出不同的值,得到的颜色和形状也不同。
结论:8086的显存地址空间是A0000H~BFFFFH,其中B8000H~BFFFFH为80*25彩色字符模式显示缓冲区,当向这个地址空间写入数据时,这些数据会立即出现在显示器上,通过实验可以看出,显示指令成对出现,第一个指令控制字符的形状,第二个指令是控制字符的颜色。
二、实验总结
这次的实验了解并掌握了对Debug工具的使用及对一些常用的汇编指令的运用,而对于汇编本身来说,编译器不如其他高级语言编译器使用方便,在DOS中不能方便的查询之前的页面信息,使用起来比较僵硬。指令一旦错误只能重新键入,但如果对于很长的指令集合来说,中间指令的出错可能导致结果异常,而在调试的时候只有重新打一遍所有命令才能解决此问题,或许会有更好的解决方案,但这是当下我对DOS的看法,但是,由于Assemble是位于计算机很低层的语言,了解掌握这种语言有利于更加了解计算机的运行使用,更加了解计算机的内核。
以上是关于Assemble实验报告的主要内容,如果未能解决你的问题,请参考以下文章