汇编之loop指令使用栈实现二重循环,同时了解汇编函数(过程)的概念用法

  • Post author:
  • Post category:其他


首先我们知道loop指令用于实现一层循环,CX寄存器存储其循环次数

按照我的步骤,我一定不会满足单单一层循环,

于是我在loop指令里面 套了一个loop指令,

结果不言而喻,产生了一个无限死循环。这自然不是我要的结果。

经过我的debug与猜测,发现是


一层循环计数寄存器CX的值被二层的覆盖了


自然不能简单的套loop了,

而后在学习函数调用时阅读到这样两个与栈有关的指令

push
pop

作用是保存一个值到栈,很通用的方法

于是·解决方法就出来了:


使用push将一层循环的CX保存起来再将二层循环的次数PUSH放到CX中,二层循环完后,再将栈中的CX pop还原到一层循环。OK

二层循环就是折磨简单。

关键代码示例:
实现一个三角形的输出:

row,col为三角形的行与列

print_J是输出#号的函数(过程)

过程的定义:

1.默认使用near近调用参数,若修改,必须使用方式2指定

2.一定要用RET,强制返回

方式1:

NAME:
;DOSOMETHING
RET

方式2:

NAME PROC [FAR/NEAR];二选一
;DOSOMETHING
RET
NAME ENDP
print_J:
     ;输出#
    LEA DX,jinhao;jinhao为自定义变量“#$”
    MOV AH,09h
    INT 21h
    RET

循环:

    MOV CX,row
    st1:
       
        PUSH CX
        MOV CX,col
        st2:
            CALL print_J
        LOOP st2
        ;换行
        MOV DL,0ah 
        MOV AH,02h
        INT 21h
        ;列加一
        ADD col,1

        POP CX

    LOOP st1

编译连接运行效果如下:

在这里插入图片描述

坚持就是胜利!奥利给!!



版权声明:本文为thebestway原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。