• 第十章 call和ret指令


    1、call和ret指令都是转移指令,他们都修改ip或同时修改cs和ip。

    2、ret指令用栈中的数据,修改ip的内容,从而实现近转移。操作:1.(ip)=((ss*16)+(sp));2.(sp)=(sp)+2。retf指令用栈中的内容同时修改cs和ip

    3、call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:1.将当前的ip或cs和ip压入栈中;2.转移(jmp)。Call指令不能实现短转移,跟jmp操作相似。操作:1.push IP;2.jum near ptr 标号。范围-32768~32767,补码表示。(转移位移

    4、转移的目的地址在指令中的call指令:段间转移指令call far ptr 标号。操作:1.push cs,push ip,jmp far ptr 标号。

    检测点10.3:先cs入栈1000,此时ip=8,8+8=16,也就是10h。

    5、转移地址在寄存器中的call指令:call 16位寄存器,操作:push ip,jmp s。2.call word ptr 内存单元地址,操作:push ip,jmp word ptr 内存单元地址。3.call dword ptr 内存地址,操作:push ip,jmp dword ptr 内存单元地址。

    6、call和ret配合使用:利用call和ret来实现子程序机制,call指令转去执行子程序之前,call指令后面的指令的地址将存储在栈中,在子程序后面使用ret指令,用栈中的数据恢复设置的ip的值,从而转到call指令后面的代码处继续执行。

    7、mul指令,乘法指令。相乘的两个数:要么都是8位的,要么都是16位的。乘数默认8位在al中,16位在ax中。结果8位:AX中,16位:高位dx中,低位ax中。格式:mul reg;mul 内存单元。

    8、模块化程序设计:call和ret指令配合支持了汇编语言编程中的模块化设计(也就是面对过程)。①参数和结果的传递问题:批量数据传递,将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序,对于具有批量数据的返回结果,也可用同样的方法。除此之外,通用的方法就是栈

    9、注意养成良好的风格:程序美观、注释。

    View Code
     1 ;将以0结尾的字符串转化为大写(这个程序有问题,cx的处理)
    2 assume cs:code,ds:data

    3
    4 data segment
    5 db 'word',0
    6 db 'unix',0
    7 db 'wind',0
    8 db 'good',0
    9 data ends
    10
    11 code segment
    12
    13 start: mov ax,data
    14 mov ds,ax
    15 mov bx,0
    16
    17 mov cx,4
    18 s:mov si,bx
    19 call capital
    20
    21 add bx,5
    22 loop s
    23
    24 mov ax,4c00h
    25 int 21h
    26
    27 capital:mov cl,[si]
    28 mov ch,0
    29 jcxz ok ;判断cx是否为0
    30 and byte ptr [si],11011111b

    31 inc si
    32 jmp short capital
    33 ok:ret
    34
    35 code ends
    36 edn start

    这两天在看课后习题,头疼死了。。。。

  • 相关阅读:
    UIViewController生命周期
    NSTImer重复执行任务
    IOS平台汉字转拼音方案
    @properties指针说明
    自定义yum仓库
    man手册、zip备份
    ln 软连接与硬连接
    fdisk分区规划和添加wap交换空间
    window部署ftp服务器
    配置附加权限和LDAP
  • 原文地址:https://www.cnblogs.com/quantumplan/p/2403237.html
Copyright © 2020-2023  润新知