1、立即数不能与段寄存器相遇。(CS,DS,SS,ES)
段寄存器不能作运算
mov ds,1000 ;错误,不直接传送
mov ax,3
mov ds,ax
add ds,ax ;错误,不能运算
mov bx,1000
mov ds,bx ;通过bx来传送
mov al,[0]
注意:传送内存中的内容时,自动以DS为数据段地址,上例DS=1000H,偏移量为0的内存地址中的内容传给al
段寄存器不能作运算
mov ds,1000 ;错误,不直接传送
mov ax,3
mov ds,ax
add ds,ax ;错误,不能运算
mov bx,1000
mov ds,bx ;通过bx来传送
mov al,[0]
注意:传送内存中的内容时,自动以DS为数据段地址,上例DS=1000H,偏移量为0的内存地址中的内容传给al
CS是代码的段地址,DS是数据的段地址。
2、mov,add,sub指令形式
目前,两元指令都必须有一个是寄存器。段寄存器不能接受立即数,且不能进行运算。
3、数据段:将内存中长度为N(<=64K)、地址连续、起始地址为16的倍数的内在单元专门存储数据的内存空间
4、栈:后进先出
SS:SP SS保存栈的段,SP保存栈段区的偏移量。SS:SP始终指向栈顶。
压栈:第一步,向上退两字节sp=sp-2;第二步,压入数据push ax;
出栈:与上相反,第一步先弹出数据pop ax 第二步下移指针sp=sp+2
当空栈时,指针(栈顶)将指向栈底的下一个内存单元。
5、栈越界
CPU只认SS:SP,即它只知道这个栈顶的位置,其它的,它就是一个傻瓜。因此它没法判断栈是不是越过“人为划定”的栈段。
那么我们通过SS:SP,就知道两点:一是栈的最上部(栈段起始),二是栈的指针SP(栈顶)
无论SP怎么增加,或者无限增加,它一直在栈段中循环(进位后,最终变成0,或者再增加,反正没负数,就一直在内)
6、栈指令:pop,push
它只有一个操作数,寄存器,段寄存器,或内存单元。
7、栈段
同数据段、代码码一样,它的大小都是人为规划,都是小于或等于64K(0-FFFF)