基础汇编指令(16bit 32bit 64bit)
(zz from http://blog.luoyuanhang.com/)
##常见寄存器
| 寄存器 | 16位 | 32位 | 64位 |
|---|---|---|---|
累加寄存器
accumulator |
AX | EAX | RAX |
基址寄存器
base |
BX | EBX | RBX |
计数寄存器
count |
CX | ECX | RCX |
数据寄存器
data |
DX | EDX | RDX |
堆栈基指针
Base Pointer |
BP | EBP | RBP |
变址寄存器
Source Index |
SI | ESI | RSI |
堆栈顶指针
Stack Pointer |
SP | ESP | RSP |
指令寄存器
Instruction Pointer |
IP | EIP | RIP |
AH&AL=AX(accumulator):累加寄存器
BH&BL=BX(base):基址寄存器
CH&CL=CX(count):计数寄存器
DH&DL=DX(data):数据寄存器
SP(Stack Pointer):堆栈指针寄存器
BP(Base Pointer):基址指针寄存器
SI(Source Index):源变址寄存器
DI(Destination Index):目的变址寄存器
IP(Instruction Pointer):指令指针寄存器
CS(Code Segment)代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器
##汇编指令
##mov
movb(8位)、movw(16位)、movl(32位)、movq(64位)
寄存器寻址:
movl %eax, %edx
eax -> edx
立即数寻址:
movl $0x123, %edx
数字->寄存器
直接寻址:
movl 0x123, %edx
直接访问内存地址数据,edx = *(int32_t *)0x123;
间接寻址:
movl (%ebx), %edx
%ebx 是个内存地址,(%ebx)指的是该地址中的数据,edx = *(int32_t*)ebx;
变址寻址:
movl 4(%ebx), %edx
edx = *(int32_t*)(ebx+4);
##push & pull
###堆栈数据结构简介
####作用:
- 程序调用框架
- 传递参数
- 保存返回地址
- 提供局部变量
- ……
####结构:

相关寄存器: esp, ebp
相关操作: pop, push
//建立被调用者函数的堆栈框架
pushl %ebp
movl %esp, %ebp //拆除框架
movl %ebp, %esp
popl %ebp
ret
###push:压栈
push %eax
相当于:
subl $4, %esp
//栈顶指针减4
movl %eax, (%esp)
//%eax -> esp 地址
###pop:出栈
pop %eax
相当于:
movl (%esp), %eax
addl %4, %esp
//栈顶指针加4
##call&ret
###call
call 0x12345
相当于:
pushl %eip
movl $0x12345, %eip
//当前地址压栈,存入新地址
###ret
相当于:
popl %eip
//栈 -> eip
##enter&leave
###enter
push %ebp
movl %esp, %ebp
//将堆栈置空(栈上重堆)
###leave
movl %ebp, %esp
popl %ebp
//将堆栈置空(撤销堆栈)
##例子:分析一段汇编代码
pushl $8 ①
movl %ebp, %esp ②
subl $4, %esp ③
movl $8, (%esp) ④





基础汇编指令(16bit 32bit 64bit)的更多相关文章
- java线程基础巩固---数据同步引入并结合jconsole,jstack以及汇编指令认识synchronized关键字
对于多线程编程而言其实老生成谈的就是数据同步问题,接下来就会开始接触这块的东东,比较麻烦,但是也是非常重要,所以按部就班的一点点去专研它,下面开始. 数据同步引入: 这里用之前写过的银行叫号的功能做为 ...
- 汇编指令与Intrinsics指令的对应关系汇总
汇编指令与Intrinsics指令的对应关系汇总 参考网址:https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 1.赋值指令:m ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- ARM体系结构和汇编指令
第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...
- 常见寄存器以及常见汇编指令,常见爆破指令 good
CPU的任务就是执行存放在存储器里的指令序列.为此,除要完成算术逻辑操作外,还需要担负CPU和存储器以及I/O之间的数据传送任务.早期的CPU芯片只包括运算器和控制器两大部分.到了近几年,为了使存储器 ...
- C表达式中的汇编指令
C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 a ...
- C 表达式中的汇编指令
asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 asm-qualifier ...
- 汇编语言——用DOSBox的debug查看CPU和内存 & 用机器指令和汇编指令编程
实验一 查看CPU和内存,用机器指令和汇编指令编程 实验目的 了解什么是Debug,以及Debug中需要用的一些功能 R:查看.改变CPU寄存器的内容 D:查看内存中的内容 E:改写内存中的内容 ...
- 结合Intel Manual和libdasm学习汇编指令
参考:http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html h ...
随机推荐
- 快速傅里叶变换(FFT)时间复杂度
图:信号在时域上和频域上的直观表示 1. 计算一维离散傅里叶变换(DFT)公式如下: 其中,N表示数据长度.由上式可知,DFT的时间复杂度是O(N*N) 2. 一维FFT的时间复杂度为O(N*logN ...
- 【Appium自学】Appium [安装包] Appium 官方文档(转发)
转发地址:https://blog.csdn.net/panyu881024/article/details/80149190 Appium国内下载地址 : http://pan.baidu.com/ ...
- hash加密
hash import hashlib content = 'its so coll'.encode('utf8') o = hashlib.sha1() # 创建一个hash对象 o.update( ...
- Hibernate的多表关系
多表关系 一对多/多对一 O 对象 一的一方使用集合. 多的一方直接引用一的一方. R 关系型数据库 多的一方使用外键引用一的一方主键. M 映射文件: 一: <set name="& ...
- 在aspx中,如果要引用一个ID号,需要引用外层的ID号(内层的不行)
- Git 切换本地分支 切换远程分支
切换本地分支 git checkout work1 切换到新的分支工作(不存在则会创建) 将本地已有的分支(已经存在) 和 远程分支连接 git branch --set-upstream-to=or ...
- css 之过渡效果
之前写css的效果,都是使用js 来完成的,但是写js比较耗费时间,有时候逻辑不对,还出不来效果,所以也比较烦:所以一些简单的效果,就使用css 来完成会比较好一些,不必耗费太多的精力: 但是写css ...
- Jenkins+Git+Maven构建并部署springboot(构建多模块中的单个模块)
主要思路:1.jenkins从git中拉取项目源码:jenkins使用maven构建并将生成的jar包通过shell脚本启动. 环境:环境:Centos7.Maven3.5.3.git(单机) 准备工 ...
- kinect 深度图与彩色图对齐程序
//#include "duiqi.hpp" #include "kinect.h" #include <iostream> #include &q ...
- Python-基础函数与常用模块考核
第二模块考核(2019/ 03/ 03) ### 第一模块内容1.请写出 “路飞学城alex” 分别用utf - 8和gbk编码所占的位数(口述) ➜ ~ python3 >>> b ...