汇编基础笔记

文章详细介绍了汇编语言中的AT&T语法和Intel语法的区别,以及在x86架构下的C调用约定,如cdecl、stdcall和fastcall等。同时,讨论了x86-64指令架构中的寄存器使用,包括其功能和在函数调用中的作用。通过示例展示了参数如何通过栈和寄存器传递,并提供了函数调用的过程分析。
摘要由CSDN通过智能技术生成

汇编语法格式

在汇编中,一般有两种不同的语法,它们是AT&T语法和Intel语法。

AT&T语法是GNU汇编器(GAS)所采用的语法,主要应用于UNIX系统。AT&T语法的特点是:
操作数的顺序是源操作数在前,目的操作数在后,同时使用“%”来表示寄存器。例如:

movl $0x12345678, %eax  # 把常数0x12345678赋给EAX寄存器

Intel语法则是Intel的汇编器采用的语法,主要应用于Windows系统。Intel语法的特点是操作数的顺序是目的操作数在前,源操作数在后,同时使用“[]”来表示内存地址。例如:

mov eax, 0x12345678  ; 把常数0x12345678赋给EAX寄存器

调用约定

在x86架构下,常见的C调用约定有以下几种:

cdecl:参数从右往左入栈,由调用方负责恢复堆栈,返回值通常存在eax寄存器中,适用于可变参数的函数。

stdcall:参数从右往左入栈,由被调用方负责恢复堆栈,返回值通常存在eax寄存器中,适用于Win32 API。

fastcall:将前两个整型或指针类型的参数放在ecx和edx寄存器中,其他参数从右往左入栈,由被调用方负责恢复堆栈,返回值通常存在eax寄存器中,适用于微软Visual C++编译器。

cdecl64:参数从右往左入栈,由调用方负责恢复堆栈,返回值通常存在rax寄存器中,适用于x86-64架构。

System V ABI:参数从左往右依次放在寄存器和栈中,返回值通常存在eax/rax寄存器中,由被调用方负责恢复堆栈,适用于Linux、macOS等系统。

寄存器

x86-64 指令架构要求至少有 16 个 64Bit 的通用寄存器。

64位32位16位8位全称用途
%rax%eax%ax%al/%ahregister a extended存储函数的返回值(return value)
%rbx%ebx%bx%bl/%bhregister b extended没有约定
%rcx%ecx%cx%cl/%chregister c extended存储函数的第4个参数
%rdx%edx%dx%dl/dhregister d extended存储函数的第3个参数
%rsi%esi%si-register source index存储函数的第2个参数
%rdi%edi%di-register destination index存储函数的第1个参数
%r8%r8d%r8w%r8bregister 8存储函数的第5个参数
%r9%r9d%r9w%r9bregister 9存储函数的第6个参数
%r10-%r11%r10d-%r11d%r10w-%r11w%r10b-%r11bregister 10 ~ register 11/
%r12-%r15%r12d-%r15d%r12w-%r15w%r12b-%r15bregister 12 ~ register 15/
%rbp%ebp%bp-register base pointer存储栈底指针
%rsp%esp%sp-register stack pointer存储栈顶地址
ripeip永远存储下一条指令的地址
CS代码段寄存器
SS栈段寄存器
DS数据段寄存器
ES附加(数据)段寄存器
FS数据段寄存器
GS数据段寄存器

提示:
ax分为ah和al,高低位之分,可以独立使用。
为了保证兼容性,四个寄存器都可以分为两个独立的8位寄存器使用;
ax可以分为ah和al
bx可以分为bh和bl
cx可以分为ch和cl
dx可以分为dh和dl

函数调用分析

参数既可以放在栈中传递,也可以直接使用寄存器传递。

调用以call开始,以ret结束,因此可以定位call和ret来判别函数调用。

下面举一个例子说明:

说明:设a=3、b=1,计算a-b,a、b为字型数据;
参数:进入子程序时,栈顶存放段基地址IP,后面依次存放参数a和b;
结果:a-b=2

# 调用方将参数b=1放入ax寄存器中
mov ax,1
# 调用方将ax入栈
push ax
# 调用方将参数a=3放入ax寄存器中
mov ax,3
# 调用方将ax入栈
push ax
# 跳转到子程序
call child


# 被调用方child,将调用方的段基地址IP入栈,所以被调用方帮调用方入栈个参数
push bp
# 被调用方将自己的段基地址设为当前栈顶
mov bp,sp
# 因为在push参数a和b后,子程序又push了一个bp,所以bp+2是段基地址,bp+4是参数a
mov ax, [bp+4] 
# bp+6参数b,计算a-b,并将结果存在寄存器ax上
sub ax, [bp+6] 
# 弹出调用方的bp值,设定BP:IP寄存器,并回退两个参数的位置4
ret 4

常用指令

# 入栈,保存上一个栈帧的rbp到栈中
push    rbp

# 更改rsp指针为rbp
mov     rbp, rsp

# rsp的地址减去20h,为存储数据做准备
sub     rsp, 20h

# 保存上一个栈帧的edi值
mov     [rbp+argc], edi

# 保存上一个栈帧的rsi值
mov     [rbp+argv], rsi

# 将当前栈帧的入参aHello字符串的地址装载到rsi寄存器中
lea     rsi, aHello 

# 将cout对象地址加载到rdi中
lea     rdi, _ZSt4cout@@GLIBCXX_3_4

# 跳转到相应函数
call    __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc

内存段

内存本身没有段,但是可以通过规定寄存器来人为给内存分段,也就是说,使用不同段寄存器访问不通的内存段。

程序被划分为指令、数据和栈三部分。指令就是指令,数据就是数据,栈就是程序的执行进度。

# 指令段内存地址
CS:IP

# 数据段内存地址
DS、[adrress]

# 栈段读写地址
SS:SP

参考资料

AMD64 Architecture Programmer’s Manual Volume 1: Application Programming

Computer Systems: A Programmer’s Perspective, 3/E (CS:APP3e)

x86-64 汇编:寄存器和过程调用约定

聊一聊基础的CPU寄存器~

汇编的学习

汇编语言–x86汇编指令集大全

c语言内部(汇编代码分析)函数调用过程探究

Linux X86 程序启动 – main函数是如何被执行的?

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多弗朗强哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值