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个字节空间





  • 相关阅读:
    springboot springcloud zuul 过滤器
    springboot springcloud eureka 熔断器
    javaweb servlet filter
    maven nexus 搭建私服(二)
    springboot springcloud zuul 网关入门
    springboot springcloud 配置中心
    springboot springcloud eureka 入门
    java rabbitmq
    java jvm调优
    maven nexus 搭建私服(一)
  • 原文地址:https://www.cnblogs.com/freesfu/p/11017755.html
Copyright © 2011-2022 走看看