zoukankan      html  css  js  c++  java
  • [bx]和loop指令

    要完整地描述一个内存单元,需要两种信息:

    1. 内存单元
    2. 内存单元的长度(类型)

    在debug中可以直接使用[0]来代替ds:0但是在汇编语言中却不能够直接这样使用。只有两种选择:

    1. 将偏移地址放在bx寄存器,使用[bx]
    2. 加上段前缀

    书中使用的约定:

    1. 描述性符号(),该符号标识一个内存地址指向的字/字节空间
    2. 约定符号idata标识常量

    loop指令

    loop指令的格式是:loop标号,cpu执行loop指令的时候执行两部操作:

    1. (cx)=(cx)-1
    2. 判断cx中的值是否为0,为0则向下执行,否则转向标号处

    所以一般cx中存放的即为循环的次数

    cx和loop指令配合实现循环功能的要点:

    1. cx中存放循环次数
    2. loop指令中的标号所标识地址要在前面
    3. 要循环执行的程序段要写在标号和loop指令的中间

    在debug中跟中使用loop指令实现的循环语句

    如果需要直接执行完循环,则使用p执行loop指令,或者使用g指令执行loop指令的下一条指令。p指令的指令格式为g 代码段偏移地址,他将跳到当前代码段和偏移地址组成的指令地址。
    注意,无论是使用p指令还是使用g指令,循环都会被执行完成
    同时,汇编语言源程序中,数据不能以字母开头

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

    1. 在汇编源程序中,如果使用指令访问一个内存单元,则在指令中必须用[]来表示内存单元于所在段的偏移地址,如果[]中为一个idata,则需要在其之前显式给出段寄存器。否则将认为idata。
    2. 如果在[]里使用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认存在ds中。当然也可以显式给出段地址所在的段寄存器。

    段前缀

    出现在访问内存单元的指令中,用于显式指明内存单元的段地址ds: cs: ss: es:,在汇编语言中称为段前缀。

    一段安全的空间

    在8086模式中,随意向一段内存空间写入内容式很危险的,因为这段空间中可能存在着重要的系统数据或者代码。

    我们实在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。如果我们需要向内存空间中写入数据,应该使用操作系统分配给我们的空间,而不应该随意指定内存单元。

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

    一般pc机中,dos方式下,dos和其他合法程序都不会使用0:200~0:2ff的256个字节空间





  • 相关阅读:
    在Visual Studio中使用正则表达式匹配换行和批量替换
    Microsoft Visual Studio Ultimate 2013 Update 2 RC 英文版--离线完整安装ISO+简体中文语言包
    TFS 2012 在IE11和Chrome (Windows 8.1) 显示英文的解决方案
    Windows 8 应用商店无法连接到网络的终极完美解决方案
    Visual Studio 2012 Update 4 RC 启动调试失败解决方案
    2013最新版Subversion 1.7.10 for Windows x86 + Apache 2.4.4 x64 安装配置教程+错误解决方案
    PKCS#1
    密钥协商机制
    base64的编码
    认证过程
  • 原文地址:https://www.cnblogs.com/freesfu/p/11017755.html
Copyright © 2011-2022 走看看