汇编第三章
第3章 寄存器(内存访问)
内存中字的存储
8086 cpu 用16位存储一个字
1个字 分为高八位 和 第八位
CPU1个单元 存储8位 所以2个单元 组成一个字
地址大的位高八位 小的位低八位 连续的2个内存单元 组成一个字
DS 数据段地址寄存器
mov bx,1000H
mov ds,bx
mov al,[0]
表示 将1000H 放入bx 然后将bx中的值 作为ds中的值 就是段地址
不能直接将1000H mov 进ds 这是硬件设计的问题 不作讨论了这里
[]表示内存单元
[0] 表示这个内存单元的偏移 地址为 0,上面 段地址为ds中的1000H
然后形成物理地址 10000H 将物理地址为10000H 的内存单元中的值 送入al中
mov [0],al 表示将寄存器的值 送入内存中去
字的传送
8086CPU 16根数据线
一次传送16位数据 就是一个字
mov bx,1000H
mov ds,bx
mov ax,[0] 将[0]处的字形数据 送入ax 高八位和第八位2个内存单元的数据 组合送入ax
mov [0],ax 完成一个字的传送 将此处的内存单元的值 改写 改写2个内存单元的值
sub bx,[0] 表示 bx中的字形数据 与[0] 处的字形数据 相减 然后 赋值给bx
数据段
用mov指令访问内存单元时 可以只使用 偏移地址 段地址在DS中
mov add sub 具有2个操作对象的指令,jmp具有一个指令对象
jmp 寄存器 修改IP
jmp cs:ip 修改CS 和IP
栈,一种特殊访问方式的内存空间。
规则:先进先出 LIFO (last in first out)
CPU提供的栈机制
push pop
push ax 将ax中的数据压入栈
pop ax 将栈顶的数据送入ax
栈操作的是 字 占内存中的2个单元 即2个地址的高低位数据 组成
CPU要找到栈的位置 就必须有他的地址
SS存储 栈的段地址 SP存储栈的偏移地址
任意时刻 SS:SP 指向栈顶
push操作 SP - 2
pop 操作 SP + 2
SP范围0H - FFFFH
栈顶超界将会发生不可预料的错误,CPU只管指令在何处,不知道要执行的指令有多少
尽可能用最大的栈空间 来防止 超过界
栈段
将一组N<=64KB的内存 起始位置为16的倍数的 内存单元当作栈空间来使用
栈顶的变化范围为0-FFFFH 再增加的话 就又会轮为 0-FFFFH 数据就将覆盖原先的数据 所以 最大空间为64KB