前言:
处理数据的两个基本问题。
目录:
寄存器 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 和 si 、bx 和 di 、bp 和 si 、bp 和 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内部、内存、端口
比如表中所列的指令:
数据位置的表达:
在汇编语言中,用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] 的格式给出 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,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)
寻址方式:
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,
这种定位内存单元的方法一般被称为寻址方法
如下表:
指令要处理的数据有多长:
8086CPU 的指令,看看呀处理两种尺寸的数据,byte
和 word
,
所以在机器指令中要指明,指令进行的是 字 操作还是 字节 操作
在有寄存器的情况下
通过寄存器指明要处理的数据尺寸
下面指令中。寄存器指明了指令进行的是 字 操作 ,
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 在汇编指令中可以为 word 或 byte
下面指令中,用 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 无法得知所要访问的单元是字单元还是字节单元。
总结
处理数据的两个基本问题。