汇编代码中使用栈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ma2595162349/article/details/90729610

           先看一段代码:

           

          上面代码的作用是将程序中的数据逆序存放,程序定义自己的数据,还定义一段空值内存来当做栈来使用,在程序加载时,操作系统会为它们分配内存。start表示程序的入口处,start的上面只是程序定义的数据。

          ss:sp是用来指向栈顶的,mov ax,cs是要ss指向程序的数据部分ss:48,栈底对应的那段内存地址是ss:16~ss:47。当栈空时,栈顶指针栈顶的下一个地址,即ss:48 。cs:[bx]这里的cs称为段前缀,通常'[]'都是取段寄存器ds中的值,但是如果有段前缀,则'[]'取段前缀的地址。

         上述代码中,栈顶指针ss:sp指向cs:40,push操作时:sp=sp-2;pop操作时:sp=sp+2,因为栈是从高地址往低地址增长的。push cs:[bx]对应的那个循环是将程序中的数据入栈。两个循环bx来做偏移量,中间需要重置值。下面debug看一下。

 查看cd:0对应的数据,看到 23 01正是程序定义的数据,01是高位,23是低位。

当还没有执行pop cs:[bx]指令时,1cd2:0020最后2个数据正好是0123h,这就是程序第一个push进入栈的,之前为00的数据现在有的已经有值了。下面再来看出栈。

现在第一个数据为0987h,这刚好是程序定义的第一个数据。

参考资料:<<汇编语言>>王爽

猜你喜欢

转载自blog.csdn.net/ma2595162349/article/details/90729610