学习王爽老师的《汇编语言》一书所做的记录
涉及到数据处理、运算,就不可避免的需要解决两个问题:
处理的数据在什么地方要处理的数据有多长在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中
对于机器指令来说,它并不关心它即将处理的数据的值是多少,而关心在指令执行前一刻,数据存放在哪里。
指令在执行前,所要处理的数据可以在3个地方:
CPU内部内存端口立即数
对于直接包含在机器指令中的数据(执行前在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]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]