Loading... # 汇编语言学习(四)~寄存器(内存访问) ## 内存中字的存储 字单元:存放一个字型数据(**16位**)的内存单元,由两个地址连续的内存单元组成 高地址内存单元存放字型数据的高位字节,低地址内存单元存放字型数据的低位字节 **起始地址为N的字单元称为N地址字单元** ## DS和[address] 8086PC中,内存地址由段地址和偏移地址组成,存储在DS寄存器中 下面三条指令将10000H(1000:0)中的数据读到al中 ~~~ mov bx,1000H mov ds,bx mov al,[0] ~~~ **解析:** 使用mov指令将一个内存单元中的内容送进一个寄存器中:**mov 寄存器名,内存单元地址** [...]表示一个内存单元,上述例子中的0表示内存单元的偏移地址,执行指令时8086CPU自动读取ds中的数据为内存单元的段地址 **8086不支持将数据直接送入段寄存器的操作,如ds,所以必须用一个寄存器(bx)来进行中转** 例题: ![47134DB285A9E3777EE7FDD6F8BC5F2F.png](http://xherlock.top/usr/uploads/2022/02/458492952.png) ## mov、add、sub指令 mov: ~~~ mov 寄存器,数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 内存单元,寄存器 mov 段寄存器,寄存器 ~~~ a命令写入指令,t命令执行 * mov 寄存器,寄存器 ![image-20220217150103251.png](http://xherlock.top/usr/uploads/2022/02/310724341.png) ds中的值送入到了寄存器ax中 ## 数据段 这个就相当于计算题,看内存单元存储的数据,下题为例 ![image-20220227193416391.png](http://xherlock.top/usr/uploads/2022/02/1671854941.png) ## 栈 栈是一种具有特殊的访问方式的存储空间:后进先出(LIFO) ## CPU提供的栈机制 8086CPU提供入栈、出栈指令:PUSH、POP,以字为单位进行 **段寄存器SS:存放栈顶段地址;SP:存放栈顶偏移地址** 任何时刻,SS:SP指向栈顶元素 入栈时,栈顶从高地址向低地址方向增长 > PUSH:先改变SP,后向SS:SP处传送 ![F0C881C5DBC480AC50ACFBBA84233E99.png](http://xherlock.top/usr/uploads/2022/02/3927340338.png) > POP:先读取SS:SP处数据,后改变SP ![FEEEE2D638BD297D1C9FDE97B229667A.png](http://xherlock.top/usr/uploads/2022/02/2470311607.png) ![5495F977EC3A716D1852736EBD7F52CC-16459685400671.png](http://xherlock.top/usr/uploads/2022/02/2587216116.png) **注意**:SS:SP指向新的栈顶后,pop前的栈顶元素仍然存在 ## 栈顶超界问题 自己注意……,8086CPU没有能帮你的 栈顶超界很危险:比如在你规定的这段栈空间外存放了其他重要数据和代码,可能会由于入栈出栈时不小心意外改写这些数据 `注意:SS属于段寄存器,不能直接送入数据,需要其他寄存器作为中转站` 最后修改:2022 年 02 月 28 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏