zoukankan      html  css  js  c++  java
  • 汇编语言——数据处理的两个基本问题(处理的数据在什么地方 要处理的数据有多长)

    bx、si、di、bp

    1、在8086CPU 中,只有这4个寄存器(bx、bp、si、di)可以用在“[…]” 中来进行内存单元的寻址。

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

     1 正确的指令:
     2 mov ax,[bx]
     3 mov ax,[si]
     4 mov ax,[di]
     5 mov ax,[bp]
     6 mov ax,[bx+si]
     7 mov ax,[bx+di]
     8 mov ax,[bp+si]
     9 mov ax,[bp+di]
    10 mov ax,[bx+si+idata]
    11 mov ax,[bx+di+idata]
    12 mov ax,[bp+si+idata]
    13 mov ax,[bp+di+idata]
    14 
    15 错误的指令:
    16 mov ax,[bx+bp]
    17 mov ax,[si+di]

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

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

    汇编语言中用三个概念来表达数据的位置。

    1、立即数(idata)

    2、寄存器

    3、段地址(SA)和偏移地址(EA)

    从而产生了一下的寻址方式

    寻址方式***

    指令要处理的数据有多长***

    主要有一下几种方式:

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

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

    1 mov ax,1
    2 mov bx,ds:[0]
    3 mov ds,ax
    4 mov ds:[0],ax
    5 inc ax
    6 add ax,1000

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

    1 mov al,1
    2 mov al,bl
    3 mov al,ds:[0]
    4 mov ds:[0],al
    5 inc al
    6 add al,100

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

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

    1 mov word ptr ds:[0],1
    2 inc word ptr [bx]
    3 inc word ptr ds:[0]
    4 add word ptr [bx],2

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

    1 mov byte ptr ds:[0],1
    2 inc byte ptr [bx]
    3 inc byte ptr ds:[0]
    4 add byte ptr [bx],2

    (3)其他方式

    有些指令默认了访问的是字单元还是字节单元,
    比如:push [1000H]就不用指明访问的是字单元还是字节单元,
    因为push指令只进行字操作。(每次操作sp=sp-2

    div指令

    div是除法指令,使用div作除法的时候:
    除数:8位或16位,在寄存器或内存单元中
    被除数:(默认)放在AX(16位) 或 DX和AX(32位)中
    结果:运算 8位 16位
               商    AL    AX
         余数 AH   DX

    div指令格式:
              div reg
              div 内存单元

     1 div byte ptr ds:[0]    ; (AX)除以(DS)*16+0内存单元的字节型数据
     2 
     3 (al)=(ax)/((ds)*16+0)的商;
     4 (ah)=(ax)/((ds)*16+0)的余数
     5 
     6 
     7 div word ptr es:[0]    ; (AX)*10000H+(DX)的值除以(ES)*16+0内存单元的字型数据
     8 
     9 (ax)=[(dx)*10000H+(ax)]/((ds)*16+0)的商;
    10 (dx)=[(dx)*10000H+(ax)]/((ds)*16+0)的余数
    11 
    12 
    13 div byte ptr [bx+si+8]
    14 
    15 (al)= (ax)/((ds)*16+(bx)+(si)+8)的商;              
    16 (ah)=(ax)/((ds)*16+(bx)+(si)+8)的余数
    17 
    18 
    19 div word ptr [bx+si+8]
    20 
    21 (ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的商;
    22 (dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的余数

    伪指令dd

    示例:data segment
        db 1
        dw 1
        dd 1
    data ends
    在data段中定义了三个数据:
    第一个数据为01H,在data:0处,占1个字节;
    第二个数据为0001H,在data:1处,占1个字;
    第三个数据为00000001H,在data:3处,占2个字;

     1 问题:
     2 用div 计算data段中第一个数据除以第二个数据后的结果,商存放在第3个数据的存储单元中。 
     3 data segment
     4     dd 100001    ; 2个字,4个内存单元,32位    0-3
     5     dw 100        ; 1个字,2个内存单元,16位    4-5
     6     dw 0        ; 1个字,2个内存单元,16位    6-7
     7 data ends
     8 
     9 分析:
    10 data段中的第一个数据是被除数,为dword(双字)型,32位,所以在做除法之前,用dx和ax存储。应将data:0字单元中的低16位存储在 ax中,data:2字单元中的高16位存储在dx中。
    11 
    12 程序代码:
    13  mov ax,data
    14  mov ds,ax
    15  mov ax,ds:[0]       ;ds:0字单元中的低16位存储在ax中
    16  mov dx,ds:[2]       ;ds:2字单元中的高16位存储在dx中
    17  div word ptr ds:[4];用dx:ax中的32位数据除以ds:4字
    18                     ;单元中的数据
    19  mov ds:[6],ax       ;将商存储在ds:6字单元中

  • 相关阅读:
    由类型名得到该类型
    TypeName of CA1505 is AvoidUnmaintainableCode, not AvoidUnmantainableCode.
    多核
    SSRS throws "The operation has timed out."
    XmlRootAttribute与XmlTypeAttribute
    littleendian and bigendian
    Assembly Exp
    如何在Ubuntu 11.10下成功安装Java [转载]
    *uck up ~,纯发泄
    [转载]读书相关,,
  • 原文地址:https://www.cnblogs.com/x54256/p/8094376.html
Copyright © 2011-2022 走看看