zoukankan      html  css  js  c++  java
  • 第五-八章

    第五章([BX]和loop指令)

    1.mov ax,[bx] 意思就是bx中存放的数据作为偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入到ax中,即(ax)=((ds)*16+bx)

    inc bx,1          意思就是bx中的内容加1.

    2.loop指令

    当CPU执行loop指令时,要进行两步操作:先是(cx)=(cx)-1,然后判断cx的值,不为0则转至标号处执行程序,为0则向下执行。

    从这,我们可以看出cx的值直接影响着loop指令的执行,所以我们通常用loop指令来执行循环功能,用cx来存放循环次数。

    框架入下:mov cx,循环次数

                     s:循环的内容

                     loop s

    3.在Debug中跟踪loop指令实现的循环程序

    看书上的实验步骤。

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

    在debug中指令:mov ax,[0]   ;表示将ds:0处的数据送入到ax中。

    但是在汇编源程序中 则会被当作指令mov ax,0 来使用

    但是我们可以通过以下的代码来实现(先将偏移地址送入到bx寄存器中):

    mov ax,2000h

    mov ds,ax

    mov bx,0

    mov al,[bx]

    后两行也可以用mov al,ds:[0]

    意思就是在汇编源程序中如果用指令来访问一个内存单元,必循在”[]"前面给出段地址的段寄存器。

    5.loop和[bx]的联合应用

    用同一种方法处理地址连续的内存单元的数据的问题,通常我们需要使用loop指令,并且我们可以不写新的指令,仅通过改变bx的指令来改变指令访问的内存单元。

    6段前缀

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

    7一段安全的空间

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

    在DOS方式下,一般情况下,0:200~0:2ff空间没有系统或其他数据或代码,可以用来使用。

    8段前缀的使用

    可以用来将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中

    第六章  (包含多个段的程序)

    程序获得所需空间的方法有两种:一是在加载程序的时候为程序分配;再就是程序在执行的过程中向系统申请

    1.在代码段中使用数据

    由“end start"指明的程序入口,被转化为一个入口地址,存储在可执行文件的描述信息中,这样CPU就从我们希望的地址处开始执行了。

    归根到底,只要在源程序中用”end符号“来指明就可以让CPU从这开始执行程序。

    2.在代码段中使用栈

    可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来使用。

    所以我们在描述dw的作用时,可以说用它定义数据,也可以说用它开辟内存空间。

    3.将数据 代码 栈放入不同的段

    我们用定义代码段一样的方法来定义多个段,然后在这些段里面定义需要的数据,或通过定义数据来取得栈空间,主要的思想就是将数据 栈和代码放到不同的段中。

    CPU处理我们定义在段中的内容,完全是靠程序中具体的汇编指令,和汇编指令对寄存器的设置来决定的。

    第七章   (跟灵活的定位内存地址的方法)

    1.and和or指令

    and指令:逻辑与指令,按位进行与运算

    or指令:逻辑或指令,按位进行或运算

    2.关于ASCII码

    如果我们用ASCII码的规则来解释显存中的61H,其实就是字符”a"的意思

    3.以字符形式给出的数据

    我们在汇编程序中,用’......'的方式指明数据是以字符的形式给出的,编译器将他们转换为相对应的ASCII码。

    例如:db 'unIX' 相当于”db 75H,6EH,49H,58H"

    4.大小写转换的问题

    分析一下,我们可以知道,要想改变一个字母的大小写,实际上就是要改变他的ASCII码,我们又知道小写字母的ASCII码比大写字母的ASCII码值大20H。

    我们用刚学会的or指令来改变他的第五位置(二进制的情况下):为0时,就为大写字母;反之,为1时,就为小写字母。

    5. [bx+idata]

    在前面,我们用[bx]的方式来指明一个内存单元,现在我们可以用[bx+idata]来表示,他的偏移地址为(bx)+idata(bx中的值加上idata)

    对于指令mov ax,[bx+200]的解释 :

    将一个内存单元的内容送入到ax中,这个内存单元的长度为2个字节,存放一个字,偏移地址为bx中的数值加上200,段地址存放在ds中。

    数学化:(ax)=((ds)*16+(bx)+200)

    6.用[bx+idata]的方式进行数组的处理

    bx给出了从偏移地址开始的相对位置。

    我们可以通过观察书本上的代码比较发现,[bx+idata]的方式为高级语言实现数组提供了便利机制。

    7.SI和DI

    si 和di 时8086CPU中和bx功能相近的寄存器,不能够分为两个8位寄存器来使用。

    8.[bx+si]和[bx+di]

    [bx+si]表示一个内存单元,他的偏移地址位(bx)+(si)

    例如:指令 mov ax,[bx+si]

    就是将一个内存单元的内容送入ax,这个内存单元的长度为两个字节,用来存放一个字,偏移地址为bx的值加上si的值,段地址存放在ds中。

    数学化的描述为:(ax)=((ds)*16+(bx)+(si))

    9.[bx+si+idata]和[ba+di+idata]

    他们都是表示一个内存单元,偏移地址为(bx)+(si)或(di)+idata;

    指令:mov ax,[bx+si+idata]

    表示为将一个内存单元的内容送入到ax中,这个内存单元的长度为2个字节,存放一个字,偏移地址为bx 的数值加上di的数值再加上idata。

    数学化的描述为:(ax)=((ds*16+(bx)+(di)+idata)

    10.不同的寻址方式的灵活应用

    (1)[idata]用一个常量来表示地址,可用于直接定位一个内存单元;

    (2)[bx]用一个变量来表示内存地址,可用与间接定位一个内存单元;

    (3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;

    (4)[bx+si]用两个变量来表示地址;

    (5)[bx+si+idata]用两个变量和一个常量表示地址。

    可以看出,从[idata]到[bx+si+idata],我们可以用更加灵活的方式来吧定位一个内存单元的地址。

    第八章    (数据处理的两个基本问题)

    分别是:处理的数据在什么地方;以及要处理的数据有多长。(reg和sreg)

    1.bx si di和bp

    在8086CPU中,只有这四个寄存器可以用在[.....]中来进行内存单元的寻址。(其他的寄存器是不被允许的)

    在[....]中,这四种寄存器可以单独出现,或只能以这四种组合出现:bx和si,bx和di,bp和si,bp和di.

    只要在[....]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就是默认存放在ss中

    2.机器指令处理的数据在什么地方

    指令在执行前,所要处理的数据可以在3个地方:CPU内部,内存,端口

    3.汇编语言中数据位置的表达

    用3个概念来表示数据的位置:立即数,寄存器,段地址(SA)和偏移地址(EA)

    立即数:直接包含在机器指令中的数据,在汇编指令中直接给出;

    寄存器:指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名

    段地址(SA)和偏移地址(EA):指令要处理的数据在内存中,在汇编指令中可用[x]的格式来给出EA,SA在某个 段寄存器中

    存放段地址的寄存器一般是默认的,有的也是以显性的方式给出来的。

    4.寻址方式

    定义:数据存放在内存时,我们用多种方式来给定这个内存单元的偏移地址

    主要有:直接寻址,寄存器间接寻址,基址变址寻址,相对基址变址寻址

    5.指令要处理的数据有多长

    对于8086CPU的指令,可以处理两种尺寸的数据:byte和word,所以,要在机器指令中指明进行的是字操作还是字节操作。

    可以通过寄存器名指明要处理的数据的尺寸(比如ax和al)

    在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte

    例如:mov word ptr [bx],2

              mov byte ptr [bx],2

    对于push指令而言,它就会z只执行字操作。

    6.寻址方法的综合应用

    一般来说,我们可以用[bx+si+idata]访问结构体中的数据:用bx 定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每个元素。

    7.div指令

    div是除法指令,有以下问题需要注意:

    除数:有8位或16位,存放在reg中或内存单元中

    被除数:默认放在AX或DX和AX中,如果除数为8位,则被除数为16位,默认存放在AX中;如果除数为16位,被除数为32位,在DX和AX中,DX存放高16位,AX存放低16位

    结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法的操作的商,DX存储除法操作的余数。

    8.伪指令dd

    之前我们用db 和dw来定义字节型数据和字性数据,而dd是用来定义双字型数据的

    db 1

    dw 1

    dd 1

    分别表示第一个数据为01H,占一个字节

                  第二个数据为0001H,占一个字

                  第三个数据为000000011H,占两个字

    9.dup

    它是一个操作符,用来进行数据的重复

    比如 db 3 dup (0)

    定义了三个字节,他们的值都为0,相当于db 0,0,0

    db 3 dup(0,1,2)

    相当于 bd 0,1,2,0,1,2,0,1,2

  • 相关阅读:
    生活中总结出来的各种定律
    python中os.system()的返回值
    使用ldap登录服务器
    使用VirtualBox + Vagrant打造统一的开发环境
    Laravel 虚拟开发环境 Homestead
    win7 powershell版本过低问题
    Vagrant安装教程及常见问题
    vagrant up提示“Couldn‘t open file /path/to/base“的错误解决方法
    一起谈.NET技术,ASP.NET MVC的全球化方案 狼人:
    一起谈.NET技术,.Net4.0 Parallel编程(二)Data Parallelism 中 狼人:
  • 原文地址:https://www.cnblogs.com/lopezj/p/10140724.html
Copyright © 2011-2022 走看看