blubiu

My Love

上网不网恋,简直浪费电.


汇编语言笔记(六)--处理数据的两个基本问题


前言:

处理数据的两个基本问题。


目录:


寄存器 bx、si、di和bp:

这几个寄存器在前面的文章中已经介绍过了,现在来说说他的使用方法。

在 8086CPU(16位,x86框架)中,

只有这4个寄存器可以在 [] 中括号中进行内存单元的寻址,

比如,如下指令是都是正确的

mov ax,[bx]

mov ax,[bx+si]

mov ax,[bx+di]

mov ax,[bp]

mov ax,[bp+si]

mov ax,[bp+di]

ax、cx、dx、ds 寄存器不能用在 [] 中进行内存单元的寻址

比如下面指令都是错误的:

mov ax,[cx]

mov ax,[ax]

mov ax,[dx]

mov ax,[ds]

[] 中,这4个寄存器可以单个出现,或者只能以4种组合出现,

比如:

bx 和 sibx 和 dibp 和 sibp 和 di

比如下面指令都是正确的:

mov ax,[bx]

mov ax,[si]

mov ax,[di]

mov ax,[bp]

mov ax,[bx+si]

mov ax,[bx+di]

mov ax,[bp+si]

mov ax,[bp+di]

mov ax,[bx+si+idata]

mov ax,[bx+di+idata]

mov ax,[bp+si+idata]

mov ax,[bp+di+idata]

而下面的指令都是错误的:

mov ax,[bx+bp]

mov ax,[si+di]

只要在 [] 中使用寄存器 bp ,而指令中没有显性地给出段地址,

段地址就默认在 SS 中,

比如下面指令:

mov ax,[bp]   ----------> 含义:(ax)=((ss)*16+(bp))

mov ax,[bp+idata] ------> 含义:(ax)=((ss)*16+(bp)+idata)

mov ax,[bp+si] ---------> 含义:(ax)=((ss)*16+(bp)+(si))

mov ax,[bp+si+idata] ---> 含义:(ax)=((ss)*16+(bp)+(si)+idata)

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

绝大部分机器指令都是进行数据处理的指令 ,

大致可以分为3类:读取、写入、运算

机器指令并不关心数据的值是多少,只关心要处理的数据在什么位置,

要处理的数据可以在 3 个地方:CPU内部、内存、端口

比如表中所列的指令:

images


数据位置的表达:

在汇编语言中,用3个概念来表达数据的位置

1. 立即数(idata)

对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲区中),

在汇编语言中成为:立即数(idata),在汇编指令中直接给出 。

例如:

mov ax,1

add bx,2000h

or bx,00010000b

mov a1,'a'

2. 寄存器

要处理的数据在寄存器中,

例如:

mov ax,bx

mov ds,ax

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

在汇编指令中可用 [X] 的格式给出 EASA 在某个段寄存器中,

存放段地址的寄存器可以是默认的,比如

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,es:[bx] ------------> 含义:(ax)=((es)*16+(bx))

mov ax,ss:[bx+si] ---------> 含义:(ax)=((ss)*16+(bx)+(si))

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

寻址方式:

当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,

这种定位内存单元的方法一般被称为寻址方法

如下表:

images


指令要处理的数据有多长:

8086CPU 的指令,看看呀处理两种尺寸的数据,byteword

所以在机器指令中要指明,指令进行的是 操作还是 字节 操作


在有寄存器的情况下

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

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

mov ax,1

mov bx,ds:[0]

mov ds,ax

mov ds:[0],ax

inc ax

add ax,1000

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

mov a1,1

mov a1,b1

mov a1,ds;[0]

mov ds:[0],a1

inc a1

add a1,100

在没有寄存器的情况下

在没有寄存器的情况下,用操作符 X ptr 指明内存单元的长度,

X 在汇编指令中可以为 wordbyte

下面指令中,用 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 无法得知所要访问的单元是字单元还是字节单元。


总结

处理数据的两个基本问题。