zoukankan      html  css  js  c++  java
  • [汇编语言]-第八章 数据处理的两个基本问题

    1- 定义描述性符号:reg(表示一个寄存器)和sreg(表示一个段寄存器)

      reg的集合包括: ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di;

      sreg的集合包括:ds, ss, cs, es

    2- bx, si, di, bp

    (1) 在8086CPU中, 只有这4个寄存器可以用在[...]中来进行内存单元寻址.

      mov ax,[bp]

      mov ax,[bp + si]

      mov ax,[bp + di]

      错误的指令

      mov ax,[ax]

      mov ax,[cx]

      mov ax,[dx]

      mov ax,[ds]

    (2) 在[...]中, 这4个寄存器可以单个出现, 或只能以四个组合出现: bx和si, bx和di, bp和si, bp和di

      mov ax,[bp + si]

      mov ax,[bx + si + idata]

      下面指令是错误的

      mov ax,[bx + bp]

      mov ax,[si + di]

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

      mov ax,[bp]  (ax) = ( (ss)*16 + (bp) )

      mov ax,[bp + si + idata] (ax) = ( (ss)*16 + (si) + (idata) )

    3- 机器指令处理的数据所在位置

      在机器指令这一层来讲, 并不关心数据的值是多少, 而关心指令执行前一刻, 它将要处理的数据所在的位置. 所要处理的数据可以在三个地方: CPU内部, 内存, 端口

      mov bx,[0]  内存, ds:0单元

      mov bx,ax  CPU内部, ax寄存器

      mov bx,1  CPU 内部, 指令缓冲器

    4- 汇编语言中数据位置的表达

    (1) 立即数(idata): 直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中), 在汇编语言中称为:立即数(idata) 在汇编指令中直接给出

      mov ax,1

      add bx,2000h

      or   bx,00100000b

      mov al,'a' 

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

      mov ax,bx

      mov ds,ax

      push bx

      mov ds:[0], bx

      push ds

      mov ss, ax

      mov sp,ax

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

      mov ax,[0]

      mov ax,[di]

      mov ax,[bx + 8]

      mov ax,[bx + si]

      mov ax,[bx + si + 8]

      段地址默认在ds中

      mov ax,[bp]

      mov ax,[bp + 8]

      mov ax,[bp + si]

      mov ax,[bp + si + 8]

      段地址默认在ss中

      存放段地址的寄存器也可以显性给出

      mov ax,ds:[bp]  (ax) = ( (ds)*16 + (bp))

      mov ax,cs:[bx + si +8]  (ax) = ( (cs)*16 + (bx) + (si)  + 8)

    5- 寻址方式: 

      当数据存放在内存中的时候, 我们可以用多种方式给定这个内存单元的偏移地址,这种定位内存单元的方法一般称为寻址方式.

    6- 指令处理的数据有多长?

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

    (1) 通过寄存器名指明要处理的数据的尺寸

      下面的指令中, 寄存器指明了指令进行的是操作:

      mov ax, 1

      mov bx,ds:[0]

      mov ds,ax

      mov ds:[0],ax

      inc ax

      add ax,1000

      下面的指令中,寄存器指明了指令进行的是字节操作:

      mov al,1

      mov al,bl

      mov al,ds:[0]

      mov ds:[0], al

      inc al

      add al,100

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

      下面的指令中, 用word ptr指明了指令访问的内存单元是一个字单元.

      mov word ptr ds:[0], 1

      inc word ptr [bx]

      inc word ptr ds:[0]

      add word ptr [bx],2

      下面的指令中,用byte ptr指明了指令访问的内存单元是一个字节单元

      mov byte ptr ds:[0],1

      inc byte ptr [bx]

      inc byte ptr ds:[0]

      add byte ptr [bx],2

      没有寄存器参与的内存单元访问指令中,要word ptr ,byte ptr显性的指明所要访问的内存单元长度,否则CPU无法确认.

      2000:1000 FF FF FF FF ....

      指令:

      mov ax,2000H

      mov ds,ax

      mov byte ptr [1000H],1

      内存内容变为: 2000:1000 01 FF FF FF ....

      而指令:

      mov ax,2000H

      mov ds,ax

      mov word ptr [1000H],1

      内存内容变为: 2000:1000 01 00 FF FF ....

    (3) 有些指令是默认的处理单元,如push [1000H]只进行字操作

    7- 寻址方式的综合应用

      mov byte ptr [bx + 10H + si],'A'

      mov byte ptr [bx].10H[si],'A' //dec.cp[i]='X' C语言struct描述

      以上指令相同

     

  • 相关阅读:
    代码阅读:结构与逻辑
    ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)
    大白话讲解Promise(一)
    ReactiveCocoa 中 RACSignal 是如何发送信号的
    The Future Of ReactiveCocoa by Justin Spahr-Summers
    reactive programming
    【转】iOS中流(Stream)的使用
    NSStream 流式思想
    Future模式 总结
    备忘
  • 原文地址:https://www.cnblogs.com/galoishelley/p/3571230.html
Copyright © 2011-2022 走看看