zoukankan      html  css  js  c++  java
  • 数据处理的两个基本问题

    计算机是进行数据处理,运算的机器,所以存在两个问题:

    1. 处理的数据的位置
    2. 处理的数据的长度

    这两个问题,必须在机器指令中给出说明(有时候是明确的,有时候是隐式的),否者计算器就无法工作。
    定义的描述性符号:

    • reg(寄存器):ax,bx,cx,dx,ah,al···sp,bp,si,di
    • sreg(段寄存器):ds,ss,cs,es

    bx,si,di和bp

    总结:

    1. 在8086中,只有这四个寄存器可以用在[...]中进行内存寻址。
    2. [...]中,他们可以单个出现,或者以组合形式出现(组合中不能有其他寄存器,但可以有idata)
    3. bp的默认段地址在ss中(和bx,si,di在ds中不同)

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

    数据处理大致可分为三类:读取,写入,运算
    指令执行前,所要处理的数据可以在3个地方:cpu内部,内存,端口
    UTOOLS1560169885399.png

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

    1. 立即数(idata)
      对于直接包含在机器指令中的数据(执行前在cpu的指令缓冲器中),在汇编语言中称为:立即数(idata)
    2. 寄存器
      指令要处理的数据存放在寄存器中,给出对应寄存器名
    3. 段地址(SA)和偏移地址(EA)
      内存中的数据,通过SA+EA给出数据位置

    寻址方式

    定位内存单元的方法,即称为寻址方式
    UTOOLS1561201400616.png

    指令要处理的数据有多长

    前面将到分为隐式给出和显式给出,例如通过寄存器和push,pop等方法就是隐式给出。
    加入不能够明确指定数据长度的化,就需要显式给出数据长度。显式给出数据长度的方法有ptr指令,例如:

    mov word ptr ds:[0], 1
    mov byte ptr ds:[0],1
    inc ...
    add ...

    div指令

    div指令为除法指令
    被除数 / 除数 = 商......余数

    1. 除数:有8位和16位两种(byte和word),在一个reg或者内存单元中
    2. 被除数:默认放在ax或dx和ax中,当除数为8位时,被除数则为16位,默认在ax中存放。当除数位16时,被除数则为32位,dx存放高16位,ax存放低16位。
    3. 结果:除数为8位,则al存储商,ah存储余数。如果除数为16位,则ax存储商,dx存储余数。

    伪指令dd

    有用到过db和dw,例如:

    db 1 ;占1个字节
    dw 1 ;占1个word(2个字节)

    dd用来定义dword(double word,双子)。dd 1则占用2个word(4个字节)。

    dup

    dup是一个用于定义数据的操作符,由编译器识别。和db,dw,dd配合使用,用来进行数据的重复定义。
    例如:
    db 3 dup (0)
    db 3 dup(0,1,2)
    db 3 dup ('abc','ABC')

    实验七

    答案

    assume cs:code, ds:data, es:table
    
    data segment
     db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
     db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
     db '1993', '1994', '1995'
     ; 21年, 4*21=84个字节
    
     dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
     dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
     ; 21年每年总收入,84字节
    
     dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8826
     dw 11542, 14430, 15247, 17800
     ; 21年每年雇佣人数, 42字节
    
    data ends
    
    table segment
     db 21 dup ('year summ ne ?? ')
    table ends
    
    stack segment
     dw 16 dup(0)
    stack ends
    
    code segment
    start:
     mov ax, data
     mov ds, ax
    
     mov ax, table
     mov es, ax
    
     mov bx, 0
     mov si, 0
     mov di, 0
    
     mov cx, 21
    s0:
     mov ax, 0[bx].[0] 
     mov es:[si].[0], ax
     mov ax, 0[bx][2]
     mov es:[si].[2], ax
    
     mov ax, 84[bx].[0]
     mov es:[si].[5], ax
     mov ax, 84[bx][2]
     mov es:[si].[7], ax
    
     mov ax, 168[di].[0]
     mov es:[si].[10], ax
    
     mov ax, es:[si].[5] ; 计算人均收入
     mov dx, es:[si].[7]
     div word ptr es:[si].[10]
     mov es:[si].[13], ax 
    
     add bx, 4
     add si, 10H
     add di, 2
     loop s0
    
     mov ax, 4c00H
     int 21H
    
    code ends
    
    end start

    table段的dup实际定义了21*16个字节,空格也在对应的位置填上了。





  • 相关阅读:
    如何使用Shiro
    ORACLE: 查询(看)表的主键、外键、唯一性约束和索引
    图片下载器类
    关于Android如何创建空文件夹,以及mkdir和mkdirs的区别
    图片二值化 和灰度处理方法
    InputSream转为String
    Bitmap Byte[] 互转
    静默安装/ 普通安装与root权限获取相关
    EventBus 3.0使用相关
    文件存储工具类
  • 原文地址:https://www.cnblogs.com/freesfu/p/11070057.html
Copyright © 2011-2022 走看看