汇编语言笔记08-数据处理的两个基本问题(阶段总结)

 

转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne

 

 

数据处理涉及到两个基本问题:

(1). 处理的数据在什么地方?(内存,寄存器,端口还是指令缓冲器)

(2).要处理的数据有多长?(byte, word, dword)

   

寄存器总结

  1. 寄存器 regaxbxcxdxahal、bh、bl、ch、cl、dh、dl、sp、bp、si、di;
  2. 段寄存器sregdssscses.

   

bxsidibp

  1. […]中,这4个寄存器可以单个 出现,或者只能以4中组合出现(bx/bp+si/di)bxsibxdibpsibpdi

    正确指令:

    错误指令:

  2. [...]中使用bp,默认的段地址是ss中。

    但是可以指定段寄存器:

    mov ax, ds:[bp] ; (ax)=((ds)*16+(bp))

    mov ax, es:[bx] ; (ax)=((es)*16+(bx))

   

第一个基本问题:处理的数据在什么地方?

  1. 绝大部分机器指令都是进行数据处理的指令,处理大致分为3类:读取、写入、运算。而所要处理的数据可以在3个地方:CPU内部、内存和端口。
  2. 数据的位置:

类型

位置

示例

立即数(idata)

直接包含在机器指令的数据(CPU的指令缓冲器)

mov ax,1

寄存器

寄存器中

mov ax, bx

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

内存中

mov ax, ds:[0]

   

总结:寻址方式(超全版本)

   

第二个基本问题:要处理的数据有多长?

  1. 8086CPU的处理能力

    8086CPU的指令,可以处理两种尺寸数据:byteword。所以可分为:字操作和字节操作。

  2. 指令如何指明是字操作还是字节操作?

方法

示例

通过寄存器指明要处理的数据的尺寸

  

X ptr指明内存单元的长度

  

指令的默认方式(push/pop默认字操作)

push [1000H]

pop [1000H]

   

C语言和汇编语言的寻址方式(对比)

  • 问题描述:关于DEC公司的一条记录(1982)如下:

公司名称:DEC

总裁姓名:Ken Olsen

名:137

入:40(40亿)

著名产品:PDP

任务:公司到了1988年,DEC公司的信息发生了如下变化:

(1) Ken OSen在富豪榜上的排名上升至38位;

(2) DEC的收入增加了70亿美元;

(3) 该公司的著名产品已变为VAX系列计算机

  • 数据存放示意

  • C语言的处理方式

  • Assembly的处理方式

  • 重点:AssemblyC的处理方式类比

    类比:

    • 8086CPU提供了[bx+si+idata]的寻址方式可以方便处理结构化数据。
    • bx定位整个结构体,idata定位结构体重的某一个数据项,用si定位数组项中的每一个元素。所以:[bx].idata[bx].idata[si]更加优雅(C语言很像)
    • dec.cp[i]对应于bx.10h[si]。

   

div指令

示例:

   

伪指令 db dw dd

  1. 含义

    date segment

    db 1

    dw 1

    dd 1

    date ends

    第一个数据位01H,在data:0处,占1个字节。

    第二个数据位0001H,在data:1处,占2个字节。

    第三个数据位00000001H,在data:3处,占4个字节。

  2. 应用:用div计算data段中第一个数据除以第二个数据后的结构,商存在第三个数据的存储单元中。

    assume ds:data, cs:code

       

    data segment

    dd 1000001

    dw 100

    dw 0

    data ends

       

    code segment

    start: mov ax, data

    mov dx, ax

    mov ax, ds:[0]

    mov dx, ds:[2]

    div word ptr ds:[4]

    mov ds:[6], ax

    code ends

    end start

   

操作符dup

  1. 操作符dup是由编译器识别处理的。它和db、dw、dd等数据定义伪指令配合使用。
  2. 用法

    db/dw/dd 重复次数 dup (重复的数据)

  3. 示例

db 3 dup (0)

db 0 0 0

db 3 dup (0,1,2)

db 0,1,2,0,1,2,0,1,2

db 3 dup ('abc', 'ABC')

db 'abcABCabcABCabcABC'

  1. 如何定义200个字节的栈端

    stack segment

    db 200 dup (0)

    stack end

posted @ 2012-10-21 00:46  dennis_fan  阅读(565)  评论(0编辑  收藏  举报