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


    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字单元中

  • 相关阅读:
    Top 10 Product Manager Skills To Boost Your Resume In 2021
    大数据知识梳理
    B端产品如何设计权限系统?
    华三盒式交换机MAC、ARP、Route性能表项参数查询
    中了传说中的挖矿病毒
    SqlServer 2019 事务日志传送
    docker中生成的pdf中文是方框的解决方案
    The Live Editor is unable to run in the current system configuration
    2021 面试题大纲
    五分钟搞定Docker安装ElasticSearch
  • 原文地址:https://www.cnblogs.com/x54256/p/8094376.html
Copyright © 2020-2023  润新知