ATT汇编快速学习

news2024/11/15 4:54:27

说明

文档来源

https://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html
使用AT&T语法; 原文档是intel语法翻译过来的;

内容

基于32位, x86的硬件环境;
指令仅仅介绍常用, 即还有很大一部分的指令并没有支持;

编译器(汇编器)

GAS(GNU assembler:gnu组织提供; 使用标准AT&T语法;

注意

  • 金介绍少部分指令; 其他指令查官方文档;
  • 使用32位而不是16位; 16比较复杂, 有偏移量之类的;

寄存器

32寄存器

eax: Accumulator, 数学计算
ebx:
ecx: Counter, 循环的index
edx:
esp: stack pointer, 栈顶;
ebp: base pointer, 函数第一个局部变量在栈的位置; 上一个是之前的eip地址;
eip: instruction pointer, 指令寄存器;

16,8位寄存器

共用寄存器, 也就是一改其他都被改;
eax, ax, ah, al; ax = (ah << 8) + al
好处就是兼容且可以操作更小字节数据;

内存

说明

全局变量或静态变量; 即共享的; bss + dss;

汇编全局变量申请

.data
var:
    .byte 64        /* Declare a byte, referred to as location var, containing the value 64. */

    .byte 10        /* Declare a byte with no label, containing the value 10. Its location is var + 1. */

x:
    .short 42       /* Declare a 2-byte value initialized to 42, referred to as location x. */
y:
    .long 30000     /* Declare a 4-byte value, referred to as location y, initialized to 30000. */

类型, 初始值, 类型决定数据占用字节;

汇编数组申请

s:
    .long 1, 2, 3    /* Declare three 4-byte values, initialized to 1, 2, and 3. The value at location s + 8 will be 3. */

barr:
    .zero 10        /* Declare 10 bytes starting at location barr, initialized to 0. */
str:
    .string "hello" /* Declare 6 bytes starting at the address str initialized to
the ASCII character values for hello followed by a nul (0) byte. */
  • 类型加若干初始值;
  • .zero加长度
  • 字符串, 加\0

地址格式

地址对应操作

  • 加载地址对应的内存放入寄存器; reg=*addr;
  • lea: load effective address, 即给地址代表地址, 用地址赋值; reg=addr

三种

  • 一元组: offset(reg)
  • 三元组: offset(reg1, reg2, number), number={2^n|n=[0,3]}即, number={1,2,4,8}; 其他错误;
  • 地址: var(,1), *var
    offset, var常数;offset可以为正负数, var同理;

label

编译后编程地址; 编程时方便阅读而已;

地址访问几种格式

// eax = *ebx
mov (%ebx), %eax        /* Load 4 bytes from the memory address in EBX into EAX. */

// *var=*ebx
mov %ebx, var(,1)       /* Move the contents of EBX into the 4 bytes at memory address var. (Note, var is a 32-bit constant). */

// eax=*(esi - 4)
mov -4(%esi), %eax      /* Move 4 bytes at memory address ESI + (-4) into EAX. */

// *(esi + eax * 1) = *cl
mov %cl, (%esi,%eax,1)  /* Move the contents of CL into the byte at address ESI+EAX. */

mov (%esi,%ebx,4), %edx /* Move the 4 bytes of data at address ESI+4*EBX into EDX. */

指定操作字节大小

目的

消除二义性;

常规

可以通过寄存器确定大小;
mov $2, (%ebx)二义性: 目标地址大小未知, 通过后缀可以区分;

mov[bwl]: Byte,Word,Long, 默认32; Long根据不同机器字节不同;

程序跳转

说明

实际就是间接修改ip(Instruction Pointer)的地址;

跳转

通过比较, 然后条件跳转; 条件跳转即查询状态寄存器对应位是0,1, 然后再跳转;

跳转机制

  • if else不同结果跳转不同位置;
  • switch case: 同理
  • for, while: 同if else; 只是有返回而已;
  • call: 也会跳转, 这里是执行一些预处理后无条件跳转; 上面的是比较;

ip偏移

ip偏移: 即当前地址+ 当前指令长度; 执行成功后进行偏移;

  • 先执行, 再ip + len;

label

这个是编码的时候用, 这种就不需要写固定地址; 而是由链接器赋予地址;

调用

背景

模块化, 代码共用;

调用约定

  • 调用者需要干一些事;
  • 函数实现者需要干一些事;
    调用约定可以让代码更加通用; 跨语言之间交互;

栈与变量

  • 参数是倒序入栈, 然后就是顺序出栈;
  • 局部变量一般使用offset(rbp)的形式, 而不是push的形式, 因为 局部变量的偏移量是固定的; 栈特性;

调用者

调用前

  1. 备份(肯定会被使用的)寄存器到栈中;
  2. 参数入栈; 从后往前, 倒序; 和调用协议有关;
  3. 执行call: 这个指令将ip入栈并跳转;

返回后

  1. 参数弹栈; 即sp恢复; (上面步骤2.的反向操作;)
  2. 栈中备份的寄存器数据恢复; (上面步骤1.的反向操作;)

调用前备份, 调用后恢复, 表现的就像执行了一条简单的语句而不是函数一样;

函数(被调用者)

开始

  1. ebp备份并用当前esp替换; (bp)即当前函数的栈开始的地方, 可以用来快速定位参数和局部变量;
  2. 局部变量分配: 局部变量一般是固定offset, 即offset(ebp)的形式;
  3. 如果接下来会修改不常用寄存器; 如(edi,esi,ebx)之类的; 这种就需要在使用前自行备份, 使用完之后恢复;

退出

  1. 将返回值存储到eax中;
  2. (3. reverse)将之前备份的edi,esi寄存器值恢复;
  3. (2. reverse)局部变量谈栈, 析构; c直接将esp恢复成ebp, C++会有析构函数;
  4. (1. reverse)``ebp的值恢复, 即上一个函数的栈顶;
  5. (调用者调用前的 3.)执行ret: 将之前call存储的ip弹栈, 再跳转回ip;

示例图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/498525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 5 Link Analysis

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 5 Link Analysis Terms: words or other strings of characters other than white space. An inverted index is a data structure that makes it easy, given a term, to find (pointers to) a…

【数码】收音机,德生PL380使用教程与注意事项

文章目录 1、主界面功能介绍&#xff08;注意闹钟和自动关机&#xff09;2、电池和电池模式的匹配3、收音机天线与信号&#xff0c;耳机与噪音F、参考资料 1、主界面功能介绍&#xff08;注意闹钟和自动关机&#xff09; 红色的按钮&#xff1a;power 按一下开机&#xff0c;按…

DJYOS开源往事一:djyos爱好者大南山相聚写实

前言&#xff1a;DJYOS开源社区成立于2009年&#xff0c;后因为专注技术方向和垂直产业化等原因&#xff0c;2015年后关闭开源社区。斗转星移&#xff0c;DJYOS开源社区虽然关闭&#xff0c;但是DJYOS开源和精神依然在&#xff0c;转眼DJYOS发布十四年了。记录一下DJYOS开源往事…

Qt Plugin插件开发

一、Qt 插件机制 .1 Qt 插件简介 插件是一种遵循一定规范的应用程序接口编写出来的程序&#xff0c;定位于开发实现应用软件平台不具备的功能的程序。插件与宿主程序之间通过接口联系&#xff0c;就像硬件插卡一样&#xff0c;可以被随时删除&#xff0c;插入和修改&#xff…

2.2.4 Linux安装模式下,磁盘分区的选择(重要)

目录树结构 &#xff08;directory tree&#xff09; 整个Linux系统最重要的地方就是在于目录树架构。 所谓的目录树架构&#xff08;directory tree&#xff09;就是以根目录为主&#xff0c;然后向下呈现分支状的目录结构的一种文件架构。 所以&#xff0c;整个目录树架构最重…

Midjourney-Discord入门+高手指引手册

上一篇我们说了如何注册和订阅&#xff0c;今天我们来讲一讲相关的细节&#xff0c;首先我们来一个概览图&#xff0c;先有个大致的印象。 概览图 生成的四张图片&#xff0c;类似于Demo&#xff0c;从左至右&#xff0c;从上至下&#xff0c;1,2,3,4放大按钮U1&#xff0c;U2…

【旋转编码器如何工作以及如何将其与Arduino一起使用】

在本教程中,我们将学习旋转编码器的工作原理以及如何将其与Arduino一起使用。您可以观看以下视频或阅读下面的书面教程。 1. 概述 旋转编码器是一种位置传感器,用于确定旋转轴的角度位置。它根据旋转运动产生模拟或数字电信号。 有许多不同类型的旋转编码器按输出信号或传感…

三个令人惊艳超有用的 ChatGPT 项目,开源了!

自 3 月初 Open AI 开放 ChatGPT API 以来&#xff0c;GitHub 上诞生的开源项目数量之多&#xff0c;着实多得让我眼花缭乱、应接不暇。 今天&#xff0c;我将着重挑选几个对日常工作、生活、学习帮助较大的 ChatGPT 开源项目&#xff0c;跟大家分享下&#xff0c;希望对你有所…

Illustrator如何使用填充与线条之实例演示?

文章目录 0.引言1.绘制星空小插画2.制作清新小碎花壁纸3.双重描边文字 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对…

labelme标注数据集,并利用paddleseg完成标注数据的准备工作

1、安装labelme 1、创建labelme虚拟环境 先检查python的版本 python -V使用命令 conda create -n labelme python=3.9,创建虚拟环境 2、激活虚拟环境 conda activate labelme3、安装labelme pip install labelme2、labelme的使用 1、打开cmd输入命令 labelme2、进入label…

关于安装Node/Yarn/Electron过程中遇到的问题

目录 1、安装Node2、安装electron很慢3、PowerShell中无法使用yarn命令4、Yarn命令目录bin与其全局安装位置不在同一个文件夹 1、安装Node 【参考文章】Node.js下载安装及环境配置教程 2、安装electron很慢 npm config set electron_mirror https://npm.taobao.org/mirrors/…

Java日志详解

文章目录 1.日志的概述1.1 日志文件1.1.1 调试日志1.1.2 系统日志 1.2 JAVA日志框架1.2.1 为什么要用日志框架1.2.2 日志框架和日志门面 2.JUL2.1 JUL简介2.2 JUL组件介绍2.3 JUL的基本使用2.3.1 日志输出的级别2.3.2 日志的输出方式2.3.3 自定义日志的级别2.3.4 将日志输出到具…

20个最流行的3D打印机切片软件

3D 打印切片机&#xff08;Slicer&#xff09;通过生成 G 代码为你的 3D 打印机准备 3D 模型&#xff0c;G 代码是一种广泛使用的数控 (NC) 编程语言。 3D打印切片软件的选择范围很广。 因此&#xff0c;为了帮助你找到最合适的工具&#xff0c;本文列出了20个顶级 3D 打印切片…

2022年NOC大赛编程马拉松赛道决赛图形化高年级A卷-正式卷

2022年NOC大赛编程马拉松赛道决赛图形化高年级A卷-正式卷 2022NOC-图形化决赛高年级A卷正式卷 编程题&#xff1a;蓝色星球的绿色踪迹任务描述&#xff1a;有一颗蔚蓝色的星球&#xff0c;她就是我们人类赖以生存的家园——地球。地球是人类的母亲&#xff0c;她为我们提供了各…

第三十七章 Unity GUI系统(上)

Unity 提供了三个 UI 系统帮助我们创建游戏界面 (UI)&#xff1a; 第一&#xff0c;UI 工具包 第二&#xff0c;Unity UI 软件包 (UGUI) 第三&#xff0c;IMGUI UI 工具包是 Unity 中最新的 UI 系统。它旨在优化跨平台的性能&#xff0c;并基于标准 Web 技术。您可以使用 U…

并发编程04:LockSupport与线程中断

文章目录 4.1 线程中断机制4.1.1 从阿里蚂蚁金服面试题讲起4.1.2 什么是中断机制4.1.3 中断的相关API方法之三大方法说明4.1.4 大厂面试题中断机制考点4.1.5 总结 4.2 LockSupport是什么4.3 线程等待唤醒机制4.3.1 三种让线程等待和唤醒的方法4.3.2 Object类中的wait和notify方…

uboot命令体系 源码解读并从中添加命令

1、uboot命令体系基础 1.1、使用uboot命令 (1)uboot启动后进入命令行底下&#xff0c;在此输入命令并回车结束&#xff0c;uboot会接收这个命令并解析&#xff0c;然后执行。 1.2、uboot命令体系实现代码在哪里 (1)uboot命令体系的实现代码在uboot/common/下&#xff0c;其…

【博学谷学习记录】超强总结,用心分享 | 架构师 MongoDB学习总结

文章目录 MongoDB基本使用Nosql简介什么是NoSQL为什么使用NoSQLRDBMS vs NoSQLNoSQLNoSQL的优缺点缺点 MongoDB基础什么是MongoDB存储结构主要特点 基本概念和传统数据库对比集合命令规范 文档key的命令规范注意事项 MongoDB的数据类型BSON支持的数据类型 MongoDB基本使用 Nos…

DT MongoDB Plug -in description

目录 DT MongoDB | Client Create MongoDB Client Connect By Url Get Collection DT MongoDB | Collection Insert One Insert Many Delete One Delete Many Replace One Update One Update Many Find Find One DT MongoDB | Document Create MongoDB Documen…

【算法与数据结构】顺序表

顺序表 数据结构 结构定义结构操作 顺序表&#xff1a;结构定义 一个数组&#xff0c;添加额外的几个属性&#xff1a;size, count等 size: 数组有多大 count: 数组中当前存储了多少元素 顺序表三部分&#xff1a; 一段连续的存储区&#xff1a;顺序表存储元素的地方整型…