zoukankan      html  css  js  c++  java
  • 数据处理问题

    1、处理的数据在什么地方
    2、要处理的数据有多长
    描述性符号:regsreg
    reg:表示寄存器;sreg:表示段寄存器
    reg:{ ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di }
    sreg:{ ds、ss、cs、es }
    bp:基址指针寄存器

    8086CPU 只有4个寄存器可以用在 [ ... ] 中来进行内存单元的寻址;
    mov ax , [bx]
    mov ax , [bx+si]
    mov ax , [bx+di]
    mob ax , [bp]
    mov ax , [bp+si]
    mov ax , [bp+di]
    这些组合中,bx+bp si+di 组合是不允许的,其他可以随便组合还可以加上idata,如果[ ... ]中用到了bp,默认的段地址就是 ss 寄存器
    mov ax , [bp]
    mov ax , [bp+idata]
    mov ax , [bp+si]
    mov ax , [bp+si+idata]
    ( ax )=( ( ss )*16+( bp ) )
    ( ax )=( ( ss )*16+( bp )+idata )
    ( ax )=( ( ss )*16+( bp ) )
    ( ax )=( ( ss )*16+( bp )+( si )+idata )




    机器指令处理的数据所在位置寄存器
      指令都是进行数据处理,大致可分为三类:读取、写入、运算;机器指令关心的是执行指令前数据所在的位置
      所要处理的数据可以在三个地方:CPU内部、内存、端口




    汇编语言中数据位置的表达
    1、立即数(idata):对于直接包含在机器指令中的数据(执行前在CPU指令缓冲器中)
    eg:mov ax , 2000h
    2、寄存器
    3、段地址(SA)和偏移地址(EA)





    寻址方式
      当数据存放在内存中时,可以用多种方式给定这个内存单元的偏移地址,这种定位内存单元的方法一般称为寻址方式。
    寻址方式 含义 名称 常用格式
    [idata] EA=idata ; SA=(ds) 直接寻址 [idata]
    [bx]
    [si]
    [di]
    [bp]
    EA=(bx);SA=(ds)
    EA=(si);SA=(ds)
    EA=(di);SA=(ds)
    EA=(bp);SA=(ss)
    寄存器间接寻址 [bx]
    [bx+idata]
    [si+idata]
    [di+idata]
    [bp+idata]
    EA=(bx)+idata;SA=(ds)
    EA=(si)+idata;SA=(ds)
    EA=(di)+idata;SA=(ds)
    EA=(bp)+idata;SA=(ss)
    寄存器相对寻址 用于结构体:
    [bx].idata
    用于数组:
    idata[si] , idata[di]
    用于二维数组:
    [bx][idata]([bx+idata])
    [bx+si]
    [bx+di]
    [bp+si]
    [bp+di]
    EA=(bx)+(si);SA=(ds)
    EA=(bx)+(di);SA=(ds)
    EA=(bp)+(si);SA=(ss)
    EA=(bp)+(di);SA=(ss)
    基址变址寻址 用于二维数组:
    [bx][si]
    [bx+si+idata]
    [bx+di+idata]
    [bp+si+idata]
    [bp+di+idata]
    EA=(bx)+(si)+idata;SA=(ds)
    EA=(bx)+(di)+idata;SA=(ds)
    EA=(bp)+(si)+idata;SA=(ss)
    EA=(bp)+(di)+idata;SA=(ss)
    相对基址变址寻址 用于表格(结构)中的数组项:
    [bx].idata[si]
    用于二维数组:
    idata[bx][si]





    指令要操作的数据长度
    1、指令可以处理两种长度的数据,byte 和 word (eg:al、ax)
    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 [2] , 2
    ; byte ptr 指明指令访问的内存单元是一个 字节单元
    mov byte ptr ds:[0] , 1
    inc byte ptr [bx]
    inc byte ptr ds:[0]
    add byte ptr [bx] , 2
    3、有些指令只能进行字操作  (eg:push、pop)





    div 指令
    1、除数:有8位和16位两种,存放在一个寄存器或内存单元中。
    2、被除数:默认存放在 AX 或 DX 和 AX 中,如果除数为8位,被除数则为16位,默认在 AX 中存放;如果除数为16位,被除数则为32位,在 DX 和 AX 中存放,DX 存放高16位,AX 存放低16位。
    3、结果:如果除数为8位,则 AL 存储除法操作的商,AH 存储除法操作的余数;如果除数为16位,则 AX 存储除法操作的商,DX 存储除法操作的余数。

    ; 利用除法指令计算100001/100
    ; 因为100001大于65535,只能用 dx 和 ax 两个寄存器存放。除数100可以用一个8位寄存器,但是被除数32位,所以只能用16位寄存器

    ; 100001十六进制表示是:186A1H

    mov dx , 1h                ; dx存放高16位
    mov ax , 86A1h         ; ax存放低16位
    mov bx , 100
    div bx                        ;最终结果保存在AX和DX中
      //AX 存放商,DX存放余数,最后结果:1000 ... 1
    ; 利用除法指令计算1001/100
    ;被除数1001可以用ax寄存器来存放,100可以用8位寄存器存放
    mov ax , 1001
    mov bl , 100
    div bl               ; 结果存放在ax中
      //结果为:0A ... 01( 10...1 )





    伪指令 dd

    dd:dword(double world , 双字)型数据。
    data segment
        db 1                     ; 01H                数据在data:0处,占一个字节
        dw 1                   ;0001H            数据在data:1处,占一个字
        dd 1                   ;00000001H,数据在data:3处,占两个字
    data ends






    dup
    操作符,在汇编语言中和 db、dw、dd 等一样,是由编译器识别处理的符号。它是和 db、dw、dd 等数据定义伪指令配合使用的。用来进行数据的重复
    定义数据类型  重复的次数  dup  (重复的数据) 
    db 3 dup (0)            ;定义了3个字节,它们的值都是0,相当于db 0 , 0 , 0
    db 3 dup (0 ,1 ,2)     ; 定义了9个字节,它们是0,1,2,0,1,2,0,1,2,相当于db 0,1,2,0,1,2,0,1,2
    db 3 dup ('abc' , 'ABC')    ; 18个字节,db 'abcABCabcABCabcABC'





  • 相关阅读:
    day06作业
    day04_ATM项目说明书
    ATM+购物车基本思路流程
    装饰器、迭代器、生成器、递归、匿名函数、面向过程编程、三元表达式6
    day05函数部分
    自制七段数码管源码
    字符串格式化
    字符串表示
    格式化输出
    python入门——列表类型、元组、字典类型
  • 原文地址:https://www.cnblogs.com/meihao1203/p/7546059.html
Copyright © 2011-2022 走看看