zoukankan      html  css  js  c++  java
  • 汇编笔记_第八章


    title: 汇编笔记_第八章
    date: 2018-12-27 20:04:33
    tags:

    • 笔记
      categories:
    • 汇编语言

    数据处理的两个基本问题

    两个描述性符号

    • 寄存器reg:包括ax,bx,cx,dx,sp,bp,si,di
    • 段寄存器sreg:包括ds,ss,cs,es

    bx,si,di,bp

    • 8086CPU中只有这四个寄存器可以用[...]来寻址,像mov ax,[cx]就是错误的;
    • [...]中,这四个寄存器可以的那个出现,或 只能以四种组合出现:bx和si、bx和di、bp和si 以及 bp和dimov ax,[bx+bp]是错误的;
    • 只要在[...]中使用寄存器 bp,而指令中没有显示的给出段地址,段地址就默认在 ss中,比如:mov ax,[bp+si+idata]的含义是:(ax)=((ss)*16+(bp)+(si)+idata)

    机器指令处理的数据所在的位置

    • 数据的处理可分为三类:读取、写入、运算
    • 机器指令并不关心数据的值,而关心数据所在的位置:cpu内部、内存、端口;

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

    汇编语言中用三种概念来表达数据的位置:立即数(idata)寄存器段地址(SA)和偏移地址(EA)

    寻址方式

    寻址方式 含义 名称 常用格式举例
    [idata] SA=(ds);EA=idata 直接寻址 [idata]
    [bx]
    [si]
    [di]
    [bp]
    SA=(ds);EA=(bx)
    SA=(ds);EA=(si)
    SA=(ds);EA=(di)
    SA=(ss);EA=(bp)
    寄存器间接寻址 [bx]
    [bx+idata]
    [si+idata]
    [di+idata]
    [bp+idata]
    SA=(ds);EA=(bx)+idata
    SA=(ds);EA=(si)+idata
    SA=(ds);EA=(di)+idata
    SA=(ss);EA=(bp)+idata
    寄存器相对寻址 用于结构体:[bx].idata;
    用于数组:idata[si],idata[di];
    用于二维数组:[bx][idata]
    [bx+si]
    [bx+di]
    [bp+si]
    [bp+di]
    SA=(ds);EA=(bx)+(si)
    SA=(ds);EA=(bx)+(di)
    SA=(ss);EA=(bp)+(si)
    SA=(ss);EA=(bp)+(di)
    基址变址寻址 用于二维数组:[bx][si]
    [bx+si+idata]
    [bx+di+idata]
    [bp+si+idata]
    [bp+di+idata]
    SA=(ds);EA=(bx)+(si)+idata
    SA=(ds);EA=(bx)+(di)+idata
    SA=(ss);EA=(bp)+(si)+idata
    SA=(ss);EA=(bp)+(di)+idata
    相对基址变址寻址 用于表格(结构)中的数据项:[bx].idata[si]
    用于二位数组:idata[bx][si]

    指令处理的数据的长度

    • 8086CPU的指令,可以处理两种长度的数据:byteword

    指明方式

    寄存器指明

    mov al,ds:[0]   //按字节操作
    mov ax,ds:[0]   //按字操作
    

    用操作符 X ptr 指明(X=word/byte)

    add word ptr [bx],2     //按字操作
    mov byte ptr ds:[0],1   //按字节操作
    

    其他方式

    有些指令默认是访问字单元还是字节单元,例如:push 指令只进行字操作;

    寻址方式的综合应用

    一般来说,可以用 [bx+idata+si]的方式来访问结构体中的数据;

    • 用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每一个元素;

    • 汇编的写法:[bx].idata , [bx].idata[si]

    • 例如c中: dec.cp[i],dec指明了结构体变量的的地址;cp指明了数据项cp的地址;i用来定位cp中的每一个字符;汇编语言:bx.10h[si]

    div指令

    • div 是出除法指令;

    • 除数:在寄存器或内存单元中;

    • 被除数:(默认)放在AX或DX和AX中;

    • 结果:8位的商在AL中,余数在AH中;16位的商在AX中,余数在DX中

    • div指令格式:div regdiv 内存单元

    • div byte ptr ds:[0]
      含义:
      (al)=(ax)/((ds)*16+0)的商
      (al)=(ax)/((ds)*16+0)的余数

    • div word ptr es:[0]
      含义:
      (ax)=[(dx)*10000H+(ax)]/((es)*16+0)的商
      (dx)=[(dx)*10000H+(ax)]/((es)*16+0)的余数

    伪指令dd

    dd是用来定义 dword(double word双字) 型数据的;

    dup

    • dup是一个操作符,同db,dw,dd一样由编译器识别处理;
    • 和db,dw,dd等伪指令配合使用,用来 数据的重复
    dup的使用格式:
    db 重复的次数 dup (重复的字节型数据)
    dw 重复的次数 dup (重复的字型数据)
    dd 重复的次数 dup (重复的双字数据)
    
    eg:
    db 3 dup (0,1,2)
    相当于:
    db 0,1,2,0,1,2,0,1,2
    

    https://www.cnblogs.com/31415926535x/p/10187504.html
    (end)

  • 相关阅读:
    基于接口而非实现编程 和 依赖注入
    程序出错该返回啥?
    js关于for循环实现线程休眠效果的问题
    预祝1024节日快乐!
    20201101_Python的虚拟环境问题
    机器学习——dbscan密度聚类
    公司里使用gitlab管理项目
    MYSQL集群MHA架构实现手册
    vbox导入虚拟电脑网卡MAC问题,MacOS 通过virtualbox安装的centos7虚拟机不能上网解决
    MySQL误操作后如何快速回滚(转)
  • 原文地址:https://www.cnblogs.com/31415926535x/p/10187504.html
Copyright © 2011-2022 走看看