微信号:cpp_coder

介绍:最专业的C/C++编程学习和程序员发展的综合平台.提供C/C++、汇编语言等、STL、MFC、QT等等学习、数据结构算法思维分析、各领域项目经验分享、资源下载、招聘和资讯的综合服务.

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

2015-10-11 22:25 CPP技术网

本文介绍了汇编中的一些很基本的指令,总结性比较强,如果要深入详细了解可以找相关的书籍系统学习。

汇编基本指令

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

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指令的例子一样,都会报错的。

关注cpp_coder获取更多精彩教程

 
CPP技术网 更多文章 宏、常量、枚举、结构体和共用体对比分析之常量 宏、常量、枚举、结构体和共用体对比分析之结构体 C/C++声明定义初始化和赋值独家剖析深刻理解 mfc的消息机制,多窗口的互动 MFC中的窗口类:C++类与窗口句柄的结合深入浅出分析
猜您喜欢 React Native库版本升级(Upgrading)与降级讲解 [转]码路指南:怎样才算是编程高手? MongoDB积极打造和培养开源的拥趸 匿名Email:分享几个10分钟邮箱(即弃型电子邮箱)! 今晚公开课:小白WEB安全入门