当前位置:C++技术网 > 资讯 > 汇编基础知识一之汇编基本指令

汇编基础知识一之汇编基本指令

更新时间:2015-10-11 11:03:05浏览次数:1+次

汇编基本指令

注:汇编语言大小写不敏感。

    1.NOP

    运行这条指令不会对寄存器,内存以及堆栈造成任何影响,英文单词的意思是”无操作”。
    2. PUSH
    PUSH指令将操作数压入堆栈中,新压入的数据总是在堆栈的顶部,并不会改变下面的数据。举个例子:“push 401008”将把401008存入到堆栈的顶部;“push eax”将eax的值压入堆栈的顶部;“push [401008]”则与“push 401008”不同,该指令表示将401008这个内存单元中存储的内容压入堆栈顶部。
    3. POP
    POP指令是出栈,它会取出堆栈顶部的第一个字母或者第一个值,然后存放到指定的目标地址内存单元中。例如,“pop eax”从栈顶中取出第一个值(前面说过eax为32位寄存器,因此在这儿也就是4个字节的内容,即双字DWORD)存放到EAX中。
    4. PUSHAD
    PUSHAD指令把所有通用寄存器的内容按一定顺序压入到堆栈中,也就是依次执行以下指令:push eax, push ecx, push edx, push ebx, push esp, push ebp, push esi, push edi。
    5. POPAD
    POPAD指令与PUSHAD正好相反,它从堆栈中取值,并将它们放到相应的寄存器中,即pop edi, pop esi, pop esp, pop ebx, pop edx, pop ecx, pop eax。
    PUSHAD-POPAD指令经常被使用,例如:某个时刻你需要保存所有寄存器的内容,然后修改寄存器的值,或者进行堆栈的相关操作,然后使用POPAD恢复它们原来的状态。
    也有以下的用法:
    PUSHA 等价于 “push ax, cx, dx, bx, sp, bp, si, di”
    POPA 等价于 “pop di, si, bp, sp, bx, dx, cx, ax”
    6. MOV
    该指令将第二个操作数赋值给第一个操作数,例如:mov eax, ebx;将EBX值赋值给EAX。
    但是指令“mov [405000], eax”能不能像前面一样将eax中的值写入到405000指向的内存单元中呢?通常情况下我们不能直接对内存进行写入操作。
    7. MOVSX
    带符号扩展的传送指令,第二个操作数可能是一个寄存器也可能是内存单元,第一个操作数的位数比第二个操作数多,第二个操作数的符号位填充第一个操作数剩余部分。例如:eax = 0x00401008,bx = 0xe000,执行“movsx eax, bx”后,结果为:eax = 0xffffe000,bx = 0xe000。
    注:16位范围,0x0000——0x7fff为正数,0x8000——0xffff为负数。
    8. MOVZX
    带0扩展的传送指令,MOVZX类似于前面的语句MOVSX,但是这种情况下,剩余的部分不根据第二个操作数的正负来进行填充,而是剩余的部分总是被填充为0。
    9. LEA
    取地址指令,类似于MOV指令,但是第一个操作数是一个通用寄存器,并且第二个操作数是一个内存单元。如指令“lea eax, [ecx+38]”,在这种情况下,有中括号,但是不需要获取ecx+38指向内存的值,只需要计算ecx+38的值即可,
若ecx=0x12ffb0,则eax=ecx+38=0x12ffe8。
    10. XCHG
    该指令能够交换 寄存器/内存单元和寄存器的值。例如:xchg eax, ecx,EAX的值与ECX的值将会进行交换。该指令也可以交换寄存器和内存单元的值,xchg [45000], eax,但是若对该内存地址没有写权限,和前面MOV指令的例子一样,都会报错的。