• 《汇编语言》——王爽 第五章 [BX]和loop指令


    要完整地描述一个内存单元,需要两种信息:1.内存单元的地址2.内存单元的长度(类型)

    单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出

    我们定义的描述性的符号“( )”——表示一个寄存器或一个内存单元中的内容。

    约定符号idata表示常量

    5.1[BX]

    注意 inc bx的含义是bx中的内容加1.

    5.2Loop指令

    loop指令的格式是:loop 标号, CPU执行loop指令的时候,要进行两步操作,1 (cx)=(cx)-1  2.判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

    从上面的描述中,可以看到,cx中的值影响着loop指令的执行结果。通常我们用loop指令来实现循环功能,cx中存放循环次数。

    我们可以总结出用cx 和 loop指令相配合实现循环功能的3个要点:

    1 在cx中存放循环功能;

    2 loop指令中的标号所标识地址要在前面

    3 要循环执行的程序段,要写在标号和loop指令的中间。

    用cx和loop指令相配和实现循环功能的程序框架如下。

    mov cx,循环次数

    s:

    循环执行的程序段

    loop s

    5.3在Debug中跟踪用loop指令实现的循环程序

    在书写的时候都是以字母开头的,而在汇编源程序中,数据不能以字母开头,所以要在前面加0.

    我们希望将循环一次执行完。可以使用p命令来执行。

    5.4Debug和汇编编译器masm对指令的不同处理

    5.5loop和[bx]的联合应用

    怎样解决这两个看似矛盾的问题?目前的方法就是得用一个16位寄存器来做中介。将内存单元中的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。

    5.6段前缀

    5.7一段安全的空间

    在不能确定一段内存空间中是否存放着重要的数据或代码的时候,不能随意向其中写入内容。

    不要忘记,我们是在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。如果我们需要向内存空间写入数据的话,要使用操作系统给我们分配的空间,而不应直接用地址任意指定内存单元,向里面写入。

    注意,我们在纯DOS方式(实模式)下,可以不理会DOS,直接用汇编语言去操作真实的硬件,因为运行在CPU实模式下的DOS,没有能力对硬件系统进行全面,严格地管理。但在Windows 2000,Unix这些运行于CPU保护模式下的操作系统中,不理会操作系统,用汇编语言去操作真实的硬件,是根本不可能的。硬件已经被这些操作系统利用CPU保护模式所提供的功能全面而严格地管理了。

    在一般的PC机中,DOS方式下,DOS和其他合法的程序一般都不会使用0:200-0:2FF的256个字节的空间。所以我们使用这段空间是安全的。不过位谨慎起见,在进入DOS后,我们可以先用Debug查看一下,如果0:200~0:2ff单元的内容都是0的话,则证明DOS和其他合法的程序没有使用这里。

    总结一下:

    1:我们需要直接向内存中写入内容

    2:这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误。

    3:DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码

    4:以后,我们需要直接向一段内存中写入内容时,就使用0:200~0:2ff这段空间。

    5.8段前缀的使用

    实验4 [bx]和loop的使用

  • 相关阅读:
    [剑指offer] 赋值运算符重载
    [hihoCoder] 股票价格
    [LintCode] Kth Smallest Number in Sorted Matrix
    [LeetCode] Subarray Sum Equals K | 前缀和+哈希表
    [LeetCode] Add and Search Word
    [LeetCode] Implement Trie
    Tableau基础练习(三)
    Tableau基础练习(二)
    Tableau基础练习(一)
    SpringMVC用户请求下载文件
  • 原文地址:https://www.cnblogs.com/JasonPeng1/p/12116504.html
Copyright © 2020-2023  润新知