比如我们常用的push指令: 5.1 push压入立即数 当运行在实模式下时: 如果立即数是8位,会将其扩展为16位,然后再将sp-2 如果立即数是16位,则将sp-2 如果立即数是32位,则将sp- 4 当运行在保护模式下时: 如果立即数是8位,会将其扩展为32位,然后再将sp-4 如果立即数是16位,则将sp-2 如果立即数是32位,则将sp-4 5.2 push压入段寄存器 当运行在实模式下时, CPU压入2字节,然后再将sp-2。 5.4 push压入通用寄存器或内存 push ax push eax push word [0x1234] push dword [0x1234] 无论实模式或者保护模式: 如果操作数是16位,sp
push, sp-2 pop, sp+2 cmp cmp 指令在功能上和 sub 指令相同,唯一不同之处在于,cmp 指令仅仅根据计算的结果设置相应的标志位,而不保留计算结果,因此也就不会改变两个操作数的原有内容
段寄存器SS 存放栈顶的段地址 寄存器SP 存放栈顶的偏移地址 任意时刻,SS:SP指向栈顶元素 push ax 1 sp=sp-2 2 将ax中的内容送入SS:SP指向的内存单元,SS:SP此时指向新栈顶
push ax的执行,由下面两步之行: SP=SP-2,SS:SP指向的内存单元处,以当前栈顶前面的单元为新的栈顶 将ax中的内容送入SS:SP指向的内存单元出,SS:SP此时指向新栈顶。 (2)push指令的执行步骤: SP=SP-2 向SS:SP指向的字单元中送入数据 POP指令的执行步骤: 从SS:SP指向的字单元中读取数据 SP=SP+2 (4)任意时刻,SS:SP指向栈顶元素
rtos_wait(u8 time) { static u8 i; task_time[task_id] = time; //保存当前任务时间 //保存当前断点 并把SP=SP
所以,要在执行push ax之前,将SS:SP指向10002H(可以设SS=1000H,SP=0002H),这样,在执行push ax的时候,CPU先将SP=SP-2,使得SS:SP指向10000H,再将
(1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶 (2)将ax中的内容送入 SS:SP指向的内存单元处,SS:SP 此时指向新栈顶。
Doubleword onto Stack) 指令格式: PUSH Reg/Mem PUSH Imm ;80286+ 一个字进栈,系统自动完成两步操作:SP←SP a、POP(Pop Word or Doubleword off Stack) 指令格式:POP Reg/Mem 弹出一个字,系统自动完成两步操作:操作数←(SP),SP←SP-2;
(2)push指令的执行步骤:① SP=SP-2;② 向 SS:SP 指向的字单元中送入数据。 (3)pop指令的执行步骤:① 从SS:SP 指向的字单元中读取数据;② SP=SP+2。
push指令的执行步骤: 1)SP=SP-2 2)向SS:SP指向的字单元中送入数据。 pop指令的执行步骤: 1)从SS:SP指向的字单元中读取数据 2)SP=SP-2。
0010h mov ax,001ah mov bx,001bh push ax push bx pop ax pop bx 以上代码 我们执行之后发现交换了ax和bx的值 push ax sp = sp
操作: SP=SP-2 WORD PTR SS:[SP]=OP 补充说明:WORD PTR SS:[SP]表示SS:SP所指向的字。
(3)pop 指令的执行步骤: 从 SS:SP 指向的字单元中读取数据; SP=SP-2; (4)任意时刻,SS:SP 指向栈顶元素。 (5)8086CPU 只记录栈顶,栈空间的大小我们要自己管理。
代表寄存器或存储单元地址 功能:将寄存器或存储单元中的一个字压入堆栈 操作: ■ “先减后入”: SP-1→SP, 字高位→[SP] SP-1→SP, 字低位→[SP] 结果:SP
数据段 栈 push ax:将ax放入栈内存中 sp =sp-2 ss:sp 指向新地址 pop ax:从栈内存取数据到ax 1,cup如何知道某段内存是栈内存?
(2) 格式:PUSHF POPF 功能:PUSHF将标志寄存器低16位内容压入堆栈,SP←SP-2。POPF将当前栈顶一个字传送到标志寄存器低16位中,SP←SP+2。