小白的汇编之路(八)----数据处理的两个基本问题

tech2022-10-03  100

1,前言

学习王爽老师的《汇编语言》一书所做的记录

2,数据处理的两个基本问题

涉及到数据处理、运算,就不可避免的需要解决两个问题:

处理的数据在什么地方要处理的数据有多长

2.1,bx,si,di,bp

在8086CPU中,只有这4个寄存器能用在[……]中进行内存单元的寻址。

但要注意它们之间的搭配

# 正确的搭配 mov ax,[bx] mov ax,[bx+si] mov ax,[bx+di] mov ax,[bp] mov ax,[bp+si] mov ax,[bp+di] # 错误的搭配 mov ax,[cx] mov ax,[ax] mov ax,[dx] mov ax,[ds] # si和di不能一起联用 # bx和bp不能一起联用 # 例如下列写法是错误的 mov ax,[si+di] mov ax,[bx+bp] # 这些指令是正确的 mov ax,[bx+si+idata] mov ax,[bx+di+idata] mov ax,[bp+si+idata] mov ax,[bp+di+idata]

在[……]中使用bp的话,若是没有显式的给出段地址的话,段地址默认就在ss中

2.2,存放位置

2.2.1,数据存放位置

对于机器指令来说,它并不关心它即将处理的数据的值是多少,而关心在指令执行前一刻,数据存放在哪里。

指令在执行前,所要处理的数据可以在3个地方:

CPU内部内存端口

2.2.2,数据存放位置的表达

立即数

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

mov ax,1 add bx,2000h

寄存器

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

mov ax,bx mov ds,ax push bx pop bx

段地址和偏移地址

# 注意这里的段地址默认是存在ds寄存器中 mov ax,[0] mov ax,[di] mov ax,[bx+8] # 这里的段地址默认是存在ss寄存器中 mov ax,[bp] mov ax,[bp+di] mov ax,[bp+si+8]

注意:存放段地址的寄存器也可以显式的给出

mov ax,ds:[bx] mov ax,ds:[bp] mov ax,ss:[bx+si]

2.3,数据长度

8086CPU的指令可以处理两种尺寸的数据:byte和word

在编写指令的时候,需要指明指令进行的是字操作还是字节操作

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

mov ax,1 mov bx,ds:[0] ......

(2)用操作符X ptr指明内存单元的长度,X可以是byte或者word

# 把数据1存放到ds:[0]指向的字单元中 mov word ptr ds:[0],1 # 把数据1存放到ds:[0]指向的字节单元中 mov byte ptr ds:[0],1 # 让ds:[0]指向的字单元中存放的数据加一 inc word ptr ds:[0] # 让ds:[0]指向的字节单元中存放的数据加一 inc byte ptr ds:[0]

在没有寄存器参与的内存单元访问指令中,用X ptr显式的指明所要访问的内存单元的长度是很有必要的,因为CPU需要知道所要访问的是字单元还是字节单元

(3)其他指令

有些指令默认了要访问的是字节单元还是字单元

# 例如push指令只进行字操作 push [1000H]
最新回复(0)