首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ASM x86在cmp之后立即弹出是否正确?

在x86汇编语言中,cmp指令用于比较两个操作数的值,并根据比较结果设置标志位。但是cmp指令本身并不会弹出任何值。

cmp指令通常与条件跳转指令(如je、jne等)结合使用,根据比较结果来决定是否跳转到特定的代码块。在跳转之前,通常会使用其他指令(如push、pop等)将需要的值保存或弹出。

因此,对于cmp指令之后是否立即弹出的问题,答案是不正确。cmp指令本身不会弹出任何值,需要根据具体的需求使用其他指令来进行操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 汇编语言完成1到100累加-3

    push, sp-2 pop, sp+2 cmp cmp 指令功能上和 sub 指令相同,唯一不同之处在于,cmp 指令仅仅根据计算的结果设置相应的标志位,而不保留计算结果,因此也就不会改变两个操作数的原有内容...修改标志位,利用转移指令进行循环)累加1到100,结果存入到ax中,div 10 将 余数push到栈中,这里不在是如上篇div 5次了,而是利用cmp 去根据商的结果是否需要继续求余数,如果是0则跳过...代码 ; 完成1到100累加,并显示屏幕上 jmp near start message db "1+2+3+...+100=" start: mov ax,0x7c0 mov...- 1;即栈顶元素会发生变化; ; 而当使用 PUSH 指令向栈中压入 2 个字节的字单元时,SP = SP – 2 ;即栈顶元素也要发生变化; ; 当使用 POP 指令从栈中弹出...\Learn.ASM -o learn.bin 编译代码,生成二进制文件。 写入到虚拟机的vhd里。

    1.1K20

    X86汇编的理解与入门

    一般用标签(label)指示程序中的指令地址,X86汇编代码中,可以在任何指令前加入标签。...机器状态字中包括指示最后一个算数运算结果是否为0,运算结果是否为负数等。机器状态字具体解释请见微机原理、计算机组成等课程。...由于被调用的子程序会修改这些寄存器,所以为了调用子程序完成之后正确执行,调用者必须在调用子程序之前将这些寄存器的值入栈。 2)调用子程序之前,将参数入栈。...为了子程序完成之后调用者能正确定位调用者的参数和局部变量,ebp的值需要返回。 2)栈上为局部变量分配空间。...4)在上述三个步骤完成之后,子程序开始执行,当子程序返回时,必须完成如下工作:   4.1)将返回的执行结果保存在eax中   4.2)弹出栈中保存的callee-saved寄存器值,恢复callee-saved

    1.8K42

    liunx内核中的互斥自旋锁和读写自旋锁的实现详解

    今天把这两个锁的内核实现源码重新捋了一遍,基于liunx2,6.0,直接粘注释版: 核心文件,x86下实现的spinlock #ifndef __ASM_SPINLOCK_H #define __ASM_SPINLOCK_H...* x86上,我们将读写锁实现为32位计数器,高位(符号)为“争用”位。 * * The inline assembly is non-obvious. Think about it....*/ rwlock.h核心文件,x86实现: /* include/asm-x86_64/rwlock.h * * Helpers used by both rw spinlocks and rw..."subl $1,(%0)" \ //获取读锁就是尝试lock上减1,因为RW_LOCK_BIAS是非常大的一个数 // 只有有写锁的时候会直接减去0x01000000变为0,其他时候是不可能小于...LOCK "incl (%eax)"//原子性增加eax寄存器中的值(也就是lock变量的值) "1: rep; nop" //进行空操作,耗掉一点点时间 "cmpl $1,(%eax)"// cmp

    1.1K30

    一次Rust重写基础软件的实践(一)

    需要类似如下汇编代码块: lock cmpxchgq [destination], rdx ARM 需要类似如下汇编代码块: ldrex r1, [destination] cmp...stwcx. r2, 0, destination bne retry ; branch if store failed 然而如下面的代码片段所示,即使该软件使用相同的Intel x86...解决方案 想到两个解决方案: 使用asm!...宏去处理不同芯片平台的汇编代码 使用 Rust代码对特定的操作进行针对性的实现 第一种方案比较简单,只需要在代码中使用std::arch::asm 包,然后使用 asm! 宏(类似 println!...另外对于Ordering::SeqCst内存顺序 [6] 的选择也是比较考究的一个话题,这里我使用 SeqCst实际上是一个保证正确的情况下不太考虑效率优化问题的选项。

    15910

    反虚拟机技术总结

    ,判断当前是否虚拟机中。...BOOL CheckVMWare() { __asm { rdtsc xchg ebx,eax rdtsc sub eax,ebx cmp eax,0xFF jg detected...然而在x86体系结构中,一些指令获取硬件相关的信息时并不产生异常,如sidt、sgdt、sldt、cpuid等等。...为了正确虚拟这些指令,VMware需要在所有指令上进行二进制翻译,因此造成巨大的性能损失。 为了避免执行全指令模拟造成的巨大性能损失,VMware允许一些特定指令没有正确虚拟化的前提下运行。...中断描述表(IDT)是CPU内部的一个数据结构,操作系统使用它来确保正确响应中断和异常。x86体系结构下,所有的内存获取,或是通过全局描述表(GDT)获得,或是通过本地描述表(LDT)获得。

    65050

    Java并发基础:了解无锁CAS就从源码分析

    是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的汇编指令,intel的CPU中,使用的是cmpxchg指令,就是说CAS是靠硬件实现的...Exception e) { System.out.println("Get Unsafe instance occur error" + e); } } 获取到Unsafe实例之后...// atomic_windows_x86.inline.hpp #define LOCK_IF_MP(mp) __asm cmp mp, 0 \ __asm...简单解释一下下面这条指令,熟悉汇编的朋友可以略过下面的解释: * cmpxchg: 即“比较并交换”指令 * dword: 全称是 double word, x86/x64...获取到当前变量V,准备修改为新值U前,另外两个线程已连续修改了两次变量V的值,使得该值又恢复为旧值,这样的话,我们就无法正确判断这个变量是否已被修改过,如下图: 3.png 这就是典型的CAS的ABA

    68440

    漏洞分析:MS14-058(CVE-2014-4113)

    如果Windows内核模式驱动程序不正确地处理内存中的对象,则存在一个特权提升漏洞。成功利用此漏洞的攻击者可以运行内核模式中的任意代码。...漏洞原理该漏洞发生的位置是驱动文件Win32k.sys中的xxxHandleMenuMessage函数中,销毁弹出菜单的时候通过钩子的方法修改返回值,将返回值修改为fffffffb,因为对这个值没有严格的检查从而在...sendmessage中再次被引用到,从而造成了UAF,这个方法可以sendmessage中跳转到shellcode从而提权实验环境虚拟机:Windows 7 x86 sp1物理机:Windows 10...xxxSendMessageTimeout+0xb3:9d5b93fa 3b7e08          cmp     edi,dword ptr [esi+8]9d5b93fd 0f8484000000...应该是消息循环,处理消息的函数貌似正是xxxHandleMenuMessages据查阅资料(参考资料[11]),TrackPopupMenu显示菜单之后,消息循环就由菜单接管了,此时进入的是PopupMenu

    1.4K20

    详解反虚拟机技术

    ,判断当前是否虚拟机中。...然而在x86体系结构中,一些指令获取硬件相关的信息时并不产生异常,如sidt、sgdt、sldt、cpuid等等。...为了正确虚拟这些指令,VMware需要在所有指令上进行二进制翻译,因此造成巨大的性能损失。为了避免执行全指令模拟造成的巨大性能损失,VMware允许一些特定指令没有正确虚拟化的前提下运行。...中断描述表(IDT)是CPU内部的一个数据结构,操作系统使用它来确保正确响应中断和异常。x86体系结构下,所有的内存获取,或是通过全局描述表(GDT)获得,或是通过本地描述表(LDT)获得。...编译好dll之后,放在Tencent2016C.exe的同目录,运行Tencent2016C.exe,点击检测按钮,物理机中运行时函数接口输出为0,VMware虚拟机、VirtualBox虚拟机和VirtualPC

    1.3K41

    深入理解Java内存模型(五)——锁

    上图表示在线程A释放了锁之后,随后线程B获取同一个锁。在上图中,2 happens before 5。因此,线程A释放锁之前所有可见的共享变量,在线程B获取同一个锁之后,将立刻变得对B线程可见。...根据volatile的happens-before规则,释放锁的线程写volatile变量之前可见的共享变量,获取锁的线程读取同一个volatile变量后将立即变的对获取锁的线程可见。...下面我们来分析常见的intel x86处理器中,CAS是如何同时具有volatile读和volatile写的内存语义的。...#define LOCK_IF_MP(mp) __asm cmp mp, 0 \ __asm je L0 \...eax, compare_value LOCK_IF_MP(mp) cmpxchg dword ptr [edx], ecx } } 如上面源代码所示,程序会根据当前处理器的类型来决定是否

    86420

    关于分段免杀执行的思考

    byte ptr ds:[ecx+edx] xor bl,bh mov byte ptr ds:[ecx+edx],bl inc edx cmp...从上面的代码解决了如何才能调到解码子的解码部分首地址的问题,通过一开始找到解码的首地址,压入栈,然后每次解码完,都弹出来给一个寄存器,执行完解码就去执行shellcode,执行完shellcode根据弹出来的解码首地址...shellcode的尾地址再加1,再执行add ecx,19,19是逻辑处理那段的机器码数目,之后ecx就是下下个要执行的shllcode首地址,再通过出栈压栈,我们都能找到要执行shllcode首地址...程序开始时候,就把第一段shellcode首地址和解码子首地址压入栈,接着调用解码程序去解码第一段shellcode,解码完返回,接着弹出第一段shellcode首地址和解码子首地址,利用jmp去执行解码后的第一段...shellcode,执行完,去执行0x04内容,根据弹出来的解码子首地址,再去解码第二段shellcode,然后执行,依次类推 0x07 总结 1、解码执行第二段代码的密钥第一段里面 2、利用好ret

    76830
    领券