用机器指令和汇编指令编程

教材实验一:

1.利用e命令或a命令实现指令的输入:

e命令:

首先将书本P45的前四行写入10000H开头的内存单元并使用u命令检查:

 

接着将CS:IP的值修改到10000H的位置并使用t命令单步运行查看结果:

 

 

a命令:

直接在当前CS:IP值使用a命令写入汇编指令并使用t命令单步运行查看结果:

 

 

 

2.计算2^8

将书本上三条指令写入20000H开始的内存单元中,并将CS:IP值修改到当前位置

 

因为要求28次方,所以应单步运行16次后ax的值应为28次方。

-t后面加上十六进制的10即运行16次后:

 

AX寄存器数值为0100即十进制的25628次方。

3.查找生产日期:

首先使用d命令查看FFF00-FFFFFH内存单元的内容:

 

看到生产日期在FFF0:00F0行,应该为9211日生产的,尝试用e命令改变:

 

发现改变不了,查阅资料后发现是因为ROM中的内容是无法修改的

4.在显存中更改内存单元值:

 

在输入之后发现右上角多出了小符号

 

 

每次更改写入的数值小符号都会变化:

 

 

查阅书本1.15后我发现地址的A0000~BFFFF为显存的内存单元,在这上面更改数据会直接显示在显示器上,向C0000~FFFFF内存单元写入数据并不会。

教材实验二:

实验任务1:

先根据理论填写书中的数值:

根据老师给出的文档,先使用e命令将内存单元0022:0~7连续8个字节数据修改为50H,51H,52H,53H,54H,55H,56H,57H,修改后查看是否正确写入并使用a命令输入P74的指令:

接着使用t命令单步运行查看每一步的过程:

这里在mov ss,ax之后直接省略了mov sp,0100,根据书本P73-P74的样例说为中断机制的问题,之后的学习中会学到:

将栈每一步修改的内存单元与之前理论填写的进行比对:

 改变了内存单元地址为00FE,值为A4A2H

 改变了内存单元地址为00FC,值为ACAAH

 ax,bx分别变为ACAAH和A4A2H

 push [4]改变的内存单元的地址为00FE,值为5554H

 push [6]改变的内存单元的地址为00FC,值为5756H

经过比对与开始自己写的理论值相同,正确!

 实验任务2:

使用a命令输入的7行指令并使用e命令修改20000~f的值:

使用t命令单步调试每一行汇编指令并用d命令查看2000:0~f的值:

实验结论:

 

(1)

 

前三行汇编指令的功能:

 

mov ax,2000

 

mov ss,ax

 

功能为设置栈的段地址,SS=2000H,不能直接向段寄存器SS中送入数据,所以用ax中转

 

接着是mov sp,10

 

设置的为栈顶的偏移地址,因为栈初始为空,所以sp=0100H为栈顶,0000H为栈底。

 

(2)

 

在实验任务2中,单步调试时发现寄存器中内存单元的值一直在改变,仔细观察发现:

因为2000:0~2000:f之中的内容存储了CS,IP以及ax的物理地址,而这个时候栈的位置也在这里,

 

在3123H和3366H的两次入栈过程中都将CS,IP以及ax的物理地址值往左推了两个单元,

 

而具体数值变化的原因是因为IP一直在改变

实验总结:

本次汇编语言的第一次实验总体来说受益颇多,在之前的课堂内容时,很多东西听的似懂非懂,栈压入时

栈顶指针的变化以及各种指令引起的寄存器值变化都不是特别理解,做完这次的实验后对于书本上知识

的理解更上了一层楼,还了解了ROM中的内容是无法修改的以及显存的奇妙之处,计算机果然实践出真知!

 

posted @ 2020-10-10 17:11  Sabertooth  阅读(214)  评论(3)    收藏  举报