X86-64汇编,寄存器,栈帧杂记

正文

Intel汇编与At&t汇编区别

AT&T的立即数前面有修饰符号$. e.g. $4
Intel的立即数不需要修饰 e.g. 4

AT&T寄存器名称前有修饰符号% e.g. movl $4, %eax
Intel寄存器名称不需要修饰 e.g. mov eax, 4

AT&T的源操作数在左边,目的操作数在右边 命令表示为 opt src to dst
e.g. movl $4, %eax
Intel的目的操作数在左边,源操作数在右边 命令表示为 opt dst from src
e.g. mov eax, 4

AT&T的命令字有数据长度修饰符号
e.g. movl %ebx, 4
Intel的命令字没有修饰符号,而是提供了单独的命令字或在操作数中给定数据长度
e.g. mov eax, dword ptr val_to_eax

AT&T跳转时,将段和偏移当作不同的操作数
e.g. ljmp $segment, $offset
Intel语法将段和偏移当成一个操作数
e.g. jmp segment:offset

1.mov

mov的原型

mov dest source

mov通过[]访问内存与地址, []和c一样表示,取eax地址对应的空间

mov [eax], rbx

对于一些八位的内存空间地址的大小,可以使用类似QWORD PTR的标识符标志出来

mov QWORD PTR [eax], rbx

如果要使用段寄存器,在括号外使用:标志段偏移,如下,表示的是将rbx的值放到[fs + eax]对应空间

mov QWORD PTR fs:[eax], rbx

2.intel汇编的参数寄存器传递

参数传递会使用六个寄存器:
%rdi
%rsi
%rdx
%rcx
%r8
%r9

返回值寄存器: %rax

3.段寄存器

cs: 代码段寄存器
ds: 数据段寄存器
ss: 堆栈段寄存器
es: 扩展段寄存器
fs: 标志段寄存器
gs: 全局段寄存器

4.test %rax %rax

用来判断 %rax是否为0,test指令本来是让后面两个数做AND操作,然后根据结果去设置ZF位的,如果%rax的值为0,那么zs这个的标志就为1,

5.函数栈帧调用过程

其中关于%esp的值,指向的是当前正在使用的地址而不是下一个未使用的地址,但是注意到栈是从顶往下的,%esp指向的是使用的内存空间的低地址

ref

https://blog.csdn.net/u013737447/article/details/49154509
x86 寄存器: https://www.cnblogs.com/tongyishu/p/11679829.html
第4部分-Linux x86 64位汇编Intel汇编语法三
x86通用寄存器
x86栈帧原理
x86-64 官方说明

posted @   woder  阅读(661)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
历史上的今天:
2020-01-20 nginx https配置模板
2020-01-20 openssl 、nginx生成配置自签名证书
2020-01-20 https、公钥,私钥,数字证书
2020-01-20 腾讯云证书申请
点击右上角即可分享
微信分享提示