汇编总结三
一、字数据在内存中的存储
1.相关基础知识
(1) 内存以字节为单位,划分为若干个单元。
(2) 计算机内数据存-取单位:
     ① 字节 	(8bit)
     ② 字     	(16bit)
     ③ 双字	(32bit)
     ④ 四字	(64bit)
2.字数据的存-取原则:高-高 低-低
即:
① 字数据的低位字节存放在低地址内存单元;
    字数据的高位字节存放在高地址内存单元;
② 取低地址内存单元地址作为字数据地址
二、数据在内存和CPU之间的传送
1.相关基础知识
要在CPU和内存单元之间传送数据,就必须知道内存单元的地址。
2.数据在内存和CPU之间的传送
例
 
执行指令时,默认情况下,8086自动取寄存器DS中的值为内存单元的段地址。
3.小结: DS寄存器
DS: 数据段段寄存器,用于存放数据段的「段地址」
说明:
(1)将一段内存用作数据段,是编程时的一种安排;
(2)  在mov, add, sub等汇编指令中,访问内存单元时,默认情况下,指的是数据段。
三、汇编指令mov, add, sub
1.引例

2.小结: mov指令
(1) 形式

(1) 两个操作数长度要一致。
(2) 关于常数(也叫立即数)
① 不能作为第1个操作数(目的操作数)
② 作第2个操作数(源操作数)时,如果最高位是十六进制的a~f或A~F,前面要加零! 
(3) 两个内存单元之间不能直接传送数据。
(4) 不能使用mov指令修改CS和IP的值。
(5) 关于段寄存器
① 两个段寄存器之间不能直接传送;
② 不能把常数送到段寄存器。
3.小结: add指令
(1) 形式

(2) 注意事项
(1) add指令的操作数不能同时是内存单元
(2) add指令的操作数不能是段寄存器。
4.小结: sub指令
(1) 形式

(2) 注意事项
(1) 两个内存单元不能直接使用sub指令相减。
(2) sub指令的操作数不能是段寄存器。
四、 栈
(1)「栈」的基础知识
「栈」是一个逻辑上的概念。可以将一段内存空间当作「栈」来使用。
两个概念: 栈底、栈顶
两个操作: 入栈、出栈
一个约定: 8086中栈以字为存取单位
栈顶: 最后入栈的字数据所对应的地址单元
栈底:  固定的一端,栈区最高地址单元的前一个单元
入栈:  把数据存入栈
出栈:  从栈取出数据
(2)与「栈」相关的寄存器SS和SP
SS: 栈段段寄存器,用于存放栈段的「段地址」
SP: 栈指针寄存器,用于存放栈顶的偏移地址。
SS:SP对应的物理地址是栈顶的物理地址。
(SS) × 16 + (SP) → 栈顶的物理地址
(3)「栈」操作指令: push和pop
实例

push, pop指令形式

注意事项
在push 内存单元和pop 内存单元中,指令中只需给出「偏移地址」。默认,段地址在DS中。
对8086CPU而言,push和pop的操作:
 入栈和出栈均以字为单元
 操作对象不能是常数
 pop 段寄存器中,段寄存器不能是CS和SS
利用栈「后入先出」特性,使用push和pop指令可以完成一些特殊处理。
以下两种情形会发生「栈顶超界」问题:
 当栈满的时候,再使用push指令入栈;
 当栈空的时候,再使用pop指令出栈;
      8086CPU不会自动考虑栈顶超界,需要程序员在编程设计时自己考虑。栈区长度不同,栈顶超界的具体情形也不同。
五、 关于「段」的小结
(1) 「段」是一个逻辑上的概念。
编程时,可根据需要指定一段内存区用作数据段、代码段或是栈段。
(2) 用作数据段时,要把段地址→DS
     用作栈段时,要把段地址→SS,栈顶偏移地址 → SP
 用作代码段时,段地址→CS,要取的指令偏移地址→IP。但CS和IP的值不能使用mov改变。
(3) 一段内存可以同时用作代码段、数据段、栈段。
     由编程时灵活确定。
(4) 在8086CPU中,每个段的最大长度不能超过64KB。
(因为寄存器是16位的,能表示的地址范围只能是0000H~FFFFH,即0~216-1)
                    
                
                
            
        
浙公网安备 33010602011771号