汇编里的"PUSH"和"POP"起了啥功能,,谁能用通俗点的话告诉我吗??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编里的"PUSH"和"POP"起了啥功能,,谁能用通俗点的话告诉我吗??相关的知识,希望对你有一定的参考价值。

PUSH是不是起到分组把寄存器里的数据保存起来啊?
如:
EAX=1,EBX=2,ECX=3,PUSH 1
EAX=11,EBX=12,ECX=13,PUSH 11
结果是不是下面的啊?
POP 1,,就是EAX=1,EBX=2,ECX=3,
POP 11,,就是EAX=11,EBX=12,ECX=13,

SH”指令的功能是实现将一个寄存器中的数据压入栈操作。PUSH的操作过程是: (SP)(SP)-2,((SP))<-OPRD。先修改堆栈指针SP(压入时为自动减2),然后,将指定的操作数送入新的栈顶位置。

汇编里的"POP"指令的功能是实现将一个寄存器中的数据弹出栈操作。POP的操作过程是:将堆栈段中当前SS:SP所指的字内容弹出到某个寄存器或段寄存器或内存单元。再 SP←SP+2。

扩展资料:

PUSH和POP指令对状态标志位没有影响。"PUSH"指令每进行一次压入操作,都压入一个字(16位)。OPRD为16位(字)操作数,可以是寄存器或存储器操作数。

若段描述符中的D\B位为1,则栈操作将使用ESP寄存器。先将ESP数值减去栈数据的长度 sub esp,register's long.(sizeof register)。再将数据压入栈:mov ss:[esp],register。

若段描述符中的D\B位为0,则栈操作将使用SP寄存器。先将SP数值减去栈数据的长度 sub sp,register's long.(sizeof register)再将数据压入栈:mov ss:[sp],register。

参考技术A 进出栈,栈是FILO(first in last out),先进后出
也就是把寄存器里的数据临时保存一下,相当与一个仓库
不是你说的那样子

假设eax=4,ebx=5
push eax
push ebx
pop eax
pop ebx
结果eax=5 ebx=4(体现了先进后出)本回答被提问者采纳
参考技术B 堆栈是一端固定,另一端变化的特殊存储空间,你可以把它想像成装固体的桶,桶底(栈底)固定,桶里面所装固体的最高处定义为桶顶(栈顶)。如果什么都没有装时,桶顶和桶底相等,当装一层沙子后,桶顶升高(即栈顶地址-2,相当于入栈PUSH),再装一层水泥,桶顶再次升高,(即栈顶地址又-2),当你往出倒东西的时候,你先倒出最上层的水泥,桶顶下降(即栈顶地址+2,相当出栈POP),然后你才能倒出沙子。所以堆栈是先进来的先出去。 参考技术C push和pop是堆栈操作指令,push [reg]/[num] 是将reg寄存器中的值或是数字num压入堆栈中,而pop [reg]是将堆栈栈顶的值弹出到reg寄存器中,并将这个值从堆栈中删去.
堆栈可以看成是一个数组,但只能在栈顶(可以认为是数组的一端)对数据进行操作,起临时保存数据的作用,32位汇编中,ss:esp指向堆栈栈顶,16位则是ss:sp.
参考技术D 我也不懂。

LeetCode面试题59 - II. 队列的最大值

题目链接:

面试题59 - II. 队列的最大值

题目描述:

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数 max_valuepush_backpop_front 的时间复杂度都是 O(1)

若队列为空,pop_frontmax_value 需要返回 -1。

示例:

示例 1:

输入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出:[null,null,null,2,1,2]

示例 2:

输入:
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

思路:

此题的关键在于 max_value 如何实现,push_backpop_front 都是队列现成的操作。之前做过栈类似的题目:155. 最小栈面试题30. 包含min函数的栈。在这里可以运用类似的思想,用两个队列实现题目要求。

题目要求找出队列中的最大值,注意到:当一个元素进入队列的时候,它前面所有比它小的元素就不会再对答案产生影响

按照这个思路,可以在元素入队时进行如下的操作:从队列尾部入队元素value时,提前取出队列中所有比value小的元素,使得队列中只保留对结果有影响的数字。这样等价于要求维持队列单调递减,即要保证每个元素的前面都没有比它小的元素。

具体实现: 在入队元素value时,先从队列尾部依次取出比value小的元素,直到遇到比value大的元素为止,这就保证了这个队列是单调递减的。因此设立一个双端队列deque来存储这个递减队列,另设一个普通队列queue存储所有元素。

  • push_backqueue入队;对deque进行上述检查后决定是否入队。
  • pop_frontqueue出队;若出队元素与deque队首元素相等,deque出队。
  • max_valuedeque队首元素。

代码实现:

class MaxQueue {
    // 辅助队列
    private Queue<Integer> queue;
    // 双端队列
    private Deque<Integer> deque;

    public MaxQueue() {
        queue = new LinkedList<>();
        deque = new ArrayDeque<>();
    }
    
    public int max_value() {
        if (deque.isEmpty()) {
            return -1;
        }
        return deque.peekFirst();
    }
    
    public void push_back(int value) {
        while (!deque.isEmpty() && deque.peekLast() < value) {
            deque.removeLast();
        }
        deque.addLast(value);
        queue.add(value);
    }
    
    public int pop_front() {
        if (queue.isEmpty()) {
            return -1;
        }
        int result = queue.peek();
        if (result == deque.peek()) {
            deque.remove();
        }
        queue.remove();
        return result;
    }
}

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue obj = new MaxQueue();
 * int param_1 = obj.max_value();
 * obj.push_back(value);
 * int param_3 = obj.pop_front();
 */

以上是关于汇编里的"PUSH"和"POP"起了啥功能,,谁能用通俗点的话告诉我吗??的主要内容,如果未能解决你的问题,请参考以下文章

Jquery获取span里的值并比较

Unix环境高级编程里的fcntl函数使用示例

jquery怎样获取元素里的文本内容

js点击一个表格里的某个元素,获取该对象

剑指Offer面试题59 - II. 队列的最大值

C指针原理-AT&T汇编