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





  • 相关阅读:
    Install JDK In Ubuntu
    js初学—实现checkbox全选功能
    js初学—js全自定义单选框
    poj1679The Unique MST(次小生成树模板)
    hdu3486Interviewe(二分是错的)(ST算法RMQ + 判定上下界枚举)
    poj3974 Palindrome(Manacher最长回文)
    poj1734 Sightseeing trip(Floyd求无向图最小环)
    BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)
    2.2 logistic回归
    神经网络的火热
  • 原文地址:https://www.cnblogs.com/freesfu/p/11017755.html
Copyright © 2020-2023  润新知