码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • linux ld 链接器学习笔记


    ld链接器笔记

    1. 首先编写一段汇编代码

    这里的汇编语法时 AT&T语法,是gcc原生支持的语法,底层使用 gas(gnu assembler) 完成汇编,相较于 Intel x86语法, AT&T 语法要更加古老,因此大多数人更加偏向于使用 Intel 的语法. nasm 编译器支持x86语法.自从2.10版本,Intel语法可以通过使用.intel_syntax指令增加支持

    .global _start
        .text
    _start:
        mov $1,%eax # 将立即数1放到eax寄存器中
        mov $2,%ebx # 将立即数2放到 ebx 寄存器中
        add %ebx,%eax # 将 ebx 与 eax相加,结果放到 eax 中
    loop:
        jmp loop # 循环
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 使用 gcc 命令进行编译

    Makefile 文件内容:

    main.o: main.s
        gcc -m32 -c $< -o $@
    # -m32 编译为32位代码
    # -c 执行编译和汇编,但不执行链接
    # -o 指定输出文件名称
    # -E 执行预处理,但不执行编译,汇编和链接
    # -S 只执行编译,但不执行汇编和链接
    #  -shared 创建一个共享库,格式.so
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 使用 ld 执行链接

    main: main.o
        ld -m elf_i386 main.o
    # -m elf_i386 指定链接格式,这里指定为 elf 格式(linux中二进制格式)
    # -o 指定输出文件名称
    # ld 可以指定配置文件 map.lds,按照规格进行配置可以
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4. 使用 gdb 执行输出

    gdb main
    # 开启图形界面
    tui enable
    # 打开汇编窗口
    lay asm
    # 打开寄存器窗口
    lay reg
    # 开始执行程序
    starti
    # 步进执行程序
    si
    # 之后可以通过回车执行上一步执行的命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    汇编代码-栈学习

    栈的使用主要是 push 和pop 指令,其中 push 指令会将指定数据写入内存

    push %ebp # 将 ebp 寄存器中的值压入栈中
    push $0xa # 将 0xa 值压入栈中
    
    • 1
    • 2

    还有 pop 指令,从栈顶弹出一个值到指定寄存器中

    pop 
    
    • 1
    .global _start
        .text
    _start:
        push %ebp
        mov %esp,%ebp
    
        push $0xa
        push $0xb
        pop %eax
        push $4
        pop %eax
        pop %ebx
    loop:
        jmp loop
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    参考资料

    xv6操作系统实践

  • 相关阅读:
    java计算机毕业设计ssm+vue红联小区果蔬销售网站-水果购物商城
    算法总结:递归优化,二路归并,快速幂
    StringBuffer类 和StringBuilder类
    JavaWeb三大组件之Filter------Filter详细讲解
    CI868K01-eA 3BSE048845R2 106M1081-01
    php截取网址/参数作为的短网址的实现方案
    山东大学项目实训十——Android开发环境搭建
    LeetCode53. 最大子数组和
    Spring整合MyBatis和Junit(十一)
    【论文精度】Transformer--Attention Is All You Need
  • 原文地址:https://blog.csdn.net/qq_19922839/article/details/134564240
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号