本文已参与「新人创作礼」活动,一起开启掘金创作之路。 目录
两个基本问题
(1)处理的数据在什么地方
(2)要处理的数据有多长
寄存器集合
reg表示一个寄存器
sreg表示一个段寄存器
8086CPU中,只有这四个寄存器能通过[...]进行内存单元寻址
[...]中这四个寄存器可以单个出现,或只能以四种组合出现
bx和si
bx和di
bp和si
bp和di
正确用法
[...]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中
bp一定意义上就是帮sp减轻负担
8.2机器指令处理的数据所在位置
处理数据的三大分类:
读取
写入
运算
机器指令这一层不关心数据的值是多少,而关心指令执行前一刻,将要处理的数据所在的位置
指令在执行前,索要处理的数据可以在三个地方:
CPU内部、内存、端口
eg:
汇编语言中如何表达数据的位置
一般来说,偏移地址中不能在未指明段地址时存放常数,但0比较特殊,表示没有偏移地址。
如果直接mov ax,[9]就会报错
也可通过显性给出段地址强制给[bx]、[bp]指定段寄存器
寻址方式小结
直接寻址演示过程
1.读取指令
cs ip寄存器中的值放入地址加法器
通过地址总线传送地址,到代码段中读取指令
将指令拿下来,通过数据总线传入指令缓冲寄存器中
2.直接寻址
CPU执行指令
将ds和000E放入地址加法器中
从对应地址中读取数值内容
从内存中读取数据之后,通过数据总线传入ax中
寄存器间接寻址
与直接寻址不同处
CPU执行指令
将ds和寄存器中的值放入地址加法器中
寄存器相对寻址
与直接寻址不同处
CPU执行指令
将ds和寄存器和指令缓冲寄存器中的直接数放入地址加法器
基址变址和相对基址变址寻址自行衍生(依葫芦画瓢)
8.5指令要处理的数据有多长?
(1)通过寄存器名指明要处理的数据的尺寸
寄存器指明指令进行字操作
(2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word和byte
强调为字型数据
强调为字节型数据
用word ptr和byte ptr显性地指明索要访问的内存单元的长度
(3)其他方法
有些指令默认了访问的是字单元还是字节单元
比如push [1000h]就不用指明访问的是字单元还是字节单元
因为push指令只进行字操作