汇编 第五章 【bx】和loop指令
发布日期:2021-05-10 04:21:22 浏览次数:19 分类:精选文章

本文共 1579 字,大约阅读时间需要 5 分钟。

第五章 【bx】和loop指令

5.1 [bx]

在debug中使用mov ax,[0]:代表的是偏移地址,而在asm文件中写的编译后却变成了数字mov ax,0,相当于把0给了ax,而不是ds:0,所以出现了[bx]。要写成这样才能实现:mov ax,ds:[0]

关键点:

  • [0]表示内存单元,偏移地址为0;[bx]同样表示内存单元,段地址在DS中。
  • 它的偏移地址在bx中,取字还是取字节取决于寄存器是8位还是16位。
  • inc指令相当于C语言中的++运算符。
  • 5.2 Loop指令

    介绍

    这个指令与循环有关。

    指令格式:loop 标号

    执行loop指令时,CPU进行以下两步操作:

  • cx = cx - 1
  • 判断cx中的值:
    • 若不为零,转至标号处执行程序。
    • 若为零,则向下执行。
  • 常用场景

    • **cx中的存放:**通常用于存放循环的次数。
    • **标号:**在汇编中,标号代表地址,标号处的代码将被重复执行。

    三个关键要点

  • 启动循环前,cx中存放循环次数。
  • loop指令的标号所标识的位置必须在代码块前面。
  • 循环执行的程序段应放在标号和loop指令之间。
  • 代码框架

    mov cx, 循环次数
    S:
    循环执行的代码...
    loop S

    5.3 Debug跟踪与Loop指令

    注意事项在Debug中跟踪循环程序

    • 在汇编中,数据不能以字母开头。如果需要输入类似FFFFH的数值,需在前面加0,否则编译会报错。
    • 使用GP命令进行调试:
      • G命令(无参数):强制执行到程序结束。
      • G命令(有参数):执行到指定IP地址停止。
      • P命令:单步执行或跳过指令。

    5.4 Masm和Debug的区别

    • Debug:

      mov ax,[0]

      直接访问偏移地址为0的内存单元。

    • Masm编译器:

      mov ax,0

      会编译成mov ax,0,相当于mov ax, ds:0

    • 解决方法:

    • 使用mov ax,ds:[0]
    • 也可以使用bx临时寄存器:
      mov bx,0
      mov ax,[bx]

    5.5 Loop和[bx]的联合应用

    示例:计算ffff:0ffff:b内存单元中数据之和,存储在dx

  • 12个8位数据相加,结果可能超过8位,需使用16位寄存器存储。
  • 解决方法:
    • 将8位数据先转换为16位,再进行汇总。
  • Optimize的代码

    codesg
    mov ax,0ffffh
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,0ch ;循环次数
    s:
    mov dl,[bx]
    mov es,[bx],dl
    inc bx
    loop s
    mov ax,4c00h
    int 21h
    codesg endsend

    5.6 段前缀

    概念

    • 指令mov ax,[bx]中,默认使用ds段前缀。
    • 可以显式指定段地址:
      mov ax,ds:[0]

      这里的ds就是段前缀。

    5.7 安全内存空间

    原因

    8086模式下,随意写入内存空间存在风险,因为这可能覆盖系统数据或代码。

    安全区域

    • 在PC机中,范围0:200h0:2FFh安全可用,因为它们都为空,且不会被系统或程序占用。

    5.8 段前缀的优化使用

    示例:将ffff:0ffff:b内存单元中的数据复制到0:2000:20b内存单元

    优化后的代码:

    codesg
    mov ax,0ffffh
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,12
    s:
    mov dl,[bx]
    mov es,[bx],dl
    inc bx
    loop s
    mov ax,4c00h
    int 21h
    codesg endsend

    优化说明

    • 使用es存放目标段地址0020hds存放源段地址0ffffh
    • 只在循环中设置一次es,大幅提高效率。
    上一篇:汇编 第六章 包含多个段的程序
    下一篇:汇编 第四章 第一个汇编程序

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年05月02日 03时07分36秒