码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • X86-64 汇编学习1


    前言

    熟悉一些关键字可以更方便看懂官方的手册:
    IA-32(Intel architecture -32): 指代因特尔32位处理器架构。
    X86-64:64位处理器架构
    compatibility(兼容模式):在64位下运行IA-32程序或者模式

    内存范围

    我们知道我们的32位程序寻址范围为2^32=4G内存即 0000 0000-FFFF FFFF。

    具体内存寻址如下图所示:

    在这里插入图片描述

    64位处理器寻址范围为2^64但是实际上指令集架构设计和处理器都没有完全实现这么大的范围。
    AMD在地址线实现了52根,但是实际往往只使用48位而已。因此64位系统往往实际只使用48位内存寻址范围,
    前16位用于预留扩展。
    在这里插入图片描述
    我们利用x64Dbg调试相关用户程序,你会发现所有的地址前16位都是0,即16进制的四个0。
    在这里插入图片描述

    寄存器

    这块建议参阅Intel手册卷1部分内容,这里贴出部分节选:
    在这里插入图片描述
    在这里插入图片描述

    通用寄存器32位下有8位,64位有16个。
    在这里插入图片描述
    在这里插入图片描述

    如果你需要访问特定大小的寄存器可以按照如下官方表格进行操作。比如 1字节R8可以使用R8B等
    在这里插入图片描述
    在这里插入图片描述

    微软文档关于64寄存器说明

    限制:

    (1) 所有32位寄存器的修改,会将对应的64位寄存器的前32位用0填充(8,16位的赋值不会有影响)。

    举例如下:
    在这里插入图片描述
    在这里插入图片描述

    (1) 所有高8位寄存器访问不能与新的寄存器同时访问(r8-r15等)
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    Win64 调用约定

    这可直接参阅官方文档:
    在这里插入图片描述
    调用约定文档

    举例环节:

    #include
    
    float subIntFloat(int i1, float i2, int i3, float i4) {
        printf("hello test %d %f %d %f \r\n", i1, i2, i3, i4);
        return i1 + i2 + i3 + i4;
    }
    
    int addNumber4(int i1,int i2,int i3,int i4) {
        printf("hello test %d %d %d %d \r\n",i1,i2,i3,i4);
        float fRet= subIntFloat(1,2.0,3,3.0);
        printf("subIntFloat fRet %f \r\n", fRet);
        return i1 + i2 + i3 + i4;
    }
    int main()
    {
      
       int ret= addNumber4(1, 2, 3, 4);
       printf("addNumber4 ret %d \r\n", ret);
    
       return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    我们首先关注addNumber4传参和结果返还。

    在这里插入图片描述
    在这里插入图片描述

    栈进行128位对齐

    在64位系统下很多指令要求内存进行128对齐,比如MOVAPS指令。
    因此很多函数在开头对RSP进行栈对齐(一般末尾补8h).

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    相对RIP进行寻址

    x86-64额外多出一个寻址方式,
    在x32我们想得到EIP的地址往往需要跳一个空函数得到,而在x86-64我们可以写出如下图汇编指令:
    在这里插入图片描述

    x32下相关操作是不被支持的:
    在这里插入图片描述

    参考

    wikipedia 64-bit computing 内存说明
    stackoverflow 中64-bit 内存讨论
    微软文档关于64寄存器说明
    intel 手册

  • 相关阅读:
    乘风破浪,遇见未来新能源汽车(Electric Vehicle)之特斯拉提车必须知道的十个流程
    提升用户留存率:如何集成直播实时美颜SDK来增强用户体验
    1024程序员节|JavaScript代码之美—代码优化,减少if-else冗余的技巧
    如何使用Semaphore和CompletableFuture搭配实现控制线程并发数量并等待所有线程执行完成之后在执行其它操作
    内江科技杂志内江科技杂志社内江科技编辑部2024年第13期目录
    【SpringBoot】SpringBoot项目如何接入Excel?
    执法记录仪如何防抖
    基于单片机的空气质量实时监测系统(论文+源码)
    《认知盈余》核心摘要——“人们实际上很喜欢创造并分享”: 参与是一种行为
    # Leetcode刷题day7|454.四数相加II, 383. 赎金信,15. 三数之和 ,18四数之和
  • 原文地址:https://blog.csdn.net/qfanmingyiq/article/details/126680899
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号