[汇编语言]-第八章 数据处理的两个基本问题

1- 定义描述性符号:reg(表示一个寄存器)和sreg(表示一个段寄存器)

  reg的集合包括: ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di;

  sreg的集合包括:ds, ss, cs, es

2- bx, si, di, bp

(1) 在8086CPU中, 只有这4个寄存器可以用在[...]中来进行内存单元寻址.

  mov ax,[bp]

  mov ax,[bp + si]

  mov ax,[bp + di]

  错误的指令

  mov ax,[ax]

  mov ax,[cx]

  mov ax,[dx]

  mov ax,[ds]

(2) 在[...]中, 这4个寄存器可以单个出现, 或只能以四个组合出现: bx和si, bx和di, bp和si, bp和di

  mov ax,[bp + si]

  mov ax,[bx + si + idata]

  下面指令是错误的

  mov ax,[bx + bp]

  mov ax,[si + di]

(3) 只要在[...]中使用寄存器bp, 而指令中没有显性的给出段地址, 段地址就默认在ss中.

  mov ax,[bp]  (ax) = ( (ss)*16 + (bp) )

  mov ax,[bp + si + idata] (ax) = ( (ss)*16 + (si) + (idata) )

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

  在机器指令这一层来讲, 并不关心数据的值是多少, 而关心指令执行前一刻, 它将要处理的数据所在的位置. 所要处理的数据可以在三个地方: CPU内部, 内存, 端口

  mov bx,[0]  内存, ds:0单元

  mov bx,ax  CPU内部, ax寄存器

  mov bx,1  CPU 内部, 指令缓冲器

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

(1) 立即数(idata): 直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中), 在汇编语言中称为:立即数(idata) 在汇编指令中直接给出

  mov ax,1

  add bx,2000h

  or   bx,00100000b

  mov al,'a' 

(2) 寄存器: 指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名.

  mov ax,bx

  mov ds,ax

  push bx

  mov ds:[0], bx

  push ds

  mov ss, ax

  mov sp,ax

(3) 段地址(SA)和偏移地址(EA): 指令要处理的数据在内存中,在汇编指令中可以用[X]的格式给出EA,SA在某个段寄存器中.

  mov ax,[0]

  mov ax,[di]

  mov ax,[bx + 8]

  mov ax,[bx + si]

  mov ax,[bx + si + 8]

  段地址默认在ds中

  mov ax,[bp]

  mov ax,[bp + 8]

  mov ax,[bp + si]

  mov ax,[bp + si + 8]

  段地址默认在ss中

  存放段地址的寄存器也可以显性给出

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

  mov ax,cs:[bx + si +8]  (ax) = ( (cs)*16 + (bx) + (si)  + 8)

5- 寻址方式: 

  当数据存放在内存中的时候, 我们可以用多种方式给定这个内存单元的偏移地址,这种定位内存单元的方法一般称为寻址方式.

6- 指令处理的数据有多长?

  8086CPU的指令, 可以处理两种尺寸的数据, byte 和 word, 所以在机器指令中要指明, 指令进行的是字操作还是字节操作.

(1) 通过寄存器名指明要处理的数据的尺寸

  下面的指令中, 寄存器指明了指令进行的是操作:

  mov ax, 1

  mov bx,ds:[0]

  mov ds,ax

  mov ds:[0],ax

  inc ax

  add ax,1000

  下面的指令中,寄存器指明了指令进行的是字节操作:

  mov al,1

  mov al,bl

  mov al,ds:[0]

  mov ds:[0], al

  inc al

  add al,100

(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 [bx],2

  下面的指令中,用byte ptr指明了指令访问的内存单元是一个字节单元

  mov byte ptr ds:[0],1

  inc byte ptr [bx]

  inc byte ptr ds:[0]

  add byte ptr [bx],2

  没有寄存器参与的内存单元访问指令中,要word ptr ,byte ptr显性的指明所要访问的内存单元长度,否则CPU无法确认.

  2000:1000 FF FF FF FF ....

  指令:

  mov ax,2000H

  mov ds,ax

  mov byte ptr [1000H],1

  内存内容变为: 2000:1000 01 FF FF FF ....

  而指令:

  mov ax,2000H

  mov ds,ax

  mov word ptr [1000H],1

  内存内容变为: 2000:1000 01 00 FF FF ....

(3) 有些指令是默认的处理单元,如push [1000H]只进行字操作

7- 寻址方式的综合应用

  mov byte ptr [bx + 10H + si],'A'

  mov byte ptr [bx].10H[si],'A' //dec.cp[i]='X' C语言struct描述

  以上指令相同

 

posted @ 2014-02-27 13:02  galoishelley  阅读(330)  评论(0编辑  收藏  举报