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

1,前言

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

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

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

  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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值