汇编基本语法实现
第五个程序
堆栈的学习
1 | cs:codesg |
首先观察代码段的前256字节称为PSP的内容
通过debug观察各个寄存器的值,通过现象学习堆栈的后进先出的操作规则。
可以看到进行
出栈出栈
入栈入栈
再出栈出栈
之后
ax和bx寄存器的值进行了交换。
类似生活中的一瓶糖水,一瓶盐水,现在需要交换两个瓶子的液体。使用“堆栈”这个容器进行了一个中转。
第六个程序
程序功能把内存单元的ffff:0 ffff:b单元的内容复制到0:2000:20b内存单元中。
1 | cs:code |
总结:此程序类似C语言中的循环,通过段寄存器DS和ES、BX自加、 以及循环,达到复制内存的目的。其中bx的作用就相当于C语言中的自加量i的作用。C代码如下
1 | char i; |
包含多个段的程序
在计算机运行程序时,程序和数据都是以二进制形式加载到内存中,实际上程序段和数据段对于计算机来说并没有任何不同。但是对于编程人员来说并不是一件好事,我们希望程序和数据以及堆栈分开存放。那么就需要对程序进行分块了。
第七个程序
交换内存中数据段前两个双字单元的数据
1 | cs:code,ds:data,ss:stack |
通过debug调试器
可以即将运行的代码看到date段
的地址为0b36h
,通过d命令
查看内存0b36
处的内容,正是在程序中定义的数据段0123h,0456h,···,0987h
栈段地址为0b37h,在内存中0b36:0010
单元处即为在程序中定义的全0的栈段。
经过两次入栈和出栈之后,可以看出date段的前两个双字节中的数据已经交换了位置。
第八个程序
使用push指令将a段中的前八个字形数据逆序存储到b段中
1 | cs:code |
如图执行数次循环后,a段数据已经逆序存储在b段中