zoukankan      html  css  js  c++  java
  • 汇编之偏移地址几种常用写法

     ----------------------------汇编学习笔记------------------------

    ------8086处理器---------------

    //[bx+20]表示的是一个内存单元

    指令mov ax,[bx+20]也可以写成如下格式(常用):
    mov ax,[20+bx]
    mov ax,20[bx]
    mov ax,[bx].20

    Dx,Di,Si的段地址默认是DS,如果没有指明(Dx,DI,Si)属于哪个段的偏移地址,默认是DS的偏移地址!

    --------------------

    [bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值)。
    我们看下指令mov ax,[bx+si]的含义:
    将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。

    指令mov ax,[bx+si]的数学化的描述为:
    (ax)=( (ds)*16+(bx)+(si) )
    该指令也可以写成如下格式(常用):
    mov ax,[bx][si]

    -------------001---开始---------------

    (1)在8086CPU 中,只有这4个寄存器(bx、bp、si、di)可以用在“[…]” 中

         

    正确的指令
    mov ax,[bx]
    mov ax,[bx+si]
    mov ax,[bx+di]
    mov ax,[bp]
    mov ax,[bp+si]
    mov ax,[bp+di]

    错误的指令
    mov ax,[cx]
    mov ax,[ax]
    mov ax,[dx]
    mov ax,[ds]

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

    正确的指令
    mov ax,[bx]
    mov ax,[si]
    mov ax,[di]
    mov ax,[bp]
    mov ax,[bx+si]
    mov ax,[bx+di]

    mov ax,[bp+si]
    mov ax,[bp+di]
    mov ax,[bx+si+idata]
    mov ax,[bx+di+idata]
    mov ax,[bp+si+idata]
    mov ax,[bp+di+idata]

    错误的指令
    mov ax,[bx+bp]
    mov ax,[si+di]

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

         

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

      

    ------------001结束---------------------

    --------------002开始-----------

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

    对于这个问题,汇编语言中用以下方法处理。
    (1)通过寄存器名指明要处理的数据的尺寸。
    (2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。
    (3)其他方法

    下面的指令中,寄存器指明了指令进行的是字操作:
    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

    下面的指令中,用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无法得知所要访问的单元是字单元,还是字节单元。

    --------------002结束-----------------

    --------------------003开始--------dup-----

    dup示例
    db 3 dup (‘abc’,’ABC’)
    定义了18个字节,它们是
    ‘abcABCabcABCabcABC’,
    相当于db ‘abcABCabcABCabcABC’

    可见,dup的使用格式如下:
    db 重复的次数 dup (重复的字节型数据)
    dw 重复的次数 dup (重复的字型数据)
    dd 重复的次数 dup (重复的双字数据)

    dup是一个十分有用的操作符
    比如我们要定义一个容量为 200 个字节的栈段,如果不用dup,则必须用这样的格式:
    stack segment
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    stack ends

    ------------------003结束--------dup--

  • 相关阅读:
    AI芯片:高性能卷积计算中的数据复用
    矩阵乘法加速器的设计框架
    NVDLA中Winograd卷积的设计
    神经网络加速器应用实例:图像分类
    Simple TPU的设计和性能评估
    TPU中的指令并行和数据并行
    TPU中的脉动阵列及其实现
    动手写一个简单版的谷歌TPU
    利用Xilinx HLS实现LDPC译码器
    FPGA上如何求32个输入的最大值和次大值:分治
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/15428899.html
Copyright © 2011-2022 走看看