• 【汇编】模块化程序——call指令和ret指令作用、具有子程序的源程序框架、mul乘法指令、8位与16位乘法、寄存器冲突问题


    10.1 call指令和ret指令

    call指令

    在这里插入图片描述
    call指令相当于c++中的调用函数的指令,若要调用,直接用call 函数名即可调用已有函数。

    • call 函数名
      在这里插入图片描述
      call far ptr 标号实现段间转移,而不是段内转移:
    push CS
    push IP
    jmp far ptr 标号
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    寄存器中的call指令

    call 寄存器相当于将当前的IP入栈,把寄存器当前的地址存放在IP中

    在这里插入图片描述

    内存中的call指令

    call 内存单元相当于将当前的IP或者CS:IP入栈,把内存单元中存储的当前的地址存放在IP中
    存内存单元时看是word还是dword,单字的话只转移IP,双字转移CS:IP.
    在这里插入图片描述

    ret

    ret指令取自return,和c++中return作用相同。在函数中使用。
    把之前call push的IP pop出来,实现程序的返回转移。
    在这里插入图片描述

    CALL和RET指令跳转过程

    下图中,从20002开始,cs:ip通过地址总线进入代码段进行取值,取出0005E8,IP此时指向20005,数据从数据总线中保存到指令缓冲寄存器中,指令缓冲寄存器发现指令是跳转指令,将当前的IP入栈,此时是段内跳转,用20005+0005=2000AIP指向到2000A地址执行指令
    执行到ret后指令缓冲寄存器发现是ret,对之前保存IP出栈,让IP指向20005,这就是call和ret的调用全过程。
    在这里插入图片描述

    10.2 具有子程序的源程序框架

    在上面,笔者在谈到call和ret之间时有一个重要媒介,就是栈的操作,在call和ret操作时都需要出栈和入栈,所以在正常调用call和ret时要定义栈的空间,来进行出栈入栈的操作。
    在这里插入图片描述
    在这里插入图片描述

    10.3 mul指令

    在mul乘法指令中,8位乘法和16位乘法在使用被乘数、乘数以及结果存储上有区别。
    8位乘法被乘数默认存储在AL中,乘数为8位寄存器或者内存字节单元结果存放在16位寄存器AX中
    16位乘法被乘数默认存储在AX中,乘数为16位寄存器或者内存字节单元结果存放在32位寄存器DX(高位)+AX(低位)中
    在这里插入图片描述
    在这里插入图片描述

    10.4 模块化程序设计

    模块化其实就是C++中的函数调用,通过这call和ret命令,可以实现自定义调用,可以进行递归调用等。
    看下图中要执行计算的操作,考虑计算中用什么来对参数进行传递?
    可以用寄存器、内存单元、栈进行参数的传递。

    在这里插入图片描述

    寄存器存储参数及结果

    在这里插入图片描述

    内存单元存储参数及结果

    因为寄存器的数量有限,资源很宝贵,所以我们可以使用内存单元来存储相应的参数和结果。
    在这里插入图片描述

    栈存储参数及结果

    对于内存单元的修改可能对正常运行的某部分功能进行修改从而导致出现错误。
    则在程序开始前我们可以对栈的空间先进行定义,用栈来存储,就解决了功能的问题。
    在这里插入图片描述
    下图中ret 4代表着pop最后四个字节的数值。
    在这里插入图片描述

    10.5 寄存器的冲突问题

    像下图,一开始定下的data的空间,db定义了12个字空间的大小,但是在程序中,如果我们要实现循环,像下面这样数肯定是不现实的。
    在这里插入图片描述
    在下面程序中cx既担任了控制循环的角色,又要进行si位置数据的保存,用jcxz判断cx是否为0,造成了寄存器冲突。
    在这里插入图片描述
    解决这个问题我们可以使用栈,通过在子程序中使用的寄存器都先入栈,之后按反顺序出栈,最后返回,即可解决寄存器冲突的问题。
    过程:

    子程序: 子程序中使用的寄存器入栈
    			 子程序内容
    			 子程序使用的寄存器出栈
    			 返回(ret、retf)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    实例

    在这里插入图片描述

  • 相关阅读:
    我为什么觉得程序员是个高危职业
    图片服务器(1)
    APS排程软件帮机械加工企业解决交期承诺问题
    基于JavaWeb技术的在线考试系统设计与实现
    开发知识点-Pygame
    使用uncompyle6反编译pyc文件(附报KeyError和Error: uncompyle6 requires Python 2.6-3.8的解决方法)
    Sql Server 数据库中的所有已定义的唯一约束 (列名称 合并过了)
    uniapp自定义导航栏以及页面加背景
    山西电力市场日前价格预测【2023-11-07】
    rocketmq安装、启动
  • 原文地址:https://blog.csdn.net/m0_62783065/article/details/127540894