微软x64常用汇编指令总结
这里写目录标题
- mov 传送指令
- mov ptr
- lea 直接读取有效地址值
- call 调用子程序
- ret 函数返回
- add 加法
- sub 减法
- mul 乘法
- div 除法
- inc 自增(increase)
- dec 自减
- jmp
- cmp
- jne
- je
- push
- pop
- pushad
- popad
- and 与
- or 或
- xor 异或
mov 传送指令
- mov eax, ebx 把 ebx内容传送到eax中
- mov eax, 1001H ,把 1001H 写入eax中
mov ptr
- 格式:move 操作数1, 单位长度 ptr[地址值]
- 把 中括号里面计算结果的值,作为内存地址,取出里面的值,然后存入操作数1
- 例如:
mov eax , dword ptr[ebp - 1001H]
- 格式: 单位长度 ptr[地址值] ,操作数2
- 例如:
- mov dword ptr[ebp - 1001H] ,eax
- 作用: 取出 ptr 和 []中括号里面的地址对应的内存值.
- mov eax , dword ptr[ebp - 1001H] ,把 ebp - 1001H地址里的内容,取出来, dword是双字节大小,存入eax,因为 []里面计算的是地址,如果不加dword单位大小,就不知道从[]地址中取多长的数据复制给eax
lea 直接读取有效地址值
- lea eax ,[1001H]
- lea作用是把 中括号里的值存入 寄存器里,是去掉括号后赋值给左边寄存器
- 把[1001H]里面的地址赋值给eax,也就是把1001H赋值给eax,执行之后的结果,是 eax = 1001H
- 等价于 mov eax , 1001H
- 因为lea的[]中括号可以做运算,所以 lea eax, [ebp - 10h]可以先运算,再把结果赋值给eax.作用是直接运算地址,然后复制给eax.通常用作c++中指针变量赋值
- 通常做给c++指针赋值的时候使用这个指令,例如:
int a = 3; // mov dword ptr[ebp-01h] , 3int *p = &a; // lea eax,[ebp-01h] , 先把 abp,01h的地址复制给eax,这里之所以不能使用 mov eax ,ebp-p1h ,是因为mov的操作数2不能直接做运算,不能做运算,但是[]可以做运算//mov dword ptr[ebp - 18h],eax,再把eax赋值给指针p
call 调用子程序
例如 call 地址值 ,call语句执行以后,会先把eip(eip中存储着下一条cpu要执行执行的地址),把eip指向的地址压入栈中,因为call执行完以后eip就已经指向了call的下一句. 就是把call的下一句指令压入占中.这时候esp(栈指针) 会esp - 4,然后执行jmp跳转到 call 后面的地址.
然后程序就跳转到这个地址,执行子程序,子程序末尾会有ret 语句,是返回语句,返回以后会跳到之前call语句的下一句
例如:
006C4E01 call 0067D4E0
006C4E06 push esi
相当于 push 006C4E06
jmp 0067D4E0
call里面遇到ret
ret 函数返回
- 跟jmp指令差不多,也是跳转,区别是ret跳转到函数执行完以后的指令.在函数调用结束的时候用这条指令返回,返回到之前call指令调用函数之后的指令
- 函数返回值一般放在 eax中
add 加法
例如 add eax,10 ,相当于 eax = eax + 10.等价于 lea eax,[eax + 10] .注意不能等价于 mov eax ,eax +10 .因为 + 加法运算只能写在 [ ] 中括号里面,否则有语法错误.
sub 减法
跟add相反
sub eax,10 相当于 eax = eax - 10
mul 乘法
mul eax , ecx , 4 等于 eax = ecx * 4 .用于数组结构,每次ecx变化就走一个元素
div 除法
跟乘法相反
div eax,ecx, 4 相当于 eax = ecx / 4
inc 自增(increase)
例如inc eax ,相当于 eax++ ,等价于 lea eax , [eax + 1]
dec 自减
跟inc 相反 , dec eax 相当于eax–,等价于 lea eax , [eax - 1]
jmp
- jmp 地址
- 无条件跳转能到地址所在的机器指令
cmp
- 比较指令,比较结果以后,后面会跟着一个跳转指令 jne ,je之类的进行跳转
- cmp op1,op2,比较 op1和 op2是否相等,如果不相等 ,后面跟着的jne会跳转,不想等,就不跳转.
jne
- jump not equal比较结果不相等才跳转, 执行jne之前需要先执行 cmp比较指令,比较之后的结果 影响jne的跳转结果.
例如: - cmp eax,dword prt[ ebp - 10h] //比较 eax和 后面地址里面的值的结果
- jne 01234567 //如果上面比较结果不相等, 就跳转能到01234567的地址
je
跟上面的jne相反,cmp比较结果相等才跳转
push
入栈,把数值或者寄存器压入栈.每次push都是放入栈顶.
例如 push eax 或者push 0
pop
出栈,跟push相反,把栈顶的值赋值给寄存器.然后把栈顶的数给取出.
例如 pop eax,就是把栈顶的数赋值给eax,然后栈顶的值删掉.
栈底在高地址,栈顶是低地址,push是 esp - 4 pop 是esp + 4
pushad
一般在call调用的头部使用pushad,把寄存器按顺序压入栈,用来保存全部寄存器
popad
一般在call调用的尾部使用popad,把寄存器按顺序出栈,用来还原之前保存的全部寄存器
and 与
都为1才为1 ,例如: and eax,eax ,相当于eax = 1
or 或
有一个1就为1,全为0才为0,例如 or eax,eax 相当于 eax = 0
xor 异或
相同为0,不同为1,按位比较
- xor eax,ecx把eax和ecx按位异或赋值给eax
- 一般用于清零和加密操作,例如 xor eax,eax ,等于给eax = 0
微软x64常用汇编指令总结相关推荐
- 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...
浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...
- RISC-V 常用汇编指令
RISCV 常用汇编指令 相关寄存器 寄存器 ABI 名 用途 Saver x0 zero 读取时总为 0, 写入时不起任何效果 - x1 ra 存放函数返回地址 (return address) C ...
- Cortex-A7 常用汇编指令
Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...
- 常用汇编指令(七大类)
常用汇编指令 汇编语言指令大致分为以下几类 一.传送类指令 二.算数运算类指令 三.位操作指令 四.串操作指令 五.控制转移类指令 六.处理器控制类指令 七.汇编指令伪指令 一.传送类指令 1.数据传 ...
- 逆向中常见寄存器及常用汇编指令
寄存器 通用寄存器 (前八个) 32位 16位 作用 EAX(累加器) AX 作用于操作数和结果的数据 EBX(基址寄存器) BX DS段中的数据指针 ECX(计数器) CX 用于字符串和循环操作 E ...
- x64 ASM 常用汇编指令
语法习惯 这里主要说AT&T风格的汇编语言风格.因为gdb看反汇编默认的风格就是AT&T风格的,Intel风格的这里就不做介绍. 立即数,$ 开头 寄存器,% 开头 取地址里面的值,偏 ...
- 常用汇编指令对标志位的影响
加法指令 ADD (addition) 指令对标志位的影响:CF=1 最高有效位向高位有进位CF=0 最高有效位向高位无进位OF=1 两个同符号数相加(正数+正数 或 负数+负数),结果符号与其相反. ...
- Linux常用汇编指令
一. 数据传输指令 1. 通用数据传输指令 mov 传送字或字节 ( movb 传送字节 movw 传送字 movl 传送双字 movq 传送四字 movabsq 传送绝对的四字 ) movsx 先符 ...
- Linux学习笔记---Cortex-A7 常用汇编指令
MOV指令 MOV R0,R1 @将寄存器R1中的数据传递给R0 MOV R0,#0X12 @将立即数0X12传递给R0寄存器 MRS指令 MRS R0,CPSR @将特殊 ...
最新文章
- 生信入门必须掌握的 30 个 Linux 命令
- 自动驾驶出租车竞争激烈,国内百度占得先机!
- 1.13 实例:用户修改密码
- JVM—GC垃圾收集器
- 解密HLS中的AES加密
- 2018/12/26
- 论破坏计算机信息系统罪,论破坏计算机信息系统罪
- mysql中有time吗_mysql中 datatime与timestamp的区别说明
- MyReport报表引擎2.7.4.0新功能
- 加深 | Matlab图像实验操作基础(矩阵,九宫格、噪声处理)
- 华为人均工资高达70万,但先看看华为员工的16项标准
- 如何用Visio画出总线(空心的箭头)
- 一台电脑绿色安装多个版本google Chorme方案
- 优思学院|什么是TPM管理?
- JS输入框统计文字数量,并过滤拼音时的统计
- 获取指定年、月的具体天数
- Flutter InkWell Ink组件
- python房价预测_python预测房价
- 自己用html + js 一百行代码做一个朗读器
- 功放IC音频芯片双声道D类3W ESOP-8封装