用机器指令和汇编指令编程
教材实验一:
1.利用e命令或a命令实现指令的输入:
e命令:
首先将书本P45的前四行写入10000H开头的内存单元并使用u命令检查:

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


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



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

因为要求2的8次方,所以应单步运行16次后ax的值应为2的8次方。
-t后面加上十六进制的10即运行16次后:

AX寄存器数值为0100即十进制的256为2的8次方。
3.查找生产日期:
首先使用d命令查看FFF00-FFFFFH内存单元的内容:

看到生产日期在FFF0:00F0行,应该为92年1月1日生产的,尝试用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命令修改2000:0~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中的内容是无法修改的以及显存的奇妙之处,计算机果然实践出真知!

浙公网安备 33010602011771号